aboutsummaryrefslogtreecommitdiffstats
path: root/signal.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-15 02:07:01 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-15 02:07:01 +0000
commit02ec298ad01e65fcc0d6d8fa15e1bbb0e946b6b5 (patch)
tree36d2ac90d740b28a5497868422e03a23d9fbfc95 /signal.c
parent3f6425991ad5f487df7328730db409b4ba60fc42 (diff)
downloadruby-02ec298ad01e65fcc0d6d8fa15e1bbb0e946b6b5.tar.gz
signal.c: prefer pthread_sigmask
* signal.c (raise_stack_overflow): prefer pthread_sigmask to sigprocmask, for multithreading. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58361 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/signal.c b/signal.c
index db1403fddd..2c37928256 100644
--- a/signal.c
+++ b/signal.c
@@ -773,18 +773,24 @@ NORETURN(void ruby_thread_stack_overflow(rb_thread_t *th));
# define USE_UCONTEXT_REG 1
# endif
NORETURN(static void raise_stack_overflow(int sig, rb_thread_t *th));
+#if defined(HAVE_PTHREAD_SIGMASK)
+# define ruby_sigunmask pthread_sigmask
+#elif defined(HAVE_SIGPROCMASK)
+# define ruby_sigunmask sigprocmask
+#endif
static void
raise_stack_overflow(int sig, rb_thread_t *th)
{
-#ifdef HAVE_SIGPROCMASK
+#if defined(ruby_sigunmask)
sigset_t mask;
#endif
clear_received_signal();
-#ifdef HAVE_SIGPROCMASK
+#if defined(ruby_sigunmask)
sigemptyset(&mask);
sigaddset(&mask, sig);
- if (sigprocmask(SIG_UNBLOCK, &mask, NULL))
- rb_bug_errno("sigprocmask:set", errno);
+ if (ruby_sigunmask(SIG_UNBLOCK, &mask, NULL)) {
+ rb_bug_errno(STRINGIZE(ruby_sigunmask)":unblock", errno);
+ }
#endif
ruby_thread_stack_overflow(th);
}