* process.c (send_child_error): Simplified.
(recv_child_error): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47356 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a78a9b0d17
commit
de88408813
@ -1,3 +1,8 @@
|
|||||||
|
Tue Sep 2 23:26:26 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* process.c (send_child_error): Simplified.
|
||||||
|
(recv_child_error): Ditto.
|
||||||
|
|
||||||
Tue Sep 2 22:56:25 2014 Tanaka Akira <akr@fsij.org>
|
Tue Sep 2 22:56:25 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* process.c (rb_fork_async_signal_safe): Inline rb_fork_internal.
|
* process.c (rb_fork_async_signal_safe): Inline rb_fork_internal.
|
||||||
|
42
process.c
42
process.c
@ -3270,19 +3270,10 @@ read_retry(int fd, void *buf, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_child_error(int fd, int state, char *errmsg, size_t errmsg_buflen, int chfunc_is_async_signal_safe)
|
send_child_error(int fd, char *errmsg, size_t errmsg_buflen)
|
||||||
{
|
{
|
||||||
VALUE io = Qnil;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!chfunc_is_async_signal_safe) {
|
|
||||||
if (write_retry(fd, &state, sizeof(state)) == sizeof(state) && state) {
|
|
||||||
VALUE errinfo = rb_errinfo();
|
|
||||||
io = rb_io_fdopen(fd, O_WRONLY|O_BINARY, NULL);
|
|
||||||
rb_marshal_dump(errinfo, io);
|
|
||||||
rb_io_flush(io);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = errno;
|
err = errno;
|
||||||
if (write_retry(fd, &err, sizeof(err)) < 0) err = errno;
|
if (write_retry(fd, &err, sizeof(err)) < 0) err = errno;
|
||||||
if (errmsg && 0 < errmsg_buflen) {
|
if (errmsg && 0 < errmsg_buflen) {
|
||||||
@ -3291,42 +3282,25 @@ send_child_error(int fd, int state, char *errmsg, size_t errmsg_buflen, int chfu
|
|||||||
if (errmsg_buflen > 0 && write_retry(fd, errmsg, errmsg_buflen) < 0)
|
if (errmsg_buflen > 0 && write_retry(fd, errmsg, errmsg_buflen) < 0)
|
||||||
err = errno;
|
err = errno;
|
||||||
}
|
}
|
||||||
if (!NIL_P(io)) rb_io_close(io);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
recv_child_error(int fd, int *statep, VALUE *excp, int *errp, char *errmsg, size_t errmsg_buflen, int chfunc_is_async_signal_safe)
|
recv_child_error(int fd, int *errp, char *errmsg, size_t errmsg_buflen)
|
||||||
{
|
{
|
||||||
int err, state = 0;
|
int err;
|
||||||
VALUE io = Qnil;
|
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
VALUE exc = Qnil;
|
if ((size = read_retry(fd, &err, sizeof(err))) < 0) {
|
||||||
if (!chfunc_is_async_signal_safe) {
|
|
||||||
if ((read_retry(fd, &state, sizeof(state))) == sizeof(state) && state) {
|
|
||||||
io = rb_io_fdopen(fd, O_RDONLY|O_BINARY, NULL);
|
|
||||||
exc = rb_marshal_load(io);
|
|
||||||
rb_set_errinfo(exc);
|
|
||||||
}
|
|
||||||
if (!*statep && state) *statep = state;
|
|
||||||
*excp = exc;
|
|
||||||
}
|
|
||||||
#define READ_FROM_CHILD(ptr, len) \
|
|
||||||
(NIL_P(io) ? read_retry(fd, (ptr), (len)) : rb_io_bufread(io, (ptr), (len)))
|
|
||||||
if ((size = READ_FROM_CHILD(&err, sizeof(err))) < 0) {
|
|
||||||
err = errno;
|
err = errno;
|
||||||
}
|
}
|
||||||
*errp = err;
|
*errp = err;
|
||||||
if (size == sizeof(err) &&
|
if (size == sizeof(err) &&
|
||||||
errmsg && 0 < errmsg_buflen) {
|
errmsg && 0 < errmsg_buflen) {
|
||||||
ssize_t ret = READ_FROM_CHILD(errmsg, errmsg_buflen-1);
|
ssize_t ret = read_retry(fd, errmsg, errmsg_buflen-1);
|
||||||
if (0 <= ret) {
|
if (0 <= ret) {
|
||||||
errmsg[ret] = '\0';
|
errmsg[ret] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (NIL_P(io))
|
close(fd);
|
||||||
close(fd);
|
|
||||||
else
|
|
||||||
rb_io_close(io);
|
|
||||||
return size != 0;
|
return size != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3353,7 +3327,7 @@ rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), voi
|
|||||||
close(ep[0]);
|
close(ep[0]);
|
||||||
ret = chfunc(charg, errmsg, errmsg_buflen);
|
ret = chfunc(charg, errmsg, errmsg_buflen);
|
||||||
if (!ret) _exit(EXIT_SUCCESS);
|
if (!ret) _exit(EXIT_SUCCESS);
|
||||||
send_child_error(ep[1], state, errmsg, errmsg_buflen, chfunc_is_async_signal_safe);
|
send_child_error(ep[1], errmsg, errmsg_buflen);
|
||||||
#if EXIT_SUCCESS == 127
|
#if EXIT_SUCCESS == 127
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
#else
|
#else
|
||||||
@ -3361,7 +3335,7 @@ rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), voi
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
close(ep[1]);
|
close(ep[1]);
|
||||||
error_occurred = recv_child_error(ep[0], &state, &exc, &err, errmsg, errmsg_buflen, chfunc_is_async_signal_safe);
|
error_occurred = recv_child_error(ep[0], &err, errmsg, errmsg_buflen);
|
||||||
if (state || error_occurred) {
|
if (state || error_occurred) {
|
||||||
if (status) {
|
if (status) {
|
||||||
rb_protect(proc_syswait, (VALUE)pid, status);
|
rb_protect(proc_syswait, (VALUE)pid, status);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user