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
This commit is contained in:
nobu 2017-04-15 02:07:01 +00:00
parent fd421a9af0
commit 6f1fbfd618

View File

@ -773,18 +773,24 @@ NORETURN(void ruby_thread_stack_overflow(rb_thread_t *th));
# define USE_UCONTEXT_REG 1 # define USE_UCONTEXT_REG 1
# endif # endif
NORETURN(static void raise_stack_overflow(int sig, rb_thread_t *th)); 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 static void
raise_stack_overflow(int sig, rb_thread_t *th) raise_stack_overflow(int sig, rb_thread_t *th)
{ {
#ifdef HAVE_SIGPROCMASK #if defined(ruby_sigunmask)
sigset_t mask; sigset_t mask;
#endif #endif
clear_received_signal(); clear_received_signal();
#ifdef HAVE_SIGPROCMASK #if defined(ruby_sigunmask)
sigemptyset(&mask); sigemptyset(&mask);
sigaddset(&mask, sig); sigaddset(&mask, sig);
if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) if (ruby_sigunmask(SIG_UNBLOCK, &mask, NULL)) {
rb_bug_errno("sigprocmask:set", errno); rb_bug_errno(STRINGIZE(ruby_sigunmask)":unblock", errno);
}
#endif #endif
ruby_thread_stack_overflow(th); ruby_thread_stack_overflow(th);
} }