<> <> <> DIRECTORY PrincOpsUtils USING [AllocateNakedCondition], Process USING [DisableTimeout, DisableAborts, EnableAborts, Milliseconds, MsecToTicks, SetTimeout]; Interrupt: CEDAR DEFINITIONS LOCKS interrupt USING interrupt: Interrupt IMPORTS PrincOpsUtils, Process = BEGIN <<>> <> maximumLapse: Process.Milliseconds = LAST[Process.Milliseconds]; <> Interrupt: TYPE = REF InterruptRep; InterruptRep: TYPE = MONITORED RECORD [condition: LONG POINTER TO CONDITION]; <> Initialize: ENTRY PROCEDURE [interrupt: Interrupt, enableAbort, enableTimeout: BOOLEAN, lapse: Process.Milliseconds _ maximumLapse] RETURNS [mask: WORD] = TRUSTED INLINE BEGIN ENABLE UNWIND => NULL; [interrupt.condition, mask] _ PrincOpsUtils.AllocateNakedCondition[]; IF enableAbort THEN Process.EnableAborts[pCondition: interrupt.condition] ELSE Process.DisableAborts[pCondition: interrupt.condition]; IF enableTimeout THEN Process.SetTimeout[condition: interrupt.condition, ticks: Process.MsecToTicks[lapse]] ELSE Process.DisableTimeout[condition: interrupt.condition]; RETURN[mask]; END; Notify: ENTRY PROCEDURE [interrupt: Interrupt] = TRUSTED INLINE {ENABLE UNWIND => NULL; NOTIFY interrupt.condition^; RETURN}; Wait: ENTRY PROCEDURE [interrupt: Interrupt] = TRUSTED INLINE {ENABLE UNWIND => NULL; WAIT interrupt.condition^; RETURN}; END.