mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-06 03:05:30 -05:00
feat: depend on picos, use picos.exn_bt
This commit is contained in:
parent
e3f11be0b3
commit
f1ff17dbd6
8 changed files with 35 additions and 46 deletions
|
|
@ -175,7 +175,10 @@ let close (self : _ t) : unit =
|
||||||
if A.compare_and_set self.st old_st St_closed then (
|
if A.compare_and_set self.st old_st St_closed then (
|
||||||
(* fail all waiters with [Closed]. *)
|
(* fail all waiters with [Closed]. *)
|
||||||
let bt = Printexc.get_callstack 10 in
|
let bt = Printexc.get_callstack 10 in
|
||||||
Q.iter (fun w -> Fut.fulfill_idempotent w (Error (Closed, bt))) ws;
|
Q.iter
|
||||||
|
(fun w ->
|
||||||
|
Fut.fulfill_idempotent w (Error { Exn_bt.exn = Closed; bt }))
|
||||||
|
ws;
|
||||||
false
|
false
|
||||||
) else
|
) else
|
||||||
true
|
true
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
(library
|
(library
|
||||||
(public_name moonpool)
|
(public_name moonpool)
|
||||||
(name moonpool)
|
(name moonpool)
|
||||||
(libraries moonpool.private moonpool.dpool)
|
(libraries moonpool.private moonpool.dpool picos.exn_bt picos)
|
||||||
(flags :standard -open Moonpool_private)
|
(flags :standard -open Moonpool_private)
|
||||||
(private_modules types_ util_pool_)
|
(private_modules types_ util_pool_)
|
||||||
(preprocess
|
(preprocess
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,9 @@
|
||||||
type t = exn * Printexc.raw_backtrace
|
include Picos_exn_bt
|
||||||
|
|
||||||
let[@inline] make exn bt : t = exn, bt
|
let[@inline] make exn bt : t = { exn; bt }
|
||||||
let[@inline] exn (e, _) = e
|
let[@inline] exn self = self.exn
|
||||||
let[@inline] bt (_, bt) = bt
|
let[@inline] bt self = self.bt
|
||||||
|
let show self = Printexc.to_string (exn self)
|
||||||
let[@inline] get exn =
|
|
||||||
let bt = Printexc.get_raw_backtrace () in
|
|
||||||
make exn bt
|
|
||||||
|
|
||||||
let[@inline] get_callstack n exn =
|
|
||||||
let bt = Printexc.get_callstack n in
|
|
||||||
make exn bt
|
|
||||||
|
|
||||||
let show self = Printexc.to_string (fst self)
|
|
||||||
let pp out self = Format.pp_print_string out (show self)
|
let pp out self = Format.pp_print_string out (show self)
|
||||||
let[@inline] raise self = Printexc.raise_with_backtrace (exn self) (bt self)
|
|
||||||
|
|
||||||
type nonrec 'a result = ('a, t) result
|
type nonrec 'a result = ('a, t) result
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
(** Exception with backtrace.
|
(** Exception with backtrace.
|
||||||
|
|
||||||
|
Type changed @since NEXT_RELEASE
|
||||||
|
|
||||||
@since 0.6 *)
|
@since 0.6 *)
|
||||||
|
|
||||||
type t = exn * Printexc.raw_backtrace
|
include module type of Picos_exn_bt
|
||||||
(** An exception bundled with a backtrace *)
|
(** An exception bundled with a backtrace *)
|
||||||
|
|
||||||
val exn : t -> exn
|
val exn : t -> exn
|
||||||
|
|
@ -11,14 +13,6 @@ val bt : t -> Printexc.raw_backtrace
|
||||||
val make : exn -> Printexc.raw_backtrace -> t
|
val make : exn -> Printexc.raw_backtrace -> t
|
||||||
(** Trivial builder *)
|
(** Trivial builder *)
|
||||||
|
|
||||||
val get : exn -> t
|
|
||||||
(** [get exn] is [make exn (get_raw_backtrace ())] *)
|
|
||||||
|
|
||||||
val get_callstack : int -> exn -> t
|
|
||||||
|
|
||||||
val raise : t -> 'a
|
|
||||||
(** Raise the exception with its save backtrace *)
|
|
||||||
|
|
||||||
val show : t -> string
|
val show : t -> string
|
||||||
(** Simple printing *)
|
(** Simple printing *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ let make () =
|
||||||
|
|
||||||
let[@inline] of_result x : _ t = { st = A.make (Done x) }
|
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 exn bt : _ t = of_result (Error { Exn_bt.exn; bt })
|
||||||
let[@inline] fail_exn_bt ebt = of_result (Error ebt)
|
let[@inline] fail_exn_bt ebt = of_result (Error ebt)
|
||||||
|
|
||||||
let[@inline] is_resolved self : bool =
|
let[@inline] is_resolved self : bool =
|
||||||
|
|
@ -59,7 +59,7 @@ let[@inline] get_or_fail self =
|
||||||
let[@inline] get_or_fail_exn self =
|
let[@inline] get_or_fail_exn self =
|
||||||
match A.get self.st with
|
match A.get self.st with
|
||||||
| Done (Ok x) -> x
|
| Done (Ok x) -> x
|
||||||
| Done (Error (exn, bt)) -> Printexc.raise_with_backtrace exn bt
|
| Done (Error { exn; bt }) -> Printexc.raise_with_backtrace exn bt
|
||||||
| Waiting _ -> raise Not_ready
|
| Waiting _ -> raise Not_ready
|
||||||
|
|
||||||
let on_result (self : _ t) (f : _ waiter) : unit =
|
let on_result (self : _ t) (f : _ waiter) : unit =
|
||||||
|
|
@ -108,9 +108,9 @@ let spawn ~on f : _ t =
|
||||||
let task () =
|
let task () =
|
||||||
let res =
|
let res =
|
||||||
try Ok (f ())
|
try Ok (f ())
|
||||||
with e ->
|
with exn ->
|
||||||
let bt = Printexc.get_raw_backtrace () in
|
let bt = Printexc.get_raw_backtrace () in
|
||||||
Error (e, bt)
|
Error { Exn_bt.exn; bt }
|
||||||
in
|
in
|
||||||
fulfill promise res
|
fulfill promise res
|
||||||
in
|
in
|
||||||
|
|
@ -141,9 +141,9 @@ let map ?on ~f fut : _ t =
|
||||||
match r with
|
match r with
|
||||||
| Ok x ->
|
| Ok x ->
|
||||||
(try Ok (f x)
|
(try Ok (f x)
|
||||||
with e ->
|
with exn ->
|
||||||
let bt = Printexc.get_raw_backtrace () in
|
let bt = Printexc.get_raw_backtrace () in
|
||||||
Error (e, bt))
|
Error { Exn_bt.exn; bt })
|
||||||
| Error e_bt -> Error e_bt
|
| Error e_bt -> Error e_bt
|
||||||
in
|
in
|
||||||
|
|
||||||
|
|
@ -167,7 +167,7 @@ let map ?on ~f fut : _ t =
|
||||||
let join (fut : 'a t t) : 'a t =
|
let join (fut : 'a t t) : 'a t =
|
||||||
match peek fut with
|
match peek fut with
|
||||||
| Some (Ok f) -> f
|
| Some (Ok f) -> f
|
||||||
| Some (Error (e, bt)) -> fail e bt
|
| Some (Error ebt) -> fail_exn_bt ebt
|
||||||
| None ->
|
| None ->
|
||||||
let fut2, promise = make () in
|
let fut2, promise = make () in
|
||||||
on_result fut (function
|
on_result fut (function
|
||||||
|
|
@ -183,7 +183,7 @@ let bind ?on ~f fut : _ t =
|
||||||
with e ->
|
with e ->
|
||||||
let bt = Printexc.get_raw_backtrace () in
|
let bt = Printexc.get_raw_backtrace () in
|
||||||
fail e bt)
|
fail e bt)
|
||||||
| Error (e, bt) -> fail e bt
|
| Error ebt -> fail_exn_bt ebt
|
||||||
in
|
in
|
||||||
|
|
||||||
let bind_and_fulfill (r : _ result) promise () : unit =
|
let bind_and_fulfill (r : _ result) promise () : unit =
|
||||||
|
|
@ -226,7 +226,7 @@ let update_atomic_ (st : 'a A.t) f : 'a =
|
||||||
let both a b : _ t =
|
let both a b : _ t =
|
||||||
match peek a, peek b with
|
match peek a, peek b with
|
||||||
| 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 ebt), _ | _, Some (Error ebt) -> fail_exn_bt ebt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make () in
|
let fut, promise = make () in
|
||||||
|
|
||||||
|
|
@ -259,7 +259,7 @@ let choose a b : _ t =
|
||||||
match peek a, peek b with
|
match peek a, peek b with
|
||||||
| Some (Ok x), _ -> return (Either.Left x)
|
| Some (Ok x), _ -> return (Either.Left x)
|
||||||
| _, 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 ebt), Some (Error _) -> fail_exn_bt ebt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make () in
|
let fut, promise = make () in
|
||||||
|
|
||||||
|
|
@ -282,7 +282,7 @@ let choose_same a b : _ t =
|
||||||
match peek a, peek b with
|
match peek a, peek b with
|
||||||
| Some (Ok x), _ -> return x
|
| Some (Ok x), _ -> return x
|
||||||
| _, Some (Ok y) -> return y
|
| _, Some (Ok y) -> return y
|
||||||
| Some (Error (e, bt)), Some (Error _) -> fail e bt
|
| Some (Error ebt), Some (Error _) -> fail_exn_bt ebt
|
||||||
| _ ->
|
| _ ->
|
||||||
let fut, promise = make () in
|
let fut, promise = make () in
|
||||||
|
|
||||||
|
|
@ -415,7 +415,7 @@ let wait_block (self : 'a t) : 'a or_error =
|
||||||
let wait_block_exn self =
|
let wait_block_exn self =
|
||||||
match wait_block self with
|
match wait_block self with
|
||||||
| Ok x -> x
|
| Ok x -> x
|
||||||
| Error (e, bt) -> Printexc.raise_with_backtrace e bt
|
| Error { exn; bt } -> Printexc.raise_with_backtrace exn bt
|
||||||
|
|
||||||
[@@@ifge 5.0]
|
[@@@ifge 5.0]
|
||||||
|
|
||||||
|
|
@ -425,7 +425,7 @@ let await (fut : 'a t) : 'a =
|
||||||
(* fast path: peek *)
|
(* fast path: peek *)
|
||||||
(match res with
|
(match res with
|
||||||
| Ok x -> x
|
| Ok x -> x
|
||||||
| Error (exn, bt) -> Printexc.raise_with_backtrace exn bt)
|
| Error { exn; bt } -> Printexc.raise_with_backtrace exn bt)
|
||||||
| None ->
|
| None ->
|
||||||
(* suspend until the future is resolved *)
|
(* suspend until the future is resolved *)
|
||||||
Suspend_.suspend
|
Suspend_.suspend
|
||||||
|
|
@ -436,9 +436,9 @@ let await (fut : 'a t) : 'a =
|
||||||
| Ok _ ->
|
| Ok _ ->
|
||||||
(* schedule continuation with the same name *)
|
(* schedule continuation with the same name *)
|
||||||
resume k (Ok ())
|
resume k (Ok ())
|
||||||
| Error (exn, bt) ->
|
| Error ebt ->
|
||||||
(* fail continuation immediately *)
|
(* fail continuation immediately *)
|
||||||
resume k (Error (exn, bt))));
|
resume k (Error ebt)));
|
||||||
};
|
};
|
||||||
(* un-suspended: we should have a result! *)
|
(* un-suspended: we should have a result! *)
|
||||||
get_or_fail_exn fut
|
get_or_fail_exn fut
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ let with_suspend (WSH { on_suspend; run; resume }) (f : unit -> unit) : unit =
|
||||||
let state = on_suspend () in
|
let state = on_suspend () in
|
||||||
let k' : suspension = function
|
let k' : suspension = function
|
||||||
| Ok () -> E.continue k ()
|
| Ok () -> E.continue k ()
|
||||||
| Error (exn, bt) -> E.discontinue_with_backtrace k exn bt
|
| Error ebt -> Exn_bt.discontinue k ebt
|
||||||
in
|
in
|
||||||
h.handle ~run:(run state) ~resume:(resume state) k')
|
h.handle ~run:(run state) ~resume:(resume state) k')
|
||||||
| Yield ->
|
| Yield ->
|
||||||
|
|
@ -54,7 +54,7 @@ let with_suspend (WSH { on_suspend; run; resume }) (f : unit -> unit) : unit =
|
||||||
let state = on_suspend () in
|
let state = on_suspend () in
|
||||||
let k' : suspension = function
|
let k' : suspension = function
|
||||||
| Ok () -> E.continue k ()
|
| Ok () -> E.continue k ()
|
||||||
| Error (exn, bt) -> E.discontinue_with_backtrace k exn bt
|
| Error ebt -> Exn_bt.discontinue k ebt
|
||||||
in
|
in
|
||||||
resume state k' @@ Ok ())
|
resume state k' @@ Ok ())
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@ let for_ ?chunk_size n (f : int -> int -> unit) : unit =
|
||||||
if not (A.exchange has_failed true) then
|
if not (A.exchange has_failed true) then
|
||||||
(* first one to fail, and [missing] must be >= 2
|
(* first one to fail, and [missing] must be >= 2
|
||||||
because we're not decreasing it. *)
|
because we're not decreasing it. *)
|
||||||
resume suspension (Error (exn, bt))
|
resume suspension (Error { Exn_bt.exn; bt })
|
||||||
in
|
in
|
||||||
|
|
||||||
let i = ref 0 in
|
let i = ref 0 in
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ let lwt_of_fut (fut : 'a M.Fut.t) : 'a Lwt.t =
|
||||||
let lwt_fut, lwt_prom = Lwt.wait () in
|
let lwt_fut, lwt_prom = Lwt.wait () in
|
||||||
M.Fut.on_result fut (function
|
M.Fut.on_result fut (function
|
||||||
| Ok x -> Perform_action_in_lwt.schedule @@ Action.Wakeup (lwt_prom, x)
|
| Ok x -> Perform_action_in_lwt.schedule @@ Action.Wakeup (lwt_prom, x)
|
||||||
| Error (exn, _) ->
|
| Error { exn; _ } ->
|
||||||
Perform_action_in_lwt.schedule @@ Action.Wakeup_exn (lwt_prom, exn));
|
Perform_action_in_lwt.schedule @@ Action.Wakeup_exn (lwt_prom, exn));
|
||||||
lwt_fut
|
lwt_fut
|
||||||
|
|
||||||
|
|
@ -101,7 +101,9 @@ let fut_of_lwt (lwt_fut : _ Lwt.t) : _ M.Fut.t =
|
||||||
let fut, prom = M.Fut.make () in
|
let fut, prom = M.Fut.make () in
|
||||||
Lwt.on_any lwt_fut
|
Lwt.on_any lwt_fut
|
||||||
(fun x -> M.Fut.fulfill prom (Ok x))
|
(fun x -> M.Fut.fulfill prom (Ok x))
|
||||||
(fun e -> M.Fut.fulfill prom (Error (e, Printexc.get_callstack 10)));
|
(fun exn ->
|
||||||
|
let bt = Printexc.get_callstack 10 in
|
||||||
|
M.Fut.fulfill prom (Error { Exn_bt.exn; bt }));
|
||||||
fut
|
fut
|
||||||
|
|
||||||
let await_lwt (fut : _ Lwt.t) =
|
let await_lwt (fut : _ Lwt.t) =
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue