mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-06 03:05:30 -05:00
perf: reduce size of Fut again
This commit is contained in:
parent
4abc334ab3
commit
8d83d5b691
1 changed files with 21 additions and 17 deletions
38
src/fut.ml
38
src/fut.ml
|
|
@ -5,20 +5,24 @@ type 'a waiter = 'a or_error -> unit
|
||||||
|
|
||||||
type 'a state =
|
type 'a state =
|
||||||
| Done of 'a or_error
|
| Done of 'a or_error
|
||||||
| Waiting of { waiters: 'a waiter list }
|
| Waiting of {
|
||||||
|
waiters: 'a waiter list;
|
||||||
type 'a t = {
|
name: string;
|
||||||
st: 'a state A.t;
|
}
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
type 'a t = { st: 'a state A.t } [@@unboxed]
|
||||||
type 'a promise = 'a t
|
type 'a promise = 'a t
|
||||||
|
|
||||||
|
let[@inline] get_name_ (self : _ t) =
|
||||||
|
match A.get self.st with
|
||||||
|
| Done _ -> ""
|
||||||
|
| Waiting { name; _ } -> name
|
||||||
|
|
||||||
let make ?(name = "") () =
|
let make ?(name = "") () =
|
||||||
let fut = { st = A.make (Waiting { waiters = [] }); name } in
|
let fut = { st = A.make (Waiting { waiters = []; name }) } in
|
||||||
fut, fut
|
fut, fut
|
||||||
|
|
||||||
let[@inline] of_result x : _ t = { st = A.make (Done x); name = "" }
|
let[@inline] of_result x : _ t = { st = A.make (Done x) }
|
||||||
let[@inline] return x : _ t = of_result (Ok x)
|
let[@inline] return x : _ t = of_result (Ok x)
|
||||||
let[@inline] fail e bt : _ t = of_result (Error (e, bt))
|
let[@inline] fail e bt : _ t = of_result (Error (e, bt))
|
||||||
|
|
||||||
|
|
@ -57,8 +61,8 @@ let on_result (self : _ t) (f : _ waiter) : unit =
|
||||||
| Done x ->
|
| Done x ->
|
||||||
f x;
|
f x;
|
||||||
false
|
false
|
||||||
| Waiting { waiters = l } ->
|
| Waiting { waiters = l; name } ->
|
||||||
not (A.compare_and_set self.st st (Waiting { waiters = f :: l }))
|
not (A.compare_and_set self.st st (Waiting { waiters = f :: l; name }))
|
||||||
do
|
do
|
||||||
Domain_.relax ()
|
Domain_.relax ()
|
||||||
done
|
done
|
||||||
|
|
@ -71,7 +75,7 @@ let fulfill (self : _ t) (r : _ result) : unit =
|
||||||
let st = A.get self.st in
|
let st = A.get self.st in
|
||||||
match st with
|
match st with
|
||||||
| Done _ -> raise Already_fulfilled
|
| Done _ -> raise Already_fulfilled
|
||||||
| Waiting { waiters = l } ->
|
| Waiting { waiters = l; name = _ } ->
|
||||||
let did_swap = A.compare_and_set self.st st (Done r) in
|
let did_swap = A.compare_and_set self.st st (Done r) in
|
||||||
if did_swap then (
|
if did_swap then (
|
||||||
(* success, now call all the waiters *)
|
(* success, now call all the waiters *)
|
||||||
|
|
@ -135,7 +139,7 @@ let map ?on ~f fut : _ t =
|
||||||
| Error e_bt -> Error e_bt
|
| Error e_bt -> Error e_bt
|
||||||
in
|
in
|
||||||
|
|
||||||
let name = fut.name in
|
let name = get_name_ fut in
|
||||||
match peek fut, get_runner_ ?on () with
|
match peek fut, get_runner_ ?on () with
|
||||||
| Some res, None -> of_result @@ map_immediate_ res
|
| Some res, None -> of_result @@ map_immediate_ res
|
||||||
| Some res, Some runner ->
|
| Some res, Some runner ->
|
||||||
|
|
@ -159,7 +163,7 @@ let join (fut : 'a t t) : 'a t =
|
||||||
| Some (Ok f) -> f
|
| Some (Ok f) -> f
|
||||||
| Some (Error (e, bt)) -> fail e bt
|
| Some (Error (e, bt)) -> fail e bt
|
||||||
| None ->
|
| None ->
|
||||||
let fut2, promise = make ~name:fut.name () in
|
let fut2, promise = make ~name:(get_name_ fut) () in
|
||||||
on_result fut (function
|
on_result fut (function
|
||||||
| Ok sub_fut -> on_result sub_fut (fulfill promise)
|
| Ok sub_fut -> on_result sub_fut (fulfill promise)
|
||||||
| Error _ as e -> fulfill promise e);
|
| Error _ as e -> fulfill promise e);
|
||||||
|
|
@ -182,7 +186,7 @@ let bind ?on ~f fut : _ t =
|
||||||
on_result f_res_fut (fun r -> fulfill promise r)
|
on_result f_res_fut (fun r -> fulfill promise r)
|
||||||
in
|
in
|
||||||
|
|
||||||
let name = fut.name in
|
let name = get_name_ fut in
|
||||||
match peek fut, get_runner_ ?on () with
|
match peek fut, get_runner_ ?on () with
|
||||||
| Some res, Some runner ->
|
| Some res, Some runner ->
|
||||||
let fut2, promise = make ~name () in
|
let fut2, promise = make ~name () in
|
||||||
|
|
@ -219,7 +223,7 @@ let both a b : _ t =
|
||||||
| Some (Ok x), Some (Ok y) -> return (x, y)
|
| Some (Ok x), Some (Ok y) -> return (x, y)
|
||||||
| Some (Error (e, bt)), _ | _, Some (Error (e, bt)) -> fail e bt
|
| Some (Error (e, bt)), _ | _, Some (Error (e, bt)) -> fail e bt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make ~name:a.name () in
|
let fut, promise = make ~name:(get_name_ a) () in
|
||||||
|
|
||||||
let st = A.make `Neither in
|
let st = A.make `Neither in
|
||||||
on_result a (function
|
on_result a (function
|
||||||
|
|
@ -252,7 +256,7 @@ let choose a b : _ t =
|
||||||
| _, Some (Ok y) -> return (Either.Right y)
|
| _, Some (Ok y) -> return (Either.Right y)
|
||||||
| Some (Error (e, bt)), Some (Error _) -> fail e bt
|
| Some (Error (e, bt)), Some (Error _) -> fail e bt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make ~name:a.name () in
|
let fut, promise = make ~name:(get_name_ a) () in
|
||||||
|
|
||||||
let one_failure = A.make false in
|
let one_failure = A.make false in
|
||||||
on_result a (function
|
on_result a (function
|
||||||
|
|
@ -275,7 +279,7 @@ let choose_same a b : _ t =
|
||||||
| _, Some (Ok y) -> return y
|
| _, Some (Ok y) -> return y
|
||||||
| Some (Error (e, bt)), Some (Error _) -> fail e bt
|
| Some (Error (e, bt)), Some (Error _) -> fail e bt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make ~name:a.name () in
|
let fut, promise = make ~name:(get_name_ a) () in
|
||||||
|
|
||||||
let one_failure = A.make false in
|
let one_failure = A.make false in
|
||||||
on_result a (function
|
on_result a (function
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue