# HG changeset patch # User wenzelm # Date 1596640775 -7200 # Node ID 43a43b182a81f06f274c59b1157ffaeef20722e4 # Parent 3ec8761815274858355fed8ff059ac6ef14de282# Parent 41e1e2395a67e9ab01a23d428d91fc02dc2481a6 merged diff -r 3ec876181527 -r 43a43b182a81 src/Pure/Concurrent/future.ML --- a/src/Pure/Concurrent/future.ML Wed Aug 05 08:47:45 2020 +0000 +++ b/src/Pure/Concurrent/future.ML Wed Aug 05 17:19:35 2020 +0200 @@ -27,7 +27,7 @@ val default_params: params val forks: params -> (unit -> 'a) list -> 'a future list val fork: (unit -> 'a) -> 'a future - val get_finished: 'a future -> 'a + val get_result: 'a future -> 'a Exn.result val join_results: 'a future list -> 'a Exn.result list val join_result: 'a future -> 'a Exn.result val joins: 'a future list -> 'a list @@ -320,11 +320,14 @@ val max_active0 = ! max_active; val max_workers0 = ! max_workers; + val workers_waiting = count_workers Waiting; + val m = if ! do_shutdown andalso Task_Queue.all_passive (! queue) then 0 else Multithreading.max_threads (); val _ = max_active := m; - val _ = max_workers := 2 * m; + val _ = max_workers := + Int.max (2 * m, if workers_waiting > 0 then workers_waiting + 1 else 0); val missing = ! max_workers - length (! workers); val _ = @@ -508,8 +511,6 @@ | exns => Exn.Exn (Par_Exn.make exns)) else res); -fun get_finished x = Exn.release (get_result x); - local fun join_next atts deps = (*requires SYNCHRONIZED*) diff -r 3ec876181527 -r 43a43b182a81 src/Pure/Concurrent/lazy.ML --- a/src/Pure/Concurrent/lazy.ML Wed Aug 05 08:47:45 2020 +0000 +++ b/src/Pure/Concurrent/lazy.ML Wed Aug 05 17:19:35 2020 +0200 @@ -103,7 +103,7 @@ let val res0 = Exn.capture (restore_attributes e) (); val _ = Exn.capture (fn () => Future.fulfill_result x res0) (); - val res = Future.join_result x; + val res = Future.get_result x; val _ = if not (Exn.is_interrupt_exn res) then Synchronized.assign var (Result (Future.value_result res))