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

ruby-changes:27767

From: kosaki <ko1@a...>
Date: Tue, 19 Mar 2013 13:40:38 +0900 (JST)
Subject: [ruby-changes:27767] kosaki:r39819 (trunk): * internal.h: added a declaration of ruby_kill().

kosaki	2013-03-19 13:40:22 +0900 (Tue, 19 Mar 2013)

  New Revision: 39819

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

  Log:
    * internal.h: added a declaration of ruby_kill().
    * thread.c (ruby_kill): helper function of kill().
    
    * signal.c (rb_f_kill): use ruby_kill() instead of kill().
    * signal.c (rb_f_kill): call rb_thread_execute_interrupts()
      to ensure that make SignalException if sent a signal
      to myself. [Bug #7951] [ruby-core:52864]
    
    * vm_core.h (typedef struct rb_thread_struct): added
      th->interrupt_cond.
    * thread.c (rb_threadptr_interrupt_common): added to
      initialization of th->interrupt_cond.
    * thread.c (thread_create_core): ditto.
    
    * test/ruby/test_signal.rb (TestSignal#test_hup_me): test for
      the above.

  Modified files:
    trunk/ChangeLog
    trunk/internal.h
    trunk/signal.c
    trunk/test/ruby/test_signal.rb
    trunk/thread.c
    trunk/vm_core.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39818)
+++ ChangeLog	(revision 39819)
@@ -1,3 +1,22 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Mar 16 01:44:29 2013  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* internal.h: added a declaration of ruby_kill().
+	* thread.c (ruby_kill): helper function of kill().
+
+	* signal.c (rb_f_kill): use ruby_kill() instead of kill().
+	* signal.c (rb_f_kill): call rb_thread_execute_interrupts()
+	  to ensure that make SignalException if sent a signal
+	  to myself. [Bug #7951] [ruby-core:52864]
+
+	* vm_core.h (typedef struct rb_thread_struct): added
+	  th->interrupt_cond.
+	* thread.c (rb_threadptr_interrupt_common): added to
+	  initialization of th->interrupt_cond.
+	* thread.c (thread_create_core): ditto.
+
+	* test/ruby/test_signal.rb (TestSignal#test_hup_me): test for
+	  the above.
+
 Sat Mar 16 00:42:39 2013  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* io.c (linux_iocparm_len): enable only exist _IOC_SIZE().
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 39818)
+++ vm_core.h	(revision 39819)
@@ -551,6 +551,7 @@ typedef struct rb_thread_struct { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L551
     rb_atomic_t interrupt_flag;
     unsigned long interrupt_mask;
     rb_thread_lock_t interrupt_lock;
+    rb_thread_cond_t interrupt_cond;
     struct rb_unblock_callback unblock;
     VALUE locking_mutex;
     struct rb_mutex_struct *keeping_mutexes;
Index: thread.c
===================================================================
--- thread.c	(revision 39818)
+++ thread.c	(revision 39819)
@@ -337,6 +337,7 @@ rb_threadptr_interrupt_common(rb_thread_ https://github.com/ruby/ruby/blob/trunk/thread.c#L337
     else {
 	/* none */
     }
+    native_cond_signal(&th->interrupt_cond);
     native_mutex_unlock(&th->interrupt_lock);
 }
 
@@ -624,6 +625,7 @@ thread_create_core(VALUE thval, VALUE ar https://github.com/ruby/ruby/blob/trunk/thread.c#L625
     th->interrupt_mask = 0;
 
     native_mutex_initialize(&th->interrupt_lock);
+    native_cond_initialize(&th->interrupt_cond, RB_CONDATTR_CLOCK_MONOTONIC);
 
     /* kick thread */
     err = native_thread_create(th);
@@ -5055,6 +5057,8 @@ Init_Thread(void) https://github.com/ruby/ruby/blob/trunk/thread.c#L5057
 	    gvl_acquire(th->vm, th);
 	    native_mutex_initialize(&th->vm->thread_destruct_lock);
 	    native_mutex_initialize(&th->interrupt_lock);
+	    native_cond_initialize(&th->interrupt_cond,
+				   RB_CONDATTR_CLOCK_MONOTONIC);
 
 	    th->pending_interrupt_queue = rb_ary_tmp_new(0);
 	    th->pending_interrupt_queue_checked = 0;
@@ -5198,3 +5202,22 @@ rb_uninterruptible(VALUE (*b_proc)(ANYAR https://github.com/ruby/ruby/blob/trunk/thread.c#L5202
 
     return rb_ensure(b_proc, data, rb_ary_pop, cur_th->pending_interrupt_mask_stack);
 }
+
+void
+ruby_kill(pid_t pid, int sig)
+{
+    int err;
+    rb_thread_t *th = GET_THREAD();
+    rb_vm_t *vm = GET_VM();
+
+    if ((th == vm->main_thread) && (pid == getpid())) {
+	native_mutex_lock(&th->interrupt_lock);
+	err = kill(pid, sig);
+	native_cond_wait(&th->interrupt_cond, &th->interrupt_lock);
+	native_mutex_unlock(&th->interrupt_lock);
+    } else {
+	err = kill(pid, sig);
+    }
+    if (err < 0)
+	rb_sys_fail(0);
+}
Index: internal.h
===================================================================
--- internal.h	(revision 39818)
+++ internal.h	(revision 39819)
@@ -308,6 +308,7 @@ VALUE rb_thread_shield_destroy(VALUE sel https://github.com/ruby/ruby/blob/trunk/internal.h#L308
 void rb_mutex_allow_trap(VALUE self, int val);
 VALUE rb_uninterruptible(VALUE (*b_proc)(ANYARGS), VALUE data);
 VALUE rb_mutex_owned_p(VALUE self);
+void ruby_kill(pid_t pid, int sig);
 
 /* thread_pthread.c, thread_win32.c */
 void Init_native_thread(void);
Index: test/ruby/test_signal.rb
===================================================================
--- test/ruby/test_signal.rb	(revision 39818)
+++ test/ruby/test_signal.rb	(revision 39819)
@@ -273,4 +273,11 @@ EOS https://github.com/ruby/ruby/blob/trunk/test/ruby/test_signal.rb#L273
       sleep 0.1
     INPUT
   end
+
+  def test_hup_me
+    # [Bug #7951] [ruby-core:52864]
+    assert_raise(SignalException) {
+      Process.kill('HUP',Process.pid)
+    }
+  end
 end
Index: signal.c
===================================================================
--- signal.c	(revision 39818)
+++ signal.c	(revision 39819)
@@ -18,6 +18,7 @@ https://github.com/ruby/ruby/blob/trunk/signal.c#L18
 #include <errno.h>
 #include "ruby_atomic.h"
 #include "eval_intern.h"
+#include "internal.h"
 
 #if defined(__native_client__) && defined(NACL_NEWLIB)
 # include "nacl/signal.h"
@@ -421,10 +422,11 @@ rb_f_kill(int argc, VALUE *argv) https://github.com/ruby/ruby/blob/trunk/signal.c#L422
     }
     else {
 	for (i=1; i<argc; i++) {
-	    if (kill(NUM2PIDT(argv[i]), sig) < 0)
-		rb_sys_fail(0);
+	    ruby_kill(NUM2PIDT(argv[i]), sig);
 	}
     }
+    rb_thread_execute_interrupts(rb_thread_current());
+
     return INT2FIX(i-1);
 }
 

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

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