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_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