Interrupt.mesa
Copyright Ó Xerox Corporation 1987. All rights reserved.
Tim Diebert: April 27, 1987 2:30:04 pm PDT
DIRECTORY
PrincOpsUtils USING [AllocateNakedCondition],
Process USING [DisableTimeout, DisableAborts, EnableAborts, Milliseconds, MsecToTicks, SetTimeout];
Interrupt: CEDAR DEFINITIONS
LOCKS interrupt USING interrupt: Interrupt
IMPORTS PrincOpsUtils, Process = BEGIN
Constants:
maximumLapse: Process.Milliseconds = LAST[Process.Milliseconds];
TYPEs:
Interrupt: TYPE = REF InterruptRep;
InterruptRep: TYPE = MONITORED RECORD [condition: LONG POINTER TO CONDITION];
INLINE ENTRY PROCEDUREs:
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.