Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
suspend_.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
type suspension = (unit, exn * Printexc.raw_backtrace) result -> unit type task = unit -> unit type suspension_handler = { handle: run:(task -> unit) -> suspension -> unit } [@@unboxed] [@@@ifge 5.0] [@@@ocaml.alert "-unstable"] module A = Atomic_ type _ Effect.t += Suspend : suspension_handler -> unit Effect.t let[@inline] suspend h = Effect.perform (Suspend h) let with_suspend ~(run : task -> unit) (f : unit -> unit) : unit = let module E = Effect.Deep in (* effect handler *) let effc : type e. e Effect.t -> ((e, _) E.continuation -> _) option = function | Suspend h -> Some (fun k -> let k' : suspension = function | Ok () -> E.continue k () | Error (exn, bt) -> E.discontinue_with_backtrace k exn bt in h.handle ~run k') | _ -> None in E.try_with f () { E.effc } (* DLA interop *) let prepare_for_await () : Dla_.t = (* current state *) let st : ((task -> unit) * suspension) option A.t = A.make None in let release () : unit = match A.exchange st None with | None -> () | Some (run, k) -> run (fun () -> k (Ok ())) and await () : unit = suspend { handle = (fun ~run k -> A.set st (Some (run, k))) } in let t = { Dla_.release; await } in t [@@@ocaml.alert "+unstable"] [@@@else_] let[@inline] with_suspend ~run:_ f = f () let[@inline] prepare_for_await () = { Dla_.release = ignore; await = ignore } [@@@endif]