jobs: Wait for completion even in the error case.
authorRichard W.M. Jones <rjones@redhat.com>
Fri, 10 Jan 2020 19:38:43 +0000 (19:38 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Fri, 10 Jan 2020 19:38:43 +0000 (19:38 +0000)
Previously if we hit an error (last_exn being set) then we exited the
loop immediately and re-raised the exception.  However this means jobs
which are still running would continue to run after goals exited.
Move the wait code outside the loop to ensure we always wait for jobs
to complete even in the error case.

src/jobs.ml

index 085d466..2e8735e 100644 (file)
@@ -52,13 +52,7 @@ let run next_job retire_job string_of_job =
   let rec loop () =
     if !last_exn = None then (
       match next_job () with
-      | Complete ->
-         if !running > 0 then (
-           Cmdline.debug "%d/%d threads running, waiting for completion"
-             !running (Cmdline.nr_jobs ());
-           Condition.wait cond lock;
-           loop ()
-         )
+      | Complete -> ()
       | Not_ready ->
          assert (!running > 0);
          Cmdline.debug "%d/%d threads running, waiting for dependencies"
@@ -80,6 +74,14 @@ let run next_job retire_job string_of_job =
   in
   Mutex.lock lock;
   loop ();
+
+  (* Wait for all jobs to complete. *)
+  while !running > 0 do
+    Cmdline.debug "%d/%d threads running, waiting for completion"
+      !running (Cmdline.nr_jobs ());
+    Condition.wait cond lock
+  done;
+
   let exn = !last_exn in
   Mutex.unlock lock;