Module Semaphore = Semaphore


type t
val sexp_of_t : t -> Sexplib.Sexp.t
include Core.Std.Invariant.S with type t := t
type t
val invariant : t Invariant_intf.inv
val create : int -> t

Create a simple counting semaphore, create initial_value is the inital value of the semaphore. Callers to decr will wait until the value is positive.

val value : t -> int

Get the current value of the semaphore

val incr : t -> unit

Increment the semaphore and if there are jobs sleeping on decr wakeup one of them.

val decr : t -> unit Async.Std.Deferred.t

Decrement the sempahore. This blocks if resulting the semaphore value is negative.

val resource : t -> (unit, Core.Std.Nothing.t) Resource.t

Interface to semaphore where the users can only return the tokens they took from semaphore, not add more tokens