DIRECTORY Process USING [InitializeCondition, SecondsToTicks], Resource USING [AbortProc], Rope USING [ROPE]; ResourceImpl: CEDAR MONITOR IMPORTS Process EXPORTS Resource = BEGIN OPEN Resource; ownees: LIST OF Ownee _ NIL; Ownee: TYPE = RECORD[resource: REF ANY, owner: Rope.ROPE]; released: CONDITION; Acquire: PUBLIC ENTRY PROC [resource: REF ANY, waitForIt: BOOL _ FALSE, owner: Rope.ROPE _ NIL, abortProc: AbortProc _ NIL, abortProcData: REF ANY _ NIL ] RETURNS[success: BOOL, ownedBy: Rope.ROPE] = { ENABLE UNWIND => NULL; DO { FOR l: LIST OF Ownee _ ownees, l.rest UNTIL l = NIL DO IF l.first.resource = resource THEN IF waitForIt THEN { WAIT released; IF abortProc # NIL AND abortProc[abortProcData] THEN RETURN[FALSE, l.first.owner]; GOTO tryAgain} ELSE RETURN[FALSE, l.first.owner]; ENDLOOP; ownees _ CONS[[resource: resource, owner: owner], ownees]; RETURN[TRUE, owner]; EXITS tryAgain => LOOP; } ENDLOOP; }; Release: PUBLIC ENTRY PROC[resource: REF ANY] RETURNS[success: BOOL] = { ENABLE UNWIND => NULL; prev: LIST OF Ownee _ NIL; FOR l: LIST OF Ownee _ ownees, l.rest UNTIL l = NIL DO IF l.first.resource = resource THEN { IF prev = NIL THEN ownees _ l.rest ELSE prev.rest _ l.rest; BROADCAST released; RETURN[TRUE]} ELSE prev _ l; ENDLOOP; RETURN[FALSE]; }; IsAvailable: PUBLIC ENTRY PROC[resource: REF ANY] RETURNS[yes: BOOL, owner: Rope.ROPE] = { ENABLE UNWIND => NULL; FOR l: LIST OF Ownee _ ownees, l.rest UNTIL l = NIL DO IF l.first.resource = resource THEN RETURN[FALSE, l.first.owner]; ENDLOOP; RETURN[TRUE, NIL]; }; TRUSTED{Process.InitializeCondition[@released, Process.SecondsToTicks[1]]}; END. <ResourceImpl.mesa Last Modified On April 11, 1983 4:57 pm By Paul Rovner Last Modified On April 18, 1983 5:58 pm By Russ Atkinson This interface is intended to provide more flexibility than MONITORs for managing resources that support only one client at a time (e.g. Compiler, Binder, DFFile software). "resource" is typically an ATOM; the implementations of Acquire and Release use =. Acquire will return success = FALSE either if waitForIt = FALSE and the resource is in use (i.e. previously "Acquire'd" but not yet released), or if waitForIt = TRUE and abortProc # NIL and a call on abortProc returned TRUE. If Acquire returns success = FALSE then ownedBy will identify the current owner. if non-NIL, abortProc[abortProcData] is called occasionally while Acquire is waiting BEWARE of races; caveat emptor START HERE ʺ˜šœ™Jšœ6™6Jšœ8™8J˜—šÏk ˜ Jšœœ'˜4Jšœ œ ˜Jšœœœ˜—J˜šœœ˜Jšœ˜Jšœ ˜Jšœœœ ˜J˜Jšœ³™³Jšœ˜Jšœœœ œ˜Jš œœœ œœœ˜:Jšœ œ˜J˜—šÏnœœœ˜Jšœ œœ˜Jšœ œœ˜Jšœ œœ˜šœœ˜JšœT™T—Jšœœœ˜Jšœ˜Jšœ œœ˜.Jšœœœ˜šœ˜š œœœœ˜6šœ˜#šœ ˜ šœ˜Jšœ ˜šœ œœ˜/Jšœœœ˜"—Jšœ ˜—Jšœœœ˜"——Jšœ˜—Jšœ œ-˜:Jšœœ ˜Jšœ œ˜Jšœœ˜ —Jšœ˜J˜—šžœœœœ œœœ œ˜HJšœœœ˜Jšœœœ œ˜š œœœœ˜6šœ˜šœ˜Jšœœœœ˜;Jš œ ˜Jšœœ˜ —Jšœ ˜—Jšœ˜—Jšœœ˜Jšœ˜J˜—š ž œœœœ œœ˜1Jšœœœ˜(Jšœ™Jšœœœ˜š œœœœ˜6Jšœœœœ˜AJšœ˜—Jšœœœ˜Jšœ˜J˜—šœ ™ JšœD˜KJ˜—Jšœ˜—…—b X