summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-15 15:18:04 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-15 15:18:04 +0000
commita732f344366688c17220989dce1cfe3cac156fe2 (patch)
tree07a5c36f11a0a5052c0b661b07bc9eded4540a02 /signal.c
parent9b9479b1b6742000f2ad1445ed2c1dcf6a897fbd (diff)
merge revision(s) r47818,r47832: [Backport #9820]
* signal.c (rb_f_kill): should not ignore signal unless the default handler is registered. [ruby-dev:48592] [Bug #9820] * signal.c (rb_f_kill): get rid of deadlock as unhandled and discarded signals do not make interrupt_cond signaled. based on the patch by Kazuki Tsujimoto at [ruby-dev:48606]. [Bug #9820] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@47956 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/signal.c b/signal.c
index 82fad956df..3db044e517 100644
--- a/signal.c
+++ b/signal.c
@@ -343,6 +343,7 @@ ruby_default_signal(int sig)
raise(sig);
}
+static RETSIGTYPE sighandler(int sig);
static int signal_ignored(int sig);
static void signal_enque(int sig);
@@ -449,6 +450,7 @@ rb_f_kill(int argc, VALUE *argv)
rb_pid_t pid = NUM2PIDT(argv[i]);
if ((sig != 0) && (self != -1) && (pid == self)) {
+ int t;
/*
* When target pid is self, many caller assume signal will be
* delivered immediately and synchronously.
@@ -467,7 +469,12 @@ rb_f_kill(int argc, VALUE *argv)
ruby_kill(pid, sig);
break;
default:
- if (signal_ignored(sig)) break;
+ t = signal_ignored(sig);
+ if (t) {
+ if (t < 0 && kill(pid, sig))
+ rb_sys_fail(0);
+ break;
+ }
signal_enque(sig);
wakeup = 1;
}
@@ -612,16 +619,19 @@ ruby_nativethread_signal(int signum, sighandler_t handler)
static int
signal_ignored(int sig)
{
+ sighandler_t func;
#ifdef POSIX_SIGNAL
struct sigaction old;
(void)VALGRIND_MAKE_MEM_DEFINED(&old, sizeof(old));
if (sigaction(sig, NULL, &old) < 0) return FALSE;
- return old.sa_handler == SIG_IGN;
+ func = old.sa_handler;
#else
sighandler_t old = signal(sig, SIG_DFL);
signal(sig, old);
- return old == SIG_IGN;
+ func = old;
#endif
+ if (func == SIG_IGN) return 1;
+ return func == sighandler ? 0 : -1;
}
static void