From 706335aa0beaf1477acc41e15543e412c760474e Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 24 Jun 2011 08:06:38 +0000 Subject: [PATCH] * process.c (proc_daemon): should not start timer thread twice. fixed Bug#4920. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32221 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 ++++ process.c | 18 ++++++------- test/ruby/test_process.rb | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index e1e6b2cb94..bdf2faa01f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Jun 24 17:06:33 2011 Nobuyoshi Nakada + + * process.c (proc_daemon): should not start timer thread + twice. fixed Bug#4920. + Fri Jun 24 15:54:14 2011 Hiroshi Nakamura * ext/openssl/ossl_ssl.c (ossl_ssl_shutdown): Try to shutdown SSL diff --git a/process.c b/process.c index 4595ccf7b7..5170bec207 100644 --- a/process.c +++ b/process.c @@ -4806,10 +4806,7 @@ proc_setmaxgroups(VALUE obj, VALUE val) #endif #if defined(HAVE_DAEMON) || (defined(HAVE_FORK) && defined(HAVE_SETSID)) -#ifndef HAVE_DAEMON static int rb_daemon(int nochdir, int noclose); -#define daemon(nochdir, noclose) rb_daemon((nochdir), (noclose)) -#endif /* * call-seq: @@ -4835,18 +4832,21 @@ proc_daemon(int argc, VALUE *argv) rb_scan_args(argc, argv, "02", &nochdir, &noclose); prefork(); - before_fork(); - n = daemon(RTEST(nochdir), RTEST(noclose)); - after_fork(); + n = rb_daemon(RTEST(nochdir), RTEST(noclose)); if (n < 0) rb_sys_fail("daemon"); return INT2FIX(n); } -#ifndef HAVE_DAEMON static int rb_daemon(int nochdir, int noclose) { - int n, err = 0; + int err = 0; +#ifdef HAVE_DAEMON + before_fork(); + err = daemon(nochdir, noclose); + after_fork(); +#else + int n; switch (rb_fork(0, 0, 0, Qnil)) { case -1: @@ -4880,8 +4880,8 @@ rb_daemon(int nochdir, int noclose) (void)close (n); } return err; -} #endif +} #else #define proc_daemon rb_f_notimplement #endif diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 4df883fb53..aad043874e 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1268,4 +1268,58 @@ class TestProcess < Test::Unit::TestCase ensure Process.kill(:KILL, pid) if (pid != 0) rescue false end + + if Process.respond_to?(:daemon) + def test_daemon_default + data = IO.popen("-", "r+") do |f| + break f.read if f + Process.daemon + puts "ng" + end + assert_equal("", data) + end + + def test_daemon_noclose + data = IO.popen("-", "r+") do |f| + break f.read if f + Process.daemon(false, true) + puts "ok", Dir.pwd + end + assert_equal("ok\n/\n", data) + end + + def test_daemon_nochdir_noclose + data = IO.popen("-", "r+") do |f| + break f.read if f + Process.daemon(true, true) + puts "ok", Dir.pwd + end + assert_equal("ok\n#{Dir.pwd}\n", data) + end + + def test_daemon_readwrite + data = IO.popen("-", "r+") do |f| + if f + f.puts "ok?" + break f.read + end + Process.daemon(true, true) + puts STDIN.gets + end + assert_equal("ok?\n", data) + end + + if File.directory?("/proc/self/task") + def test_daemon_no_threads + pid, data = IO.popen("-", "r+") do |f| + break f.pid, f.readlines if f + Process.daemon(true, true) + puts Dir.entries("/proc/self/task") - %W[. ..] + end + bug4920 = '[ruby-dev:43873]' + assert_equal(2, data.size, bug4920) + assert_not_include(data.map(&:to_i), pid) + end + end + end end