module Kill_index:sig..end
Monitor.kill.
A monitor is dead if it has an ancestor whose kill index is dead.
Kill indices are used so that we can efficiently check whether a monitor is dead or alive, given that a monitor has a pointer to its parent, but not its children. So, there is no way when killing a monitor to visit all of its descendants. Instead, we rely on lazily checking descendants when they are used.
Each monitor has a kill_index : Kill_index.t, and the scheduler has a single
global_kill_index : Kill_index.t. We maintain an invariant on the monitor tree that
if a monitor's kill index equals global_kill_index, then all of its ancestors kill
indices also equal global_kill_index. This ensures that any monitor whose kill
index equals global_kill_index is alive.
All kill indices initially start with value Kill_index.initial. To kill a monitor,
we set that monitor's kill index to Kill_index.dead and increment the scheduler's
global_kill_index. A monitor can be in one of three situations:
kill_index = global_kill_index. The monitor is alive.kill_index = dead. The monitor is dead. A dead monitor is never revived.kill_index to dead. If not, we will set its kill_index to
global_kill_index.type t
include Equal.S
include Invariant.S
val dead : tval initial : tval next : t -> tval sexp_of_t : t -> Sexplib.Sexp.t