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 17 years ago
          Updated by yugui (Yuki Sonoda) almost 17 years ago
          
          
        
        
      
      - Target version changed from 1.9.1 RC2 to 1.9.2
=begin
=end
        
           Updated by mame (Yusuke Endoh) over 15 years ago
          Updated by mame (Yusuke Endoh) over 15 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 15 years ago
          Updated by mame (Yusuke Endoh) over 15 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