home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1986-04-25 | 792 b | 36 lines |
- IMPLEMENTATION MODULE Locks;
-
- FROM SYSTEM IMPORT ADDRESS, ADR, SETREG, GETREG, CODE, AX, BX, DS;
- FROM Tasks IMPORT NextTask;
-
- TYPE
- LockType = BOOLEAN;
-
- PROCEDURE Lock(VAR l: LockType);
- BEGIN
- WHILE BusyLock(l) DO NextTask END;
- END Lock;
-
- PROCEDURE BusyLock(VAR l: LockType): BOOLEAN; (* test and set *)
- VAR
- lckadd: ADDRESS;
- oldlock: BOOLEAN;
- BEGIN
- lckadd := ADR(l);
- SETREG(AX, ORD(TRUE));
- SETREG(BX, lckadd.OFFSET);
- SETREG(DS, lckadd.SEGMENT);
- CODE(
- 086H, (* XCHG *)
- 007H); (* al,[BX] *)
- GETREG(AX, oldlock);
- RETURN oldlock;
- END BusyLock;
-
- PROCEDURE Unlock(VAR l: LockType); (* also serves for Init *)
- BEGIN
- l := FALSE;
- END Unlock;
-
- END Locks.
-