ruby-changes:5281
From: shyouhei <ko1@a...>
Date: Tue, 3 Jun 2008 15:27:38 +0900 (JST)
Subject: [ruby-changes:5281] Ruby:r16779 (ruby_1_8_6): merge revision(s) 13479:13481:
shyouhei 2008-06-03 15:26:22 +0900 (Tue, 03 Jun 2008) New Revision: 16779 Modified files: branches/ruby_1_8_6/ChangeLog branches/ruby_1_8_6/process.c branches/ruby_1_8_6/version.h Log: merge revision(s) 13479:13481: * process.c (struct rb_exec_arg): proc should be a VALUE. * process.c (rb_f_exec): suppress a warning. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=16779&r2=16778&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=16779&r2=16778&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/process.c?r1=16779&r2=16778&diff_format=u Index: ruby_1_8_6/process.c =================================================================== --- ruby_1_8_6/process.c (revision 16778) +++ ruby_1_8_6/process.c (revision 16779) @@ -851,19 +851,19 @@ detach_process_watcher(arg) void *arg; { - int pid = (int)arg, status; + int pid = (int)(VALUE)arg, status; while (rb_waitpid(pid, &status, WNOHANG) == 0) { rb_thread_sleep(1); } - return Qnil; + return rb_last_status; } VALUE rb_detach_process(pid) int pid; { - return rb_thread_create(detach_process_watcher, (void*)pid); + return rb_thread_create(detach_process_watcher, (void*)(VALUE)pid); } @@ -882,6 +882,11 @@ * terminate. <code>detach</code> only checks the status * periodically (currently once each second). * + * The waiting thread returns the exit status of the detached process + * when it terminates, so you can use <code>Thread#join</code> to + * know the result. If specified _pid_ is not a valid child process + * ID, the thread returns +nil+ immediately. + * * In this first example, we don't reap the first child process, so * it appears as a zombie in the process status display. * @@ -1070,8 +1075,8 @@ a = argv = ALLOCA_N(char*, (s-str)/2+2); ss = ALLOCA_N(char, s-str+1); strcpy(ss, str); - if (*a++ = strtok(ss, " \t")) { - while (t = strtok(NULL, " \t")) { + if ((*a++ = strtok(ss, " \t")) != 0) { + while ((t = strtok(NULL, " \t")) != 0) { *a++ = t; } *a = NULL; @@ -1190,6 +1195,53 @@ #endif #endif +struct rb_exec_arg { + int argc; + VALUE *argv; + VALUE prog; +}; + +static void +proc_prepare_args(e, argc, argv, prog) + struct rb_exec_arg *e; + int argc; + VALUE *argv; + VALUE prog; +{ + int i; + + MEMZERO(e, struct rb_exec_arg, 1); + if (prog) { + SafeStringValue(prog); + StringValueCStr(prog); + } + for (i = 0; i < argc; i++) { + SafeStringValue(argv[i]); + StringValueCStr(argv[i]); + } + security(RSTRING(prog ? prog : argv[0])->ptr); + e->prog = prog; + e->argc = argc; + e->argv = argv; +} + +static VALUE +proc_exec_args(earg) + VALUE earg; +{ + struct rb_exec_arg *e = (struct rb_exec_arg *)earg; + int argc = e->argc; + VALUE *argv = e->argv; + VALUE prog = e->prog; + + if (argc == 1 && prog == 0) { + return (VALUE)rb_proc_exec(RSTRING(argv[0])->ptr); + } + else { + return (VALUE)proc_exec_n(argc, argv, prog); + } +} + /* * call-seq: * exec(command [, arg, ...]) @@ -1222,8 +1274,10 @@ { VALUE prog = 0; VALUE tmp; + struct rb_exec_arg earg; if (argc == 0) { + rb_last_status = Qnil; rb_raise(rb_eArgError, "wrong number of arguments"); } @@ -1236,15 +1290,8 @@ argv[0] = RARRAY(tmp)->ptr[1]; SafeStringValue(prog); } - if (argc == 1 && prog == 0) { - VALUE cmd = argv[0]; - - SafeStringValue(cmd); - rb_proc_exec(RSTRING(cmd)->ptr); - } - else { - proc_exec_n(argc, argv, prog); - } + proc_prepare_args(&earg, argc, argv, prog); + proc_exec_args((VALUE)&earg); rb_sys_fail(RSTRING(argv[0])->ptr); return Qnil; /* dummy */ } @@ -1501,7 +1548,7 @@ #else volatile VALUE prog = 0; int pid; - int i; + struct rb_exec_arg earg; RETSIGTYPE (*chfunc)(int); fflush(stdout); @@ -1518,27 +1565,15 @@ prog = RARRAY(argv[0])->ptr[0]; argv[0] = RARRAY(argv[0])->ptr[1]; } + proc_prepare_args(&earg, argc, argv, prog); - if (prog) { - SafeStringValue(prog); - StringValueCStr(prog); - } - for (i = 0; i < argc; i++) { - SafeStringValue(argv[i]); - StringValueCStr(argv[i]); - } - security(RSTRING(prog ? prog : argv[0])->ptr); chfunc = signal(SIGCHLD, SIG_DFL); retry: pid = fork(); if (pid == 0) { /* child process */ - if (argc == 1 && prog == 0) { - rb_proc_exec(RSTRING(argv[0])->ptr); - } - else { - proc_exec_n(argc, argv, prog); - } + rb_thread_atfork(); + rb_protect(proc_exec_args, (VALUE)&earg, NULL); _exit(127); } if (pid < 0) { Index: ruby_1_8_6/ChangeLog =================================================================== --- ruby_1_8_6/ChangeLog (revision 16778) +++ ruby_1_8_6/ChangeLog (revision 16779) @@ -1,3 +1,15 @@ +Tue Jun 3 15:22:47 2008 Nobuyoshi Nakada <nobu@r...> + + * process.c (struct rb_exec_arg): proc should be a VALUE. + + * process.c (rb_f_exec): suppress a warning. + + * process.c (rb_detach_process): cast for the platforms where size of + pointer differs from size of int. + + * process.c (rb_f_exec, rb_f_system): should not exceptions after + fork. [ruby-core:08262] + Wed May 21 01:32:56 2008 GOTOU Yuuzou <gotoyuzo@n...> * lib/webrick/httpservlet/filehandler.rb: should normalize path Index: ruby_1_8_6/version.h =================================================================== --- ruby_1_8_6/version.h (revision 16778) +++ ruby_1_8_6/version.h (revision 16779) @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.8.6" -#define RUBY_RELEASE_DATE "2008-05-18" +#define RUBY_RELEASE_DATE "2008-06-03" #define RUBY_VERSION_CODE 186 -#define RUBY_RELEASE_CODE 20080518 -#define RUBY_PATCHLEVEL 119 +#define RUBY_RELEASE_CODE 20080603 +#define RUBY_PATCHLEVEL 121 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 6 #define RUBY_RELEASE_YEAR 2008 -#define RUBY_RELEASE_MONTH 5 -#define RUBY_RELEASE_DAY 21 +#define RUBY_RELEASE_MONTH 6 +#define RUBY_RELEASE_DAY 3 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/