Module Sequencer_table.Make
Parameters
Signature
type ('state, 'job_tag) t
Every
Key.t
in the table has an associatedstate
, which each job running on that key gets access to. Jobs maybe have an associatedjob_tag
which is provided purely to assist debugging, as the tag is included in the sexp serialization oft
.
val sexp_of_t : ('state -> Ppx_sexp_conv_lib.Sexp.t) -> ('job_tag -> Ppx_sexp_conv_lib.Sexp.t) -> ('state, 'job_tag) t -> Ppx_sexp_conv_lib.Sexp.t
val create : unit -> (_, _) t
val enqueue : ('state, 'job_tag) t -> key:Key.t -> ?tag:'job_tag -> ('state option -> 'b Async.Deferred.t) -> 'b Async.Deferred.t
enqueue t ~key f
enqueuesf
forkey
.f
will be called with the state ofkey
when invoked.Invariant 1: it is guaranteed that
f
will not be called immediately.Invariant 2: if
f
raises, then the exception will be raised to the monitor in effect whenenqueue
was called. Subsequent jobs forkey
will proceed.Invariant 3: to avoid race, there are no deferred operations between finding the state and calling
f
with the state found. Otherwise, the user would need to consider the race that the state passed tof
might have been changed byset_state
.
val set_state : ('state, _) t -> key:Key.t -> 'state option -> unit
set_state t key state_opt
sets the state forkey
immediately. The state will be kept internally until set toNone
val find_state : ('state, _) t -> Key.t -> 'state option
val num_unfinished_jobs : (_, _) t -> Key.t -> int
num_unfinished_jobs t key
returns the number of jobs forkey
including including pending and running.
val mem : (_, _) t -> Key.t -> bool
mem t key
returnstrue
if there is state or an pending/running job
val fold : ('state, _) t -> init:'b -> f:('b -> key:Key.t -> 'state option -> 'b) -> 'b
Fold over keys with states or pending/running jobs. It's safe to mutate (
enqueue
orset_state
) when folding
val prior_jobs_done : (_, _) t -> unit Async.Deferred.t
The result is determined when all jobs enqueued before this are finished. The implementation adds a new job to every key currently with at least one running job attached, so it will affect
num_unfinished_jobs