summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-03-02 08:11:28 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-03-02 08:11:28 +0000
commit9815949157a76bb32dd516638f0f17549a15081c (patch)
treee63625a87f495ed2e96ebcea086b3f6723b9ab3d /signal.c
parent3124427ccbf02a5bd20f169ad6a328286e05c262 (diff)
* eval.c (ruby_native_thread_kill): call pthread_kill() to send a
signal to ruby's native thread * ruby.h: add definition of ruby_native_thread_kill() * signal.c (sigsend_to_ruby_thread): send the signal to ruby's native thread ([ruby-dev:25744], [ruby-dev:25754]), and set signal mask to the current native thread git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8050 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/signal.c b/signal.c
index 63cb18cb49..6bcc723d82 100644
--- a/signal.c
+++ b/signal.c
@@ -436,6 +436,29 @@ signal_exec(sig)
}
}
+static void
+sigsend_to_ruby_thread(sig)
+ int sig;
+{
+#ifdef HAVE_NATIVETHREAD_KILL
+# ifdef HAVE_SIGPROCMASK
+ sigset_t mask, old_mask;
+# else
+ int mask, old_mask;
+# endif
+
+#ifdef HAVE_SIGPROCMASK
+ sigfillset(&mask);
+ sigprocmask(SIG_BLOCK, &mask, &old_mask);
+#else
+ mask = sigblock(~0);
+ sigsetmask(mask);
+#endif
+
+ ruby_native_thread_kill(sig);
+#endif
+}
+
static RETSIGTYPE sighandler _((int));
static RETSIGTYPE
sighandler(sig)
@@ -450,9 +473,9 @@ sighandler(sig)
rb_bug("trap_handler: Bad signal %d", sig);
}
-#ifdef HAVE_NATIVETHREAD
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- /* ignore signals on non-Ruby native thread */
+ sigsend_to_ruby_thread(sig);
return;
}
#endif
@@ -481,9 +504,9 @@ static RETSIGTYPE
sigbus(sig)
int sig;
{
-#ifdef HAVE_NATIVETHREAD
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- /* ignore signals on non-Ruby native thread */
+ sigsend_to_ruby_thread(sig);
return;
}
#endif
@@ -498,9 +521,9 @@ static RETSIGTYPE
sigsegv(sig)
int sig;
{
-#ifdef HAVE_NATIVETHREAD
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- /* ignore signals on non-Ruby native thread */
+ sigsend_to_ruby_thread(sig);
return;
}
#endif
@@ -570,9 +593,9 @@ static RETSIGTYPE
sigexit(sig)
int sig;
{
-#ifdef HAVE_NATIVETHREAD
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- /* ignore signals on non-Ruby native thread */
+ sigsend_to_ruby_thread(sig);
return;
}
#endif