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

ruby-changes:9360

From: yugui <ko1@a...>
Date: Sun, 21 Dec 2008 14:27:28 +0900 (JST)
Subject: [ruby-changes:9360] Ruby:r20897 (ruby_1_9_1): merges r20528 from trunk into ruby_1_9_1.

yugui	2008-12-21 14:27:06 +0900 (Sun, 21 Dec 2008)

  New Revision: 20897

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20897

  Log:
    merges r20528 from trunk into ruby_1_9_1.
    * win32/win32.c (rb_w32_read): ERROR_BROKEN_PIPE is not a real error
      at this point.
    * io.c (pipe_open): use rb_w32_spawn() instead of rb_w32_pipe_exec()
      to use our own redirection scheme.

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/io.c
    branches/ruby_1_9_1/win32/win32.c

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 20896)
+++ ruby_1_9_1/ChangeLog	(revision 20897)
@@ -1,3 +1,11 @@
+Fri Dec  5 01:37:02 2008  NAKAMURA Usaku  <usa@r...>
+
+	* win32/win32.c (rb_w32_read): ERROR_BROKEN_PIPE is not a real error
+	  at this point.
+
+	* io.c (pipe_open): use rb_w32_spawn() instead of rb_w32_pipe_exec()
+	  to use our own redirection scheme.
+
 Sat Dec 20 10:59:16 2008  Yuki Sonoda (Yugui)  <yugui@y...>
 
 	* lib/irb/locale.rb (IRB::Locale#initialize)
Index: ruby_1_9_1/io.c
===================================================================
--- ruby_1_9_1/io.c	(revision 20896)
+++ ruby_1_9_1/io.c	(revision 20897)
@@ -4450,6 +4450,7 @@
     const char *exename = NULL;
     volatile VALUE cmdbuf;
     struct rb_exec_arg sarg;
+    int pair[2], write_pair[2];
 #endif
     FILE *fp = 0;
     int fd = -1;
@@ -4574,11 +4575,42 @@
 	cmd = rb_w32_join_argv(RSTRING_PTR(cmdbuf), args);
 	rb_str_resize(argbuf, 0);
     }
+    switch (fmode & (FMODE_READABLE|FMODE_WRITABLE)) {
+      case FMODE_READABLE|FMODE_WRITABLE:
+        if (rb_pipe(write_pair) < 0)
+            rb_sys_fail(cmd);
+        if (rb_pipe(pair) < 0) {
+            int e = errno;
+            close(write_pair[0]);
+            close(write_pair[1]);
+            errno = e;
+            rb_sys_fail(cmd);
+        }
+        if (eargp) {
+            rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(write_pair[0]));
+            rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(pair[1]));
+        }
+	break;
+      case FMODE_READABLE:
+        if (rb_pipe(pair) < 0)
+            rb_sys_fail(cmd);
+        if (eargp)
+            rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(pair[1]));
+	break;
+      case FMODE_WRITABLE:
+        if (rb_pipe(pair) < 0)
+            rb_sys_fail(cmd);
+        if (eargp)
+            rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(pair[0]));
+	break;
+      default:
+        rb_sys_fail(cmd);
+    }
     if (eargp) {
 	rb_exec_arg_fixup(eargp);
 	rb_run_exec_options(eargp, &sarg);
     }
-    while ((pid = rb_w32_pipe_exec(cmd, exename, openmode, &fd, &write_fd)) == -1) {
+    while ((pid = rb_w32_spawn(P_NOWAIT, cmd, exename)) == -1) {
 	/* exec failed */
 	switch (errno) {
 	  case EAGAIN:
@@ -4596,6 +4628,20 @@
     }
     if (eargp)
 	rb_run_exec_options(&sarg, NULL);
+    if ((fmode & FMODE_READABLE) && (fmode & FMODE_WRITABLE)) {
+        close(pair[1]);
+        fd = pair[0];
+        close(write_pair[0]);
+        write_fd = write_pair[1];
+    }
+    else if (fmode & FMODE_READABLE) {
+        close(pair[1]);
+        fd = pair[0];
+    }
+    else {
+        close(pair[0]);
+        fd = pair[1];
+    }
 #else
     if (argc) {
 	prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" "));
Index: ruby_1_9_1/win32/win32.c
===================================================================
--- ruby_1_9_1/win32/win32.c	(revision 20896)
+++ ruby_1_9_1/win32/win32.c	(revision 20897)
@@ -4395,11 +4395,15 @@
 
 	    if (!GetOverlappedResult((HANDLE)_osfhnd(fd), &ol, &read, TRUE) &&
 		(err = GetLastError()) != ERROR_HANDLE_EOF) {
-		errno = map_errno(err);
+		int ret = 0;
+		if (err != ERROR_BROKEN_PIPE) {
+		    errno = map_errno(err);
+		    ret = -1;
+		}
 		CloseHandle(ol.hEvent);
 		cancel_io((HANDLE)_osfhnd(fd));
 		MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock));
-		return -1;
+		return ret;
 	    }
 	}
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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