From d410a38b8e8c89e50dcb28082d1e4cb5050a1d77 Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 9 Jun 2012 01:57:46 +0000 Subject: * process.c (rb_exec_async_signal_safe): extracted from rb_exec_err. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ process.c | 22 ++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 08853ab4ba..e8da483215 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sat Jun 9 10:57:14 2012 Tanaka Akira + + * process.c (rb_exec_async_signal_safe): extracted from rb_exec_err. + Sat Jun 9 09:31:07 2012 Tanaka Akira * process.c: simplified because close_others option is always diff --git a/process.c b/process.c index 477dd4383c..f13d650f78 100644 --- a/process.c +++ b/process.c @@ -2583,9 +2583,9 @@ rb_run_exec_options(const struct rb_exec_arg *e, struct rb_exec_arg *s) return rb_run_exec_options_err(e, s, NULL, 0); } -/* This function should be async-signal-safe. Actually it isn't because after_exec(). */ -int -rb_exec_err(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) +/* This function should be async-signal-safe. Actually it is. */ +static int +rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) { #if !defined(HAVE_FORK) struct rb_exec_arg sarg, *sargp = &sarg; @@ -2593,10 +2593,8 @@ rb_exec_err(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) # define sargp NULL #endif - before_exec(); /* async-signal-safe if forked_child is true */ - if (rb_run_exec_options_err(e, sargp, errmsg, errmsg_buflen) < 0) { /* async-signal-safe */ - goto failure; + return -1; } if (e->use_shell) { @@ -2613,11 +2611,19 @@ rb_exec_err(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) #else # undef sargp #endif -failure: - preserving_errno(after_exec()); /* xxx: not async-signal-safe because after_exec calls rb_thread_start_timer_thread. */ return -1; } +int +rb_exec_err(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) +{ + int ret; + before_exec(); /* 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. */ + return ret; +} + int rb_exec(const struct rb_exec_arg *e) { -- cgit v1.2.3