* 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:
parent
463b5603d9
commit
3de392def9
@ -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)
|
||||||
|
25
process.c
25
process.c
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user