Bug #947
closedSignal handler block is never called when the program is too short
Description
=begin
forked from #727.
% ruby-trunk -e 'Signal.trap(:INT){p :ok}; Process.kill(:INT, $$)'
=> displays nothing
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version changed from 1.9.1 RC2 to 1.9.2
=begin
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- ruby -v set to ruby 1.9.2dev (2010-03-24 trunk 27033) [i686-linux]
=begin
Hi,
2008/12/29 Yuki Sonoda redmine@ruby-lang.org:
Bug #947: Signal handler block is never called when the program is too short
http://redmine.ruby-lang.org/issues/show/947Author: Yuki Sonoda
Status: Open, Priority: Normal
Assigned to: Koichi Sasada, Category: YARV, Target version: 1.9.1forked from #727.
% ruby-trunk -e 'Signal.trap(:INT){p :ok}; Process.kill(:INT, $$)'
=> displays nothing
It would be good to check whether signal is delivered or not before
process termination:
diff --git a/eval.c b/eval.c
index a1deab6..2db160c 100644
--- a/eval.c
+++ b/eval.c
@@ -127,6 +127,12 @@ ruby_cleanup(volatile int ex)
volatile VALUE errs[2];
rb_thread_t *th = GET_THREAD();
int nerr;
-
void rb_threadptr_interrupt(rb_thread_t *th);
-
void rb_threadptr_check_signal(rb_thread_t *mth);
-
rb_threadptr_interrupt(th);
-
rb_threadptr_check_signal(th);
-
RUBY_VM_CHECK_INTS();
errs[1] = th->errinfo;
th->safe_level = 0;
diff --git a/thread.c b/thread.c
index a3dfe00..5273dd1 100644
--- a/thread.c
+++ b/thread.c
@@ -290,7 +290,7 @@ reset_unblock_function(rb_thread_t *th, const struct rb_unblock_callback *old)
native_mutex_unlock(&th->interrupt_lock);
}
-static void
+void
rb_threadptr_interrupt(rb_thread_t *th)
{
native_mutex_lock(&th->interrupt_lock);
@@ -2644,18 +2644,13 @@ rb_gc_save_machine_context(rb_thread_t *th)
int rb_get_next_signal(void);
-static void
-timer_thread_function(void *arg)
+void
+rb_threadptr_check_signal(rb_thread_t *mth)
{
-
rb_vm_t vm = GET_VM(); / TODO: fix me for Multi-VM */
int sig; -
rb_thread_t *mth;
-
/* for time slice */
-
RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
- /* mth must be main_thread */
- /* check signal */
- mth = vm->main_thread;
if (!mth->exec_signal && (sig = rb_get_next_signal()) > 0) {
enum rb_thread_status prev_status = mth->status;
thread_debug("main_thread: %s, sig: %d\n",
@@ -2665,6 +2660,19 @@ timer_thread_function(void *arg)
rb_threadptr_interrupt(mth);
mth->status = prev_status;
}
+}
+static void
+timer_thread_function(void *arg)
+{
- rb_vm_t vm = GET_VM(); / TODO: fix me for Multi-VM */
- rb_thread_t *mth;
- /* for time slice */
- RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
- /* check signal */
- rb_threadptr_check_signal(vm->main_thread);
#if 0
/* prove profiler */
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r27513.
Yuki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end