mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
remove ruby_kill() introduced for [Bug #7951].
* thread.c (rbuy_kill): removed. This function is used with SIGSEGV, SIGBUS, SIGKILL, SIGILL, SIGFPE and SIGSTOP and these signals are affect immediately. So that `kill(2)' is enough for them. * signal.c (rb_f_kill): ditto. * vm_core.h (rb_thread_t::interrupt_cond): removed because only `ruby_kill()' uses this field. * test/ruby/test_signal.rb: Without this patch sending SIGSTOP to own process wait another interrupt even if another process sends SIGCONT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59066 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a57d295e36
commit
6c3f1461cd
5 changed files with 15 additions and 31 deletions
|
|
@ -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);
|
||||
|
|
|
|||
2
signal.c
2
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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
28
thread.c
28
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue