summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-12 19:42:01 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-12 19:42:01 +0000
commitafa512d9e18d39b2e727a0ee1a792f21505779bb (patch)
tree99357c4ac668f07fe9c316334ed1b9bf0e0ca65e /process.c
parent5311e0af8e4d5e1398ffb2d090d1a0d377a28cad (diff)
Process.detach: avoid singleton class creation
* process.c (Init_process): subclass Thread as Process::Waiter (rb_detach_process): use Process::Waiter instead of singleton class * test/ruby/test_process.rb (test_process_detach): new test * inits.c (rb_call_inits): call Init_Thread before Init_process to ensure Process::Waiter may be a subclass of Thread Thanks to headius for reporting [Bug #10231] Thanks to nobu for review of my initial patch. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47561 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/process.c b/process.c
index 8bb52f7b77..590a21fa45 100644
--- a/process.c
+++ b/process.c
@@ -1007,6 +1007,8 @@ proc_waitall(void)
return result;
}
+static VALUE rb_cWaiter;
+
static inline ID
id_pid(void)
{
@@ -1038,7 +1040,7 @@ rb_detach_process(rb_pid_t pid)
{
VALUE watcher = rb_thread_create(detach_process_watcher, (void*)(VALUE)pid);
rb_thread_local_aset(watcher, id_pid(), PIDT2NUM(pid));
- rb_define_singleton_method(watcher, "pid", detach_process_pid, 0);
+ RBASIC_SET_CLASS(watcher, rb_cWaiter);
return watcher;
}
@@ -7516,6 +7518,11 @@ Init_process(void)
rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0);
rb_define_module_function(rb_mProcess, "detach", proc_detach, 1);
+ rb_cWaiter = rb_define_class_under(rb_mProcess, "Waiter", rb_cThread);
+ rb_undef_alloc_func(rb_cWaiter);
+ rb_undef_method(CLASS_OF(rb_cWaiter), "new");
+ rb_define_method(rb_cWaiter, "pid", detach_process_pid, 0);
+
rb_cProcessStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject);
rb_undef_method(CLASS_OF(rb_cProcessStatus), "new");