package picos
Pico scheduler framework
Install
Dune Dependency
Authors
Maintainers
Sources
picos-0.1.0.tbz
sha256=0f2dcc67ddd127c68f388f2c36a8725a15723e6aeba7d1ddfcf4e016b54a4674
sha512=bee2a99458a451be285e2f13cc3a9deda8eed4e118bcdfc51c256d2da5bae92eec3386c318fe42dcf451421543b519dc064967158b3f417c9b7b44ce97c5fb75
doc/src/picos.threaded/picos_threaded.ml.html
Source file picos_threaded.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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
open Picos type t = { fiber : Fiber.t; mutex : Mutex.t; condition : Condition.t } let create ~forbid computation = let fiber = Fiber.create ~forbid computation in let mutex = Mutex.create () in let condition = Condition.create () in { fiber; mutex; condition } let block trigger t = (* We block fibers (or threads) on a per thread mutex and condition. *) Mutex.lock t.mutex; match while not (Trigger.is_signaled trigger) do Condition.wait t.condition t.mutex done with | () -> Mutex.unlock t.mutex | exception exn -> (* Condition.wait may be interrupted by asynchronous exceptions and we must make sure to unlock even in that case. *) Mutex.unlock t.mutex; raise exn let resume trigger t _ = let _is_canceled : bool = Fiber.unsuspend t.fiber trigger in (* This will be called when the trigger is signaled. We simply broadcast on the per thread condition variable. *) Mutex.lock t.mutex; Mutex.unlock t.mutex; Condition.broadcast t.condition let[@alert "-handler"] rec await t trigger = if Fiber.try_suspend t.fiber trigger t t resume then block trigger t; Fiber.canceled t.fiber and current t = (* The current handler must never propagate cancelation, but it would be possible to yield here to run some other fiber before resuming the current fiber. *) t.fiber and yield t = (* In other handlers we need to account for cancelation. *) Fiber.check t.fiber; Systhreads.yield () and cancel_after : type a. _ -> a Computation.t -> _ = (* We need an explicit type signature to allow OCaml to generalize the tyoe as all of the handlers are in a single recursive definition. *) fun t computation ~seconds exn_bt -> Fiber.check t.fiber; Select.cancel_after computation ~seconds exn_bt and spawn : type a. _ -> forbid:bool -> a Computation.t -> _ = fun t ~forbid computation mains -> Fiber.check t.fiber; mains |> List.iter @@ fun main -> Systhreads.create (fun () -> (* We need to (recursively) install the handler on each new thread that we create. *) Handler.using handler (create ~forbid computation) main) () |> ignore and handler = Handler.{ current; spawn; yield; cancel_after; await } let run ~forbid main = Handler.using handler (create ~forbid (Computation.create ())) main
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>