* process.c (struct child_handler_disabler_state): Defined.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47436 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2014-09-06 10:27:54 +00:00
parent 463b5603d9
commit 3de392def9
2 changed files with 19 additions and 10 deletions

View File

@ -1,3 +1,7 @@
Sat Sep 6 19:27:10 2014 Tanaka Akira <akr@fsij.org>
* process.c (struct child_handler_disabler_state): Defined.
Sat Sep 6 18:31:32 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com> Sat Sep 6 18:31:32 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* lib/rake.rb, lib/rake/*, test/rake/*: Update latest rake master(e47d023) * lib/rake.rb, lib/rake/*, test/rake/*: Update latest rake master(e47d023)

View File

@ -3379,8 +3379,13 @@ has_privilege(void)
return 0; return 0;
} }
struct child_handler_disabler_state
{
sigset_t sigmask;
};
static void static void
disable_child_handler_before_fork(sigset_t *oldset) disable_child_handler_before_fork(struct child_handler_disabler_state *old)
{ {
int ret; int ret;
sigset_t all; sigset_t all;
@ -3389,7 +3394,7 @@ disable_child_handler_before_fork(sigset_t *oldset)
if (ret == -1) if (ret == -1)
rb_sys_fail("sigfillset"); rb_sys_fail("sigfillset");
ret = pthread_sigmask(SIG_SETMASK, &all, oldset); /* not async-signal-safe */ ret = pthread_sigmask(SIG_SETMASK, &all, &old->sigmask); /* not async-signal-safe */
if (ret != 0) { if (ret != 0) {
errno = ret; errno = ret;
rb_sys_fail("pthread_sigmask"); rb_sys_fail("pthread_sigmask");
@ -3397,11 +3402,11 @@ disable_child_handler_before_fork(sigset_t *oldset)
} }
static void static void
disable_child_handler_fork_parent(sigset_t *oldset) disable_child_handler_fork_parent(struct child_handler_disabler_state *old)
{ {
int ret; int ret;
ret = pthread_sigmask(SIG_SETMASK, oldset, NULL); /* not async-signal-safe */ ret = pthread_sigmask(SIG_SETMASK, &old->sigmask, NULL); /* not async-signal-safe */
if (ret != 0) { if (ret != 0) {
errno = ret; errno = ret;
rb_sys_fail("pthread_sigmask"); rb_sys_fail("pthread_sigmask");
@ -3410,7 +3415,7 @@ disable_child_handler_fork_parent(sigset_t *oldset)
/* This function should be async-signal-safe. Actually it is. */ /* This function should be async-signal-safe. Actually it is. */
static int static int
disable_child_handler_fork_child(sigset_t *oldset, char *errmsg, size_t errmsg_buflen) disable_child_handler_fork_child(struct child_handler_disabler_state *old, char *errmsg, size_t errmsg_buflen)
{ {
int sig; int sig;
int ret; int ret;
@ -3451,7 +3456,7 @@ disable_child_handler_fork_child(sigset_t *oldset, char *errmsg, size_t errmsg_b
} }
} }
ret = sigprocmask(SIG_SETMASK, oldset, NULL); /* async-signal-safe */ ret = sigprocmask(SIG_SETMASK, &old->sigmask, NULL); /* async-signal-safe */
if (ret != 0) { if (ret != 0) {
ERRMSG("sigprocmask"); ERRMSG("sigprocmask");
return -1; return -1;
@ -3466,11 +3471,11 @@ retry_fork_async_signal_safe(int *status, int *ep,
{ {
rb_pid_t pid; rb_pid_t pid;
volatile int try_gc = 1; volatile int try_gc = 1;
sigset_t oldsigmask; struct child_handler_disabler_state old;
while (1) { while (1) {
prefork(); prefork();
disable_child_handler_before_fork(&oldsigmask); disable_child_handler_before_fork(&old);
#ifdef HAVE_WORKING_VFORK #ifdef HAVE_WORKING_VFORK
if (!has_privilege()) if (!has_privilege())
pid = vfork(); pid = vfork();
@ -3482,7 +3487,7 @@ retry_fork_async_signal_safe(int *status, int *ep,
if (pid == 0) {/* fork succeed, child process */ if (pid == 0) {/* fork succeed, child process */
int ret; int ret;
close(ep[0]); close(ep[0]);
ret = disable_child_handler_fork_child(&oldsigmask, errmsg, errmsg_buflen); /* async-signal-safe */ ret = disable_child_handler_fork_child(&old, errmsg, errmsg_buflen); /* async-signal-safe */
if (ret == 0) { if (ret == 0) {
ret = chfunc(charg, errmsg, errmsg_buflen); ret = chfunc(charg, errmsg, errmsg_buflen);
if (!ret) _exit(EXIT_SUCCESS); if (!ret) _exit(EXIT_SUCCESS);
@ -3494,7 +3499,7 @@ retry_fork_async_signal_safe(int *status, int *ep,
_exit(127); _exit(127);
#endif #endif
} }
preserving_errno(disable_child_handler_fork_parent(&oldsigmask)); preserving_errno(disable_child_handler_fork_parent(&old));
if (0 < pid) /* fork succeed, parent process */ if (0 < pid) /* fork succeed, parent process */
return pid; return pid;
/* fork failed */ /* fork failed */