Copyright (C) 1994, Digital Equipment Corp.
Digital Internal Use Only
Created on Thu Feb 2 13:46:25 PST 1995 by najork
MODULE; IMPORT Thread; TYPE List = REF RECORD mu : MUTEX; th : Thread.T; ctr : CARDINAL; next: List; END; VAR list : List := NIL; monitor := NEW (MUTEX); PROCEDURE WinLL Assert (mu: MUTEX) = VAR tmp := list; th := Thread.Self(); BEGIN LOCK monitor DO WHILE tmp # NIL DO IF tmp.mu = mu THEN <* ASSERT (tmp.th = NIL AND tmp.ctr = 0) OR (tmp.th = th AND tmp.ctr > 0) *> tmp.th := th; INC (tmp.ctr); RETURN; END; tmp := tmp.next; END; list := NEW (List, mu := mu, th := th, ctr := 1, next := list); END; END Assert; PROCEDURERetract (mu: MUTEX) = VAR tmp := list; BEGIN LOCK monitor DO WHILE tmp # NIL DO IF tmp.mu = mu THEN <* ASSERT tmp.th = Thread.Self() AND tmp.ctr > 0 *> DEC (tmp.ctr); IF tmp.ctr = 0 THEN tmp.th := NIL; END; RETURN; END; tmp := tmp.next; END; <* ASSERT FALSE *> END; END Retract; PROCEDUREHolds (mu: MUTEX): BOOLEAN = VAR tmp := list; BEGIN WHILE tmp # NIL DO IF list.mu = mu THEN RETURN tmp.th = Thread.Self(); END; list := list.next; END; RETURN FALSE; END Holds; PROCEDUREAcquire (m: MUTEX) = BEGIN LOCK monitor DO IF NOT Holds (m) THEN Thread.Acquire (m); END; END; END Acquire; PROCEDURERelease (m: MUTEX) = BEGIN LOCK monitor DO IF NOT Holds (m) THEN Thread.Release (m); END; END; END Release; BEGIN END WinLL.