Project

General

Profile

Bug #947

Signal handler block is never called when the program is too short

Added by yugui (Yuki Sonoda) about 11 years ago. Updated almost 9 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 1.9.2dev (2010-03-24 trunk 27033) [i686-linux]
Backport:
[ruby-core:20970]

Description

=begin
forked from #727.

% ruby-trunk -e 'Signal.trap(:INT){p :ok}; Process.kill(:INT, $$)'
=> displays nothing
=end


Related issues

Related to Ruby master - Bug #727: Signal(CLD) seems not to work on OS XClosed11/08/200801/20/2009ko1 (Koichi Sasada)Actions
#1

Updated by yugui (Yuki Sonoda) about 11 years ago

  • Target version changed from 1.9.1 RC2 to 1.9.2

=begin

=end

#2

Updated by mame (Yusuke Endoh) almost 10 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/947

Author: Yuki Sonoda
Status: Open, Priority: Normal
Assigned to: Koichi Sasada, Category: YARV, Target version: 1.9.1

forked 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

#3

Updated by mame (Yusuke Endoh) almost 10 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

Also available in: Atom PDF