Industrial strength, full-featured build system
Module type
Class type
Library jenga
Module Jenga_lib . Locking
val lock_directory_for_action : dir:Path.t -> ( unit -> 'a Async.Deferred.t ) -> 'a Async.Deferred.t

At any given time, you can either have any number of functions passed to lock_directory_for_action or any number of functions passed to lock_directory_for_listing running, but not both at the same time.

This is presumably because an action running in a directory may create temporary files, so we prefer to avoid retriggering spuriously when we see them coming and going.

val lock_directory_for_listing : dir:Path.t -> ( unit -> 'a Async.Deferred.t ) -> 'a Async.Deferred.t
val lock_targets_for_action : targets:Path.Rel.t list -> ( unit -> 'a Async.Deferred.t ) -> 'a Async.Deferred.t

Prevent overlapping execution of actions on each target.

Note that you can have multiple concurrent actions for a target even when you have only one Rule.t: If the value of Action.t Dep.t changes over time, jenga might decide to start the new Action.t before the old one is finished. This lock is there to prevent that.

val is_action_running_for_path : Path.Rel.t -> bool