diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-09 21:48:42 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-09 21:48:42 +0000 |
commit | 99c71b1ee4024bd9112e26cc442d9c91b2bc75e3 (patch) | |
tree | a26ef8f97e0821dc58294a11ef9b7870f3cd0992 /process.c | |
parent | e6424f805bffc64655cc80ede8bd6f396c57e306 (diff) | |
download | ruby-99c71b1ee4024bd9112e26cc442d9c91b2bc75e3.tar.gz |
* process.c: split after_exec into async-signal-safe part and rest.
(after_exec_async_signal_safe): extracted from after_exec.
(after_exec_non_async_signal_safe): ditto.
(after_exec): call them.
(rb_exec_async_signal_safe): call after_exec_async_signal_safe.
(rb_exec_err): call after_exec_non_async_signal_safe instead of
after_exec.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35999 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 27 |
1 files changed, 20 insertions, 7 deletions
@@ -1026,18 +1026,28 @@ static void before_exec(void) before_exec_async_signal_safe(); } -static void after_exec(void) +/* This function should be async-signal-safe. Actually it is. */ +static void after_exec_async_signal_safe(void) { - rb_thread_reset_timer_thread(); - rb_thread_start_timer_thread(); - #ifdef SIGPIPE - signal(SIGPIPE, saved_sigpipe_handler); + signal(SIGPIPE, saved_sigpipe_handler); /* async-signal-safe */ #endif +} + +static void after_exec_non_async_signal_safe(void) +{ + rb_thread_reset_timer_thread(); + rb_thread_start_timer_thread(); forked_child = 0; } +static void after_exec(void) +{ + after_exec_async_signal_safe(); + after_exec_non_async_signal_safe(); +} + #define before_fork() before_exec() #define after_fork() (GET_THREAD()->thrown_errinfo = 0, after_exec()) @@ -2606,7 +2616,7 @@ rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errm before_exec_async_signal_safe(); /* async-signal-safe */ if (rb_run_exec_options_err(e, sargp, errmsg, errmsg_buflen) < 0) { /* hopefully async-signal-safe */ - return -1; + goto failure; } if (e->use_shell) { @@ -2623,6 +2633,9 @@ rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errm #else # undef sargp #endif + +failure: + preserving_errno(after_exec_async_signal_safe()); /* async-signal-safe */ return -1; } @@ -2632,7 +2645,7 @@ rb_exec_err(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) int ret; before_exec_non_async_signal_safe(); /* async-signal-safe if forked_child is true */ ret = rb_exec_async_signal_safe(e, errmsg, errmsg_buflen); - preserving_errno(after_exec()); /* not async-signal-safe because after_exec calls rb_thread_start_timer_thread. */ + preserving_errno(after_exec_non_async_signal_safe()); /* not async-signal-safe because after_exec calls rb_thread_start_timer_thread. */ return ret; } |