summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2023-02-19 00:40:48 -0500
committerPaul Smith <psmith@gnu.org>2023-02-19 01:27:22 -0500
commit4c9b92256088ddd6fc9e840869f4fe52de4bebc3 (patch)
tree113da1d86aea816468103dd2328c41962724c2f2
parent2449ef3c88e6b1369137681c3a7370d777c332c1 (diff)
downloadmake-git-4c9b92256088ddd6fc9e840869f4fe52de4bebc3.tar.gz
Don't block for child exit if other commands have completed
Running regression tests on a single CPU system shows that if a child exits while we're checking prerequisites we might not notice it, and then we might block waiting for the next child to exit before we try to do more work even though we could. * src/remake.c (update_goal_chain): Remember the command_count before we start checking prerequisites and if it is different when we restart at the top of the goal chain then don't block.
-rw-r--r--src/remake.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/remake.c b/src/remake.c
index 5988c20c..fe67ab28 100644
--- a/src/remake.c
+++ b/src/remake.c
@@ -109,6 +109,7 @@ check_also_make (const struct file *file)
enum update_status
update_goal_chain (struct goaldep *goaldeps)
{
+ unsigned long last_cmd_count = 0;
int t = touch_flag, q = question_flag, n = just_print_flag;
enum update_status status = us_none;
@@ -134,9 +135,12 @@ update_goal_chain (struct goaldep *goaldeps)
start_waiting_jobs ();
- /* Wait for a child to die. */
+ /* Check for exited children. If no children have finished since the
+ last time we looked, then block until one exits. If some have
+ exited don't block, so we can possibly do more work. */
- reap_children (1, 0);
+ reap_children (last_cmd_count == command_count, 0);
+ last_cmd_count = command_count;
lastgoal = 0;
gu = goals;