summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-18 06:59:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-18 06:59:54 +0000
commit7a9fc6a048e97cd8ed37f20d6fc01a3d9b8be13a (patch)
tree5ee4de1ec435e4d2d12521a2629ed7ace9bb0bac
parent1ddda54209a2fbf7613bfd451c1163843b9eb120 (diff)
downloadruby-7a9fc6a048e97cd8ed37f20d6fc01a3d9b8be13a.tar.gz
ruby-7a9fc6a048e97cd8ed37f20d6fc01a3d9b8be13a.tar.xz
ruby-7a9fc6a048e97cd8ed37f20d6fc01a3d9b8be13a.zip
* process.c (detach_process_watcher): should not pass the pointer
to an auto variable to the thread to be created. pointed and fix by KUBO Takehiro <kubo at jiubao.org> [ruby-dev:30618] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@13101 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--process.c16
2 files changed, 13 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 973c2b0c2..729ef4974 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Aug 18 15:59:52 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (detach_process_watcher): should not pass the pointer
+ to an auto variable to the thread to be created. pointed and
+ fix by KUBO Takehiro <kubo at jiubao.org> [ruby-dev:30618]
+
Sat Aug 18 15:52:50 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* insnhelper.ci (vm_send_optimize): use MEMMOVE to shift values inside
diff --git a/process.c b/process.c
index 97bbda935..fe954601b 100644
--- a/process.c
+++ b/process.c
@@ -860,22 +860,21 @@ proc_waitall(void)
}
static VALUE
-detach_process_watcher(int *pid_p)
+detach_process_watcher(void *arg)
{
- rb_pid_t cpid;
+ rb_pid_t cpid, pid = (rb_pid_t)arg;
int status;
- for (;;) {
- cpid = rb_waitpid(*pid_p, &status, WNOHANG);
- if (cpid != 0) return rb_last_status_get();
- rb_thread_sleep(1);
+ while ((cpid = rb_waitpid(pid, &status, 0)) == 0) {
+ /* wait while alive */
}
+ return rb_last_status_get();
}
VALUE
rb_detach_process(rb_pid_t pid)
{
- return rb_thread_create(detach_process_watcher, (void*)&pid);
+ return rb_thread_create(detach_process_watcher, (void*)pid);
}
@@ -891,8 +890,7 @@ rb_detach_process(rb_pid_t pid)
* separate Ruby thread whose sole job is to reap the status of the
* process _pid_ when it terminates. Use <code>detach</code>
* only when you do not intent to explicitly wait for the child to
- * terminate. <code>detach</code> only checks the status
- * periodically (currently once each second).
+ * terminate.
*
* The waiting thread returns the exit status of the detached process
* when it terminates, so you can use <code>Thread#join</code> to