summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--process.c18
-rw-r--r--test/ruby/test_process.rb54
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 <nobu@ruby-lang.org>
+
+ * process.c (proc_daemon): should not start timer thread
+ twice. fixed Bug#4920.
+
Fri Jun 24 15:54:14 2011 Hiroshi Nakamura <nahi@ruby-lang.org>
* 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