fix(fut): fix bug when calling wait_list []

This commit is contained in:
Simon Cruanes 2023-06-15 11:58:55 -04:00
parent e43c762c96
commit 446d6635a0
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -232,29 +232,36 @@ let peek_ok_assert_ (self : 'a t) : 'a =
| _ -> assert false | _ -> assert false
let join_container_ ~iter ~map ~len cont : _ t = let join_container_ ~iter ~map ~len cont : _ t =
let fut, promise = make () in let n_items = len cont in
let missing = A.make (len cont) in if n_items = 0 then (
(* no items, return now. *)
let cont_empty = map (fun _ -> assert false) cont in
return cont_empty
) else (
let fut, promise = make () in
let missing = A.make n_items in
(* callback called when a future in [a] is resolved *) (* callback called when a future in [a] is resolved *)
let on_res = function let on_res = function
| Ok _ -> | Ok _ ->
let n = A.fetch_and_add missing (-1) in let n = A.fetch_and_add missing (-1) in
if n = 1 then ( if n = 1 then (
(* last future, we know they all succeeded, so resolve [fut] *) (* last future, we know they all succeeded, so resolve [fut] *)
let res = map peek_ok_assert_ cont in let res = map peek_ok_assert_ cont in
fulfill promise (Ok res) fulfill promise (Ok res)
) )
| Error e_bt -> | Error e_bt ->
(* immediately cancel all other [on_res] *) (* immediately cancel all other [on_res] *)
let n = A.exchange missing 0 in let n = A.exchange missing 0 in
if n > 0 then if n > 0 then
(* we're the only one to set to 0, so we can fulfill [fut] (* we're the only one to set to 0, so we can fulfill [fut]
with an error. *) with an error. *)
fulfill promise (Error e_bt) fulfill promise (Error e_bt)
in in
iter (fun fut -> on_result fut on_res) cont; iter (fun fut -> on_result fut on_res) cont;
fut fut
)
let join_array (a : _ t array) : _ array t = let join_array (a : _ t array) : _ array t =
match Array.length a with match Array.length a with