mirror of https://github.com/mirror/busybox.git
ash: open-code blocking_dowait_with_raise_on_sig()
There is in fact only one callsite. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>1_26_stable
parent
b543bdadb3
commit
6918811014
25
shell/ash.c
25
shell/ash.c
|
@ -4032,15 +4032,6 @@ dowait(int block, struct job *job)
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
blocking_dowait_with_raise_on_sig(void)
|
|
||||||
{
|
|
||||||
pid_t pid = dowait(DOWAIT_BLOCK, NULL);
|
|
||||||
if (pid <= 0 && pending_sig)
|
|
||||||
raise_exception(EXSIG);
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if JOBS
|
#if JOBS
|
||||||
static void
|
static void
|
||||||
showjob(struct job *jp, int mode)
|
showjob(struct job *jp, int mode)
|
||||||
|
@ -4229,19 +4220,14 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
|
||||||
jp->waited = 1;
|
jp->waited = 1;
|
||||||
jp = jp->prev_job;
|
jp = jp->prev_job;
|
||||||
}
|
}
|
||||||
blocking_dowait_with_raise_on_sig();
|
dowait(DOWAIT_BLOCK, NULL);
|
||||||
/* man bash:
|
/* man bash:
|
||||||
* "When bash is waiting for an asynchronous command via
|
* "When bash is waiting for an asynchronous command via
|
||||||
* the wait builtin, the reception of a signal for which a trap
|
* the wait builtin, the reception of a signal for which a trap
|
||||||
* has been set will cause the wait builtin to return immediately
|
* has been set will cause the wait builtin to return immediately
|
||||||
* with an exit status greater than 128, immediately after which
|
* with an exit status greater than 128, immediately after which
|
||||||
* the trap is executed."
|
* the trap is executed."
|
||||||
*
|
*/
|
||||||
* blocking_dowait_with_raise_on_sig raises signal handlers
|
|
||||||
* if it gets no pid (pid < 0). However,
|
|
||||||
* if child sends us a signal *and immediately exits*,
|
|
||||||
* blocking_dowait_with_raise_on_sig gets pid > 0
|
|
||||||
* and does not handle pending_sig. Check this case: */
|
|
||||||
if (pending_sig)
|
if (pending_sig)
|
||||||
raise_exception(EXSIG);
|
raise_exception(EXSIG);
|
||||||
}
|
}
|
||||||
|
@ -4263,8 +4249,11 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
|
||||||
job = getjob(*argv, 0);
|
job = getjob(*argv, 0);
|
||||||
}
|
}
|
||||||
/* loop until process terminated or stopped */
|
/* loop until process terminated or stopped */
|
||||||
while (job->state == JOBRUNNING)
|
while (job->state == JOBRUNNING) {
|
||||||
blocking_dowait_with_raise_on_sig();
|
pid_t pid = dowait(DOWAIT_BLOCK, NULL);
|
||||||
|
if (pid <= 0 && pending_sig)
|
||||||
|
raise_exception(EXSIG);
|
||||||
|
}
|
||||||
job->waited = 1;
|
job->waited = 1;
|
||||||
retval = getstatus(job);
|
retval = getstatus(job);
|
||||||
repeat: ;
|
repeat: ;
|
||||||
|
|
Loading…
Reference in New Issue