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

ruby-changes:9641

From: yugui <ko1@a...>
Date: Mon, 29 Dec 2008 23:41:38 +0900 (JST)
Subject: [ruby-changes:9641] Ruby:r21181 (trunk): * process.c (rb_waitpid): retries waitpid when EINTR.

yugui	2008-12-29 23:41:22 +0900 (Mon, 29 Dec 2008)

  New Revision: 21181

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

  Log:
    * process.c (rb_waitpid): retries waitpid when EINTR.
      [ruby-core:19744].

  Modified files:
    trunk/ChangeLog
    trunk/process.c
    trunk/test/ruby/test_process.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21180)
+++ ChangeLog	(revision 21181)
@@ -1,3 +1,8 @@
+Mon Dec 29 22:37:17 2008  Yuki Sonoda (Yugui)  <yugui@y...>
+
+	* process.c (rb_waitpid): retries waitpid when EINTR.
+	  [ruby-core:19744].
+
 Mon Dec 29 23:18:52 2008  Tadayoshi Funaba  <tadf@d...>
 
 	* bignum.c (rb_cstr_to_inum): changed an error message.
Index: process.c
===================================================================
--- process.c	(revision 21180)
+++ process.c	(revision 21181)
@@ -624,18 +624,17 @@
 #ifndef NO_WAITPID
     struct waitpid_arg arg;
 
+retry:
     arg.pid = pid;
     arg.st = st;
     arg.flags = flags;
     result = (rb_pid_t)rb_thread_blocking_region(rb_waitpid_blocking, &arg,
 						 RUBY_UBF_PROCESS, 0);
     if (result < 0) {
-#if 0
 	if (errno == EINTR) {
-	    rb_thread_polling();
-	    goto retry;
-	}
-#endif
+            RUBY_VM_CHECK_INTS();
+            goto retry;
+        }
 	return -1;
     }
 #else  /* NO_WAITPID */
Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb	(revision 21180)
+++ test/ruby/test_process.rb	(revision 21181)
@@ -1044,4 +1044,16 @@
   def test_pst_inspect
     assert_nothing_raised { Process::Status.allocate.inspect }
   end
+
+  def test_wait_and_sigchild
+    signal_received = []
+    Signal.trap(:CHLD)  { signal_received << true; puts "child died" }
+    pid = fork { sleep 1; exit }
+    Thread.start { raise }
+    Process.wait pid
+    sleep 2
+    assert_equal [true], signal_received, " [ruby-core:19744]"
+  ensure
+    Signal.trap(:CHLD, 'DEFAULT')
+  end
 end

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

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