diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | process.c | 26 | ||||
-rw-r--r-- | test/ruby/test_process.rb | 21 | ||||
-rw-r--r-- | version.h | 6 |
4 files changed, 49 insertions, 19 deletions
@@ -1,3 +1,18 @@ +Sat Oct 5 00:16:33 2013 NARUSE, Yui <naruse@ruby-lang.org> + + * process.c (rb_daemon): daemon(3) is implemented with fork(2). + Therefore it needs rb_thread_atfork(). (and revert r41903) + +Sat Oct 5 00:16:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * process.c (fork_daemon): kill the other threads all and abandon the + kept mutexes. + +Sat Oct 5 00:16:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * process.c (fork_daemon): kill the other threads all and abandon the + kept mutexes. + Tue Oct 1 00:28:40 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com> * tool/make-snapshot: Fix order of priority for option parameter. @@ -5667,29 +5667,23 @@ rb_daemon(int nochdir, int noclose) before_fork(); err = daemon(nochdir, noclose); after_fork(); + rb_thread_atfork(); #else int n; - switch (rb_fork_ruby(NULL)) { - case -1: - rb_sys_fail("daemon"); - case 0: - break; - default: - _exit(EXIT_SUCCESS); +#define fork_daemon() \ + switch (rb_fork_ruby(NULL)) { \ + case -1: return -1; \ + case 0: rb_thread_atfork(); break; \ + default: _exit(EXIT_SUCCESS); \ } - proc_setsid(); + fork_daemon(); + + if (setsid() < 0) return -1; /* must not be process-leader */ - switch (rb_fork_ruby(NULL)) { - case -1: - return -1; - case 0: - break; - default: - _exit(EXIT_SUCCESS); - } + fork_daemon(); if (!nochdir) err = chdir("/"); diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index a70dca692e..c760e8ebda 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1471,6 +1471,15 @@ class TestProcess < Test::Unit::TestCase assert_equal("ok?\n", data) end + def test_daemon_pid + cpid, dpid = IO.popen("-", "r+") do |f| + break f.pid, Integer(f.read) if f + Process.daemon(false, true) + puts $$ + end + assert_not_equal(cpid, dpid) + end + if File.directory?("/proc/self/task") && /netbsd[a-z]*[1-6]/ !~ RUBY_PLATFORM def test_daemon_no_threads pid, data = IO.popen("-", "r+") do |f| @@ -1482,6 +1491,18 @@ class TestProcess < Test::Unit::TestCase assert_equal(2, data.size, bug4920) assert_not_include(data.map(&:to_i), pid) end + else # darwin + def test_daemon_no_threads + data = Timeout.timeout(3) do + IO.popen("-") do |f| + break f.readlines.map(&:chomp) if f + th = Thread.start {sleep 3} + Process.daemon(true, true) + puts Thread.list.size, th.status.inspect + end + end + assert_equal(["1", "false"], data) + end end end @@ -1,10 +1,10 @@ #define RUBY_VERSION "2.0.0" -#define RUBY_RELEASE_DATE "2013-10-01" -#define RUBY_PATCHLEVEL 323 +#define RUBY_RELEASE_DATE "2013-10-05" +#define RUBY_PATCHLEVEL 324 #define RUBY_RELEASE_YEAR 2013 #define RUBY_RELEASE_MONTH 10 -#define RUBY_RELEASE_DAY 1 +#define RUBY_RELEASE_DAY 5 #include "ruby/version.h" |