ruby-changes:11148
From: yugui <ko1@a...>
Date: Wed, 4 Mar 2009 18:20:20 +0900 (JST)
Subject: [ruby-changes:11148] Ruby:r22752 (ruby_1_9_1): merges r22688 from trunk into ruby_1_9_1.
yugui 2009-03-04 18:20:07 +0900 (Wed, 04 Mar 2009) New Revision: 22752 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22752 Log: merges r22688 from trunk into ruby_1_9_1. -- * process.c (rb_waitpid): use wait_each() on no waitpid platforms. [ruby-dev:38054] Modified files: branches/ruby_1_9_1/ChangeLog branches/ruby_1_9_1/process.c Index: ruby_1_9_1/ChangeLog =================================================================== --- ruby_1_9_1/ChangeLog (revision 22751) +++ ruby_1_9_1/ChangeLog (revision 22752) @@ -1,3 +1,8 @@ +Sun Mar 1 16:15:31 2009 Nobuyoshi Nakada <nobu@r...> + + * process.c (rb_waitpid): use wait_each() on no waitpid platforms. + [ruby-dev:38054] + Sun Mar 1 16:01:01 2009 Nobuyoshi Nakada <nobu@r...> * process.c (proc_daemon): stops and restarts timer thread because Index: ruby_1_9_1/process.c =================================================================== --- ruby_1_9_1/process.c (revision 22751) +++ ruby_1_9_1/process.c (revision 22752) @@ -590,6 +590,29 @@ #if !defined(HAVE_WAITPID) && !defined(HAVE_WAIT4) #define NO_WAITPID static st_table *pid_tbl; + +struct wait_data { + rb_pid_t pid; + int status; +}; + +static int +wait_each(rb_pid_t pid, int status, struct wait_data *data) +{ + if (data->status != -1) return ST_STOP; + + data->pid = pid; + data->status = status; + return ST_DELETE; +} + +static int +waitall_each(rb_pid_t pid, int status, VALUE ary) +{ + rb_last_status_set(status, pid); + rb_ary_push(ary, rb_assoc_new(PIDT2NUM(pid), rb_last_status_get())); + return ST_DELETE; +} #else struct waitpid_arg { rb_pid_t pid; @@ -624,7 +647,7 @@ #ifndef NO_WAITPID struct waitpid_arg arg; -retry: + retry: arg.pid = pid; arg.st = st; arg.flags = flags; @@ -635,13 +658,25 @@ RUBY_VM_CHECK_INTS(); goto retry; } - return -1; + return (rb_pid_t)-1; } #else /* NO_WAITPID */ - if (pid_tbl && st_lookup(pid_tbl, pid, (st_data_t *)st)) { - rb_last_status_set(*st, pid); - st_delete(pid_tbl, (st_data_t*)&pid, NULL); - return pid; + if (pid_tbl) { + st_data_t status, piddata = (st_data_t)pid; + if (pid == (rb_pid_t)-1) { + struct wait_data data; + data.pid = (rb_pid_t)-1; + data.status = -1; + st_foreach(pid_tbl, wait_each, (st_data_t)&data); + if (data.status != -1) { + rb_last_status_set(data.status, data.pid); + return data.pid; + } + } + else if (st_delete(pid_tbl, &piddata, &status)) { + rb_last_status_set(*st = (int)status, pid); + return pid; + } } if (flags) { @@ -656,13 +691,13 @@ rb_thread_schedule(); continue; } - return -1; + return (rb_pid_t)-1; } - if (result == pid) { + if (result == pid || pid == (rb_pid_t)-1) { break; } if (!pid_tbl) - pid_tbl = st_init_numtable(); + pid_tbl = st_init_numtable(); st_insert(pid_tbl, pid, (st_data_t)st); if (!rb_thread_alone()) rb_thread_schedule(); } @@ -673,32 +708,7 @@ return result; } -#ifdef NO_WAITPID -struct wait_data { - rb_pid_t pid; - int status; -}; -static int -wait_each(rb_pid_t pid, int status, struct wait_data *data) -{ - if (data->status != -1) return ST_STOP; - - data->pid = pid; - data->status = status; - return ST_DELETE; -} - -static int -waitall_each(rb_pid_t pid, int status, VALUE ary) -{ - rb_last_status_set(status, pid); - rb_ary_push(ary, rb_assoc_new(PIDT2NUM(pid), rb_last_status_get())); - return ST_DELETE; -} -#endif - - /* [MG]:FIXME: I wasn't sure how this should be done, since ::wait() has historically been documented as if it didn't take any arguments despite the fact that it's just an alias for ::waitpid(). The way I -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/