summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal.h1
-rw-r--r--signal.c2
-rw-r--r--test/ruby/test_signal.rb14
-rw-r--r--thread.c28
-rw-r--r--vm_core.h1
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);
diff --git a/signal.c b/signal.c
index 16c03e7b50..7baf742929 100644
--- a/signal.c
+++ b/signal.c
@@ -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
diff --git a/thread.c b/thread.c
index 74cdf4f3c7..b05e721b18 100644
--- a/thread.c
+++ b/thread.c
@@ -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);
- }
-}
diff --git a/vm_core.h b/vm_core.h
index 52d1bbcdce..f4301b7fe0 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -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;