[前][次][番号順一覧][スレッド一覧]

ruby-changes:5276

From: shyouhei <ko1@a...>
Date: Tue, 3 Jun 2008 15:09:31 +0900 (JST)
Subject: [ruby-changes:5276] Ruby:r16775 (ruby_1_8_5): merge revision(s) 13479:13481:

shyouhei	2008-06-03 15:09:11 +0900 (Tue, 03 Jun 2008)

  New Revision: 16775

  Modified files:
    branches/ruby_1_8_5/ChangeLog
    branches/ruby_1_8_5/process.c
    branches/ruby_1_8_5/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_5/process.c?r1=16775&r2=16774&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/version.h?r1=16775&r2=16774&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_5/ChangeLog?r1=16775&r2=16774&diff_format=u

Index: ruby_1_8_5/process.c
===================================================================
--- ruby_1_8_5/process.c	(revision 16774)
+++ ruby_1_8_5/process.c	(revision 16775)
@@ -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.
  *
@@ -1069,8 +1074,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;
@@ -1189,6 +1194,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, ...])
@@ -1221,8 +1273,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");
     }
 
@@ -1235,15 +1289,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 */
 }
@@ -1500,7 +1547,7 @@
 #else
     volatile VALUE prog = 0;
     int pid;
-    int i;
+    struct rb_exec_arg earg;
     RETSIGTYPE (*chfunc)(int);
 
     fflush(stdout);
@@ -1517,25 +1564,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);
-    }
-    for (i = 0; i < argc; i++) {
-	SafeStringValue(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_5/ChangeLog
===================================================================
--- ruby_1_8_5/ChangeLog	(revision 16774)
+++ ruby_1_8_5/ChangeLog	(revision 16775)
@@ -1,3 +1,15 @@
+Tue Jun  3 15:05:48 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_5/version.h
===================================================================
--- ruby_1_8_5/version.h	(revision 16774)
+++ ruby_1_8_5/version.h	(revision 16775)
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.5"
-#define RUBY_RELEASE_DATE "2008-05-18"
+#define RUBY_RELEASE_DATE "2008-06-03"
 #define RUBY_VERSION_CODE 185
-#define RUBY_RELEASE_CODE 20080518
-#define RUBY_PATCHLEVEL 120
+#define RUBY_RELEASE_CODE 20080603
+#define RUBY_PATCHLEVEL 122
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 5
 #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/

[前][次][番号順一覧][スレッド一覧]