home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / tasking / locks.mod < prev    next >
Text File  |  1986-04-25  |  792b  |  36 lines

  1. IMPLEMENTATION MODULE Locks;
  2.  
  3.   FROM SYSTEM IMPORT ADDRESS, ADR, SETREG, GETREG, CODE, AX, BX, DS;
  4.   FROM Tasks IMPORT NextTask;
  5.  
  6.   TYPE
  7.     LockType = BOOLEAN;
  8.  
  9.   PROCEDURE Lock(VAR l: LockType);
  10.     BEGIN
  11.       WHILE BusyLock(l) DO NextTask END;
  12.     END Lock;
  13.  
  14.   PROCEDURE BusyLock(VAR l: LockType): BOOLEAN; (* test and set *)
  15.     VAR
  16.       lckadd: ADDRESS;
  17.       oldlock: BOOLEAN;
  18.     BEGIN
  19.       lckadd := ADR(l);
  20.       SETREG(AX, ORD(TRUE));
  21.       SETREG(BX, lckadd.OFFSET);
  22.       SETREG(DS, lckadd.SEGMENT);
  23.       CODE(
  24.     086H, (* XCHG *)
  25.     007H); (* al,[BX] *)
  26.       GETREG(AX, oldlock);
  27.       RETURN oldlock;
  28.     END BusyLock;
  29.  
  30.   PROCEDURE Unlock(VAR l: LockType); (* also serves for Init *)
  31.     BEGIN
  32.       l := FALSE;
  33.     END Unlock;
  34.  
  35.   END Locks.
  36.