]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Don't block for child exit if other commands have completed
authorPaul Smith <psmith@gnu.org>
Sun, 19 Feb 2023 05:40:48 +0000 (00:40 -0500)
committerPaul Smith <psmith@gnu.org>
Sun, 19 Feb 2023 06:27:22 +0000 (01:27 -0500)
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.

src/remake.c

index 5988c20c9b52e14a11ecf3546d2881715634b013..fe67ab280b3b1bbb4b4c7ff63d97b2f2e764d97e 100644 (file)
@@ -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;