[前][次][番号順一覧][スレッド一覧]

ruby-changes:20173

From: nobu <ko1@a...>
Date: Fri, 24 Jun 2011 17:06:56 +0900 (JST)
Subject: [ruby-changes:20173] nobu:r32221 (trunk): * process.c (proc_daemon): should not start timer thread

nobu	2011-06-24 17:06:38 +0900 (Fri, 24 Jun 2011)

  New Revision: 32221

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32221

  Log:
    * process.c (proc_daemon): should not start timer thread
      twice.  fixed Bug#4920.

  Modified files:
    trunk/ChangeLog
    trunk/process.c
    trunk/test/ruby/test_process.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32220)
+++ ChangeLog	(revision 32221)
@@ -1,3 +1,8 @@
+Fri Jun 24 17:06:33 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (proc_daemon): should not start timer thread
+	  twice.  fixed Bug#4920.
+
 Fri Jun 24 15:54:14 2011  Hiroshi Nakamura  <nahi@r...>
 
 	* ext/openssl/ossl_ssl.c (ossl_ssl_shutdown): Try to shutdown SSL
Index: process.c
===================================================================
--- process.c	(revision 32220)
+++ process.c	(revision 32221)
@@ -4806,10 +4806,7 @@
 #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 @@
     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 @@
 	    (void)close (n);
     }
     return err;
+#endif
 }
-#endif
 #else
 #define proc_daemon rb_f_notimplement
 #endif
Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb	(revision 32220)
+++ test/ruby/test_process.rb	(revision 32221)
@@ -1268,4 +1268,58 @@
   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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]