<<>> <> <> <> <<>> DIRECTORY FakeCirio, TargetArchitecture, BreakWorldArchitecture, PCRMonitorDefs; FakeRemoteCirioImpl: CEDAR PROGRAM IMPORTS FakeCirio, BreakWorldArchitecture EXPORTS FakeCirio ~ { MonitoredCall: PUBLIC BreakWorldArchitecture.MonitoredCallProc ~ { <> IF address.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "MonitoredCall[nullAddress]"]; }; IF proc = NIL THEN { ERROR FakeCirio.Cant[message: "MonitoredCall[nullProc]"]; }; { HolderOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { <> <> sampleMonitorLock: PCRMonitorDefs.MonitorLock; sampleAddress: LONG POINTER TO PCRMonitorDefs.MonitorLock ~ @sampleMonitorLock; sampleAddressCard: CARD32 ~ LOOPHOLE[sampleAddress]; holderAddress: LONG POINTER TO TargetArchitecture.Contents ~ @sampleMonitorLock.holder; holderAddressCard: CARD32 ~ LOOPHOLE[holderAddress]; offset: TargetArchitecture.Displacement ~ (holderAddressCard - sampleAddressCard) * BYTES[UNIT]; RETURN [offset]; }; holder: TargetArchitecture.Contents ~ BreakWorldArchitecture.PeekContents[ address: address, displacement: HolderOffset[]]; IF holder = PCRMonitorDefs.nullHolder THEN { <> proc[]; } ELSE { <> ERROR BreakWorldArchitecture.WouldBlock["Monitor lock already held"]; }; }; }; }.