diff options
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | signal.c | 2 | ||||
-rw-r--r-- | test/ruby/test_signal.rb | 14 | ||||
-rw-r--r-- | thread.c | 28 | ||||
-rw-r--r-- | vm_core.h | 1 |
5 files changed, 15 insertions, 31 deletions
diff --git a/internal.h b/internal.h index cc1d97534b..45d1426b1c 100644 --- a/internal.h +++ b/internal.h @@ -1674,7 +1674,6 @@ int rb_thread_to_be_killed(VALUE thread); 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(rb_pid_t pid, int sig); /* thread_pthread.c, thread_win32.c */ void Init_native_thread(void); @@ -495,7 +495,7 @@ rb_f_kill(int argc, const VALUE *argv) #ifdef SIGSTOP case SIGSTOP: #endif - ruby_kill(pid, sig); + kill(pid, sig); break; default: t = signal_ignored(sig); diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb index c48a4ad400..2d98b0b564 100644 --- a/test/ruby/test_signal.rb +++ b/test/ruby/test_signal.rb @@ -307,4 +307,18 @@ EOS b = Signal.list.keys.map(&:object_id).sort assert_equal a, b end + + def test_self_stop + assert_ruby_status([], <<-'end;') + begin + fork{ + sleep 1 + Process.kill(:CONT, Process.ppid) + } + Process.kill(:STOP, Process.pid) + rescue NotImplementedError + # ok + end + end; + end end @@ -425,7 +425,6 @@ rb_threadptr_interrupt_common(rb_thread_t *th, int trap) else { /* none */ } - native_cond_signal(&th->interrupt_cond); native_mutex_unlock(&th->interrupt_lock); } @@ -549,7 +548,6 @@ thread_cleanup_func(void *th_ptr, int atfork) return; native_mutex_destroy(&th->interrupt_lock); - native_cond_destroy(&th->interrupt_cond); native_thread_destroy(th); } @@ -739,7 +737,6 @@ thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS)) th->interrupt_mask = 0; native_mutex_initialize(&th->interrupt_lock); - native_cond_initialize(&th->interrupt_cond, RB_CONDATTR_CLOCK_MONOTONIC); th->report_on_exception = th->vm->thread_report_on_exception; /* kick thread */ @@ -4920,8 +4917,6 @@ Init_Thread(void) 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; @@ -5077,26 +5072,3 @@ rb_uninterruptible(VALUE (*b_proc)(ANYARGS), VALUE data) return rb_ensure(b_proc, data, rb_ary_pop, cur_th->pending_interrupt_mask_stack); } - -void -ruby_kill(rb_pid_t pid, int sig) -{ - int err; - rb_thread_t *th = GET_THREAD(); - - /* - * When target pid is self, many caller assume signal will be - * delivered immediately and synchronously. - */ - { - GVL_UNLOCK_BEGIN(); - 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); - GVL_UNLOCK_END(); - } - if (err < 0) { - rb_sys_fail(0); - } -} @@ -791,7 +791,6 @@ typedef struct rb_thread_struct { rb_atomic_t interrupt_flag; unsigned long interrupt_mask; rb_nativethread_lock_t interrupt_lock; - rb_nativethread_cond_t interrupt_cond; struct rb_unblock_callback unblock; VALUE locking_mutex; struct rb_mutex_struct *keeping_mutexes; |