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

ruby-changes:22377

From: naruse <ko1@a...>
Date: Fri, 3 Feb 2012 16:20:10 +0900 (JST)
Subject: [ruby-changes:22377] naruse:r34426 (ruby_1_9_3): merge revision(s) 34040,34051,34063,34389,34402,34403:

naruse	2012-02-03 16:17:03 +0900 (Fri, 03 Feb 2012)

  New Revision: 34426

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

  Log:
    merge revision(s) 34040,34051,34063,34389,34402,34403:
    ------------------------------------------------------------------------
    r34040 | naruse | 2011-12-14 14:42:34 +0900 (Wed, 14 Dec 2011) | 1 line
    
    Use pipe instead of $stdin.read.
    ------------------------------------------------------------------------
    
    * test/ruby/envutil.rb (invoke_ruby): remove :timeout option before
      pass it to Kernel#spawn.
    
    * test/ruby/test_thread.rb
      (TestThreadGroup#test_thread_timer_and_interrupt): skip exit status
      assertion because we cannot get signal status on Windows.
    
    * win32/win32.c (CreateChild): create process group to receive the
      signal by GenerateConsoleCtrlEvent().
    
    * win32/win32.c (kill): use CTRL_BREAK_EVENT instead of CTRL_C_EVENT
      if a process group is specified. CTRL_C_EVENT signal cannot be
      generated for process groups for the specification.
      [ruby-dev:45149] [Bug #5812]
    
    * test/ruby/envutil.rb (EnvUtil.invoke_ruby): yield also child pid
      in block form.

  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/test/ruby/envutil.rb
    branches/ruby_1_9_3/test/ruby/test_thread.rb
    branches/ruby_1_9_3/version.h
    branches/ruby_1_9_3/win32/win32.c

Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 34425)
+++ ruby_1_9_3/ChangeLog	(revision 34426)
@@ -1,3 +1,27 @@
+Fri Feb  3 16:16:10 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* test/ruby/envutil.rb (EnvUtil.invoke_ruby): yield also child pid
+	  in block form.
+
+Fri Feb  3 16:16:10 2012  Hiroshi Shirosaki  <h.shirosaki@g...>
+
+	* test/ruby/test_thread.rb
+	  (TestThreadGroup#test_thread_timer_and_interrupt): skip exit status
+	  assertion because we cannot get signal status on Windows.
+
+	* win32/win32.c (CreateChild): create process group to receive the
+	  signal by GenerateConsoleCtrlEvent().
+
+	* win32/win32.c (kill): use CTRL_BREAK_EVENT instead of CTRL_C_EVENT
+	  if a process group is specified. CTRL_C_EVENT signal cannot be
+	  generated for process groups for the specification.
+	  [ruby-dev:45149] [Bug #5812]
+
+Fri Feb  3 16:16:10 2012  CHIKANAGA Tomoyuki  <nagachika00@g...>
+
+	* test/ruby/envutil.rb (invoke_ruby): remove :timeout option before
+	  pass it to Kernel#spawn.
+
 Fri Feb  3 10:10:02 2012  CHIKANAGA Tomoyuki  <nagachika00@g...>
 
 	* thread_pthread.c (ping_signal_thread_list): remove return value.
Index: ruby_1_9_3/win32/win32.c
===================================================================
--- ruby_1_9_3/win32/win32.c	(revision 34425)
+++ ruby_1_9_3/win32/win32.c	(revision 34426)
@@ -1058,7 +1058,7 @@
 	aStartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
     }
 
-    dwCreationFlags = (NORMAL_PRIORITY_CLASS);
+    dwCreationFlags = (CREATE_NEW_PROCESS_GROUP | NORMAL_PRIORITY_CLASS);
 
     if (lstrlenW(cmd) > 32767) {
 	child->pid = 0;		/* release the slot */
@@ -3851,7 +3851,13 @@
 
       case SIGINT:
 	RUBY_CRITICAL({
-	    if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT, (DWORD)pid)) {
+	    DWORD ctrlEvent = CTRL_C_EVENT;
+	    if (pid != 0) {
+	        /* CTRL+C signal cannot be generated for process groups.
+		 * Instead, we use CTRL+BREAK signal. */
+	        ctrlEvent = CTRL_BREAK_EVENT;
+	    }
+	    if (!GenerateConsoleCtrlEvent(ctrlEvent, (DWORD)pid)) {
 		if ((err = GetLastError()) == 0)
 		    errno = EPERM;
 		else
Index: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 34425)
+++ ruby_1_9_3/version.h	(revision 34426)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 30
+#define RUBY_PATCHLEVEL 31
 
 #define RUBY_RELEASE_DATE "2012-02-03"
 #define RUBY_RELEASE_YEAR 2012
Index: ruby_1_9_3/test/ruby/envutil.rb
===================================================================
--- ruby_1_9_3/test/ruby/envutil.rb	(revision 34425)
+++ ruby_1_9_3/test/ruby/envutil.rb	(revision 34426)
@@ -42,6 +42,7 @@
       out_p.set_encoding(enc) if out_p
       err_p.set_encoding(enc) if err_p
     end
+    timeout = opt.delete(:timeout) || 10
     c = "C"
     child_env = {}
     LANG_ENVS.each {|lc| child_env[lc] = c}
@@ -54,13 +55,12 @@
     out_c.close if capture_stdout
     err_c.close if capture_stderr && capture_stderr != :merge_to_stdout
     if block_given?
-      return yield in_p, out_p, err_p
+      return yield in_p, out_p, err_p, pid
     else
       th_stdout = Thread.new { out_p.read } if capture_stdout
       th_stderr = Thread.new { err_p.read } if capture_stderr && capture_stderr != :merge_to_stdout
       in_p.write stdin_data.to_str
       in_p.close
-      timeout = opt.fetch(:timeout, 10)
       if (!th_stdout || th_stdout.join(timeout)) && (!th_stderr || th_stderr.join(timeout))
         stdout = th_stdout.value if capture_stdout
         stderr = th_stderr.value if capture_stderr && capture_stderr != :merge_to_stdout
Index: ruby_1_9_3/test/ruby/test_thread.rb
===================================================================
--- ruby_1_9_3/test/ruby/test_thread.rb	(revision 34425)
+++ ruby_1_9_3/test/ruby/test_thread.rb	(revision 34426)
@@ -689,15 +689,23 @@
   def test_thread_timer_and_interrupt
     bug5757 = '[ruby-dev:44985]'
     t0 = Time.now.to_f
-    pid = spawn(EnvUtil.rubybin, '-e', '$stdin.read')
-    sleep 1;
-    Process.kill(:SIGQUIT, pid)
-    Process.wait(pid)
-    s = $?
-    assert_equal([false, true, false],
-                 [s.exited?, s.signaled?, s.stopped?],
-                 "[s.exited?, s.signaled?, s.stopped?]")
+    pid = nil
+    cmd = 'r,=IO.pipe; Thread.start {Thread.pass until Thread.main.stop?; puts; STDOUT.flush}; r.read'
+    s, err = EnvUtil.invoke_ruby(['-e', cmd], "", true, true) do |in_p, out_p, err_p, cpid|
+      out_p.gets
+      pid = cpid
+      Process.kill(:SIGINT, pid)
+      Process.wait(pid)
+      [$?, err_p.read]
+    end
     t1 = Time.now.to_f
+    assert_equal(pid, s.pid)
+    unless /mswin|mingw/ =~ RUBY_PLATFORM
+      # status of signal is not supported on Windows
+      assert_equal([false, true, false, Signal.list["INT"]],
+                   [s.exited?, s.signaled?, s.stopped?, s.termsig],
+                   "[s.exited?, s.signaled?, s.stopped?, s.termsig]")
+    end
     assert_in_delta(t1 - t0, 1, 1)
   end
 end

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

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