Method code for $mutex.grab()

[Turn on line numbering]
arg @values;
var i, tid, l, obj;

values ?= [0];
tid = task_id();
for obj in (.descendants())
    obj.grab(@values);
tasks = tasks.add(tid, (| tasks[tid] + [values] |) || values);
while (1) {
    if (!(l = ._test_locks(tid, values))) {
        for i in (values)
            ._add_to_lock(tid, i);
        return;
    } else {
        suspended = suspended.add(tid, l.length());
        $scheduler.suspend(this());
    }
}

["// Created 11-Mar-1997 as a part of ColdCore, see: @help Credit"]

the Cold Dark