Rework order of operations to better handle last_status.

This commit is contained in:
Samuel Williams 2021-09-22 00:02:14 +12:00
Родитель 7db021f83b
Коммит bf3e314852
1 изменённых файлов: 6 добавлений и 9 удалений

Просмотреть файл

@ -4203,7 +4203,7 @@ retry_fork_async_signal_safe(struct rb_process_status *status, int *ep,
_exit(127);
#endif
}
err = errno;
err = errno;
waitpid_lock = waitpid_lock_init;
if (waitpid_lock) {
if (pid > 0 && w != WAITPID_LOCK_ONLY) {
@ -4768,14 +4768,15 @@ rb_f_system(int argc, VALUE *argv, VALUE _)
VALUE execarg_obj = rb_execarg_new(argc, argv, TRUE, TRUE);
struct rb_execarg *eargp = rb_execarg_get(execarg_obj);
struct rb_process_status status;
struct rb_process_status status = {0};
eargp->status = &status;
/* may be different from waitpid_state.pid on exec failure */
rb_pid_t pid = rb_execarg_spawn(execarg_obj, 0, 0);
rb_last_status_clear();
// This function can set the thread's last status.
// May be different from waitpid_state.pid on exec failure.
rb_pid_t pid = rb_execarg_spawn(execarg_obj, 0, 0);
if (pid > 0) {
VALUE status = rb_process_status_wait(pid, 0);
struct rb_process_status *data = RTYPEDDATA_DATA(status);
@ -4813,10 +4814,6 @@ rb_f_system(int argc, VALUE *argv, VALUE _)
RB_GC_GUARD(status);
}
if (status.pid > 0) {
GET_THREAD()->last_status = rb_process_status_new(status.pid, status.status, status.error);
}
if (eargp->exception) {
VALUE command = eargp->invoke.sh.shell_script;
RB_GC_GUARD(execarg_obj);