summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-09 01:57:46 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-09 01:57:46 +0000
commitd410a38b8e8c89e50dcb28082d1e4cb5050a1d77 (patch)
tree36e658b475c731c8787835dd0cb7d31b8220c41b /process.c
parent4da82e58a19be2e49847f135f9f25697773a57ae (diff)
* 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
Diffstat (limited to 'process.c')
-rw-r--r--process.c22
1 files changed, 14 insertions, 8 deletions
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,12 +2611,20 @@ 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)
{
#if !defined FD_CLOEXEC && !defined HAVE_SPAWNV