← Commit list

691881101

Denys Vlasenko
Denys Vlasenko
2016-10-27
SUCCESS Duration: 207s

Subject

ash: open-code blocking_dowait_with_raise_on_sig()

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash.c+7 -18
@@ -4032,15 +4032,6 @@ dowait(int block, struct job *job)
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
static void
showjob(struct job *jp, int mode)
@@ -4229,19 +4220,14 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
jp->waited = 1;
jp = jp->prev_job;
}
- blocking_dowait_with_raise_on_sig();
+ dowait(DOWAIT_BLOCK, NULL);
/* man bash:
* "When bash is waiting for an asynchronous command via
* the wait builtin, the reception of a signal for which a trap
* has been set will cause the wait builtin to return immediately
* with an exit status greater than 128, immediately after which
* 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)
raise_exception(EXSIG);
}
@@ -4263,8 +4249,11 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
job = getjob(*argv, 0);
}
/* loop until process terminated or stopped */
- while (job->state == JOBRUNNING)
- blocking_dowait_with_raise_on_sig();
+ while (job->state == JOBRUNNING) {
+ pid_t pid = dowait(DOWAIT_BLOCK, NULL);
+ if (pid <= 0 && pending_sig)
+ raise_exception(EXSIG);
+ }
job->waited = 1;
retval = getstatus(job);
repeat: ;