DIRECTORY SameWorldMonitoredCallOps, CirioNubAccess; SameWorldMonitoredCallOpsImpl: CEDAR MONITOR LOCKS monitoredRecordPointer USING monitoredRecordPointer: MonitoredRecordPointer IMPORTS CirioNubAccess EXPORTS SameWorldMonitoredCallOps ~ { MonitoredRecordPointer: TYPE ~ LONG POINTER TO MonitoredRecord; MonitoredRecord: TYPE ~ MONITORED RECORD []; MonitoredCall: PUBLIC PROCEDURE [ address: CirioNubAccess.RemoteAddress, proc: PROCEDURE [] RETURNS []] RETURNS [] ~ { IF address.nil THEN CirioNubAccess.RemoteNilFault[address]; IF NOT address.valid THEN CirioNubAccess.RemoteAddrFault[address]; IF proc = NIL THEN RETURN; { MonitoredRecordPointerFromAddress: PROCEDURE [ address: CirioNubAccess.RemoteAddress] RETURNS [LONG POINTER TO MonitoredRecord] ~ TRUSTED { RETURN [LOOPHOLE[address.byteAddress, LONG POINTER TO MonitoredRecord]]; }; monitoredRecordPointer: LONG POINTER TO MonitoredRecord ~ MonitoredRecordPointerFromAddress[address: address]; MonitoredCallEntry: ENTRY PROCEDURE [ monitoredRecordPointer: MonitoredRecordPointer, proc: PROCEDURE [] RETURNS []] RETURNS [] ~ { ENABLE UNWIND => NULL; proc[]; RETURN; }; MonitoredCallEntry[monitoredRecordPointer: monitoredRecordPointer, proc: proc]; }; RETURN; }; }. θ SameWorldMonitoredCallOpsImpl.mesa Copyright Σ 1990 by Xerox Corporation. All rights reserved. Peter B. Kessler, July 10, 1990 2:39 pm PDT This is a separate interface, because it locks a separate (dynamic) monitor lock. Κέ•NewlineDelimiter ™codešœ"™"K™