<> <> <> <> <> DIRECTORY PrincOps USING [ConditionVariable, Monitor, NoTimeout, PDA, Priority, PsbHandle, PsbNull, Ticks, UnlockedEmpty], PrincOpsUtils USING [ConditionPointer, DisableInterrupts, EnableAndRequeue, MonitorPointer, PsbIndexToProcess, PsbHandleToIndex, ReadPSB]; Process: DEFINITIONS IMPORTS PrincOpsUtils = BEGIN <> ConditionPointer: TYPE = PrincOpsUtils.ConditionPointer; MonitorPointer: TYPE = PrincOpsUtils.MonitorPointer; Ticks: TYPE = PrincOps.Ticks; InitializeMonitor: PROC [monitor: MonitorPointer] = INLINE {LOOPHOLE[monitor^, PrincOps.Monitor] _ PrincOps.UnlockedEmpty}; InitializeCondition: PROC [condition: ConditionPointer, ticks: Ticks] = INLINE { LOOPHOLE[condition^, PrincOps.ConditionVariable] _ [ condition: [tail: PrincOps.PsbNull, abortable: FALSE, wakeup: FALSE], timeout: IF ticks=PrincOps.NoTimeout THEN PrincOps.NoTimeout+1 ELSE ticks ] }; Milliseconds: TYPE = CARDINAL; Seconds: TYPE = CARDINAL; MsecToTicks: SAFE PROC [Milliseconds] RETURNS [Ticks]; SecondsToTicks: SAFE PROC [Seconds] RETURNS [Ticks]; TicksToMsec: SAFE PROC [Ticks] RETURNS [Milliseconds]; <> SetTimeout: PROC [condition: ConditionPointer, ticks: Ticks] = INLINE {condition.timeout _ IF ticks = PrincOps.NoTimeout THEN PrincOps.NoTimeout+1 ELSE ticks}; DisableTimeout: PROC [condition: ConditionPointer] = INLINE {condition.timeout _ PrincOps.NoTimeout}; <> Detach: PROC [PROCESS]; <> GetCurrent: SAFE PROC RETURNS [PROCESS] = TRUSTED INLINE { RETURN[PrincOpsUtils.PsbIndexToProcess[PrincOpsUtils.PsbHandleToIndex[PrincOpsUtils.ReadPSB[]]]]}; <> Priority: TYPE = PrincOps.Priority; <> <<>> priorityIdleProcess: Priority = 0; priorityBackground, priorityClient0: Priority = 1; priorityNormal, priorityClient1: Priority = 2; priorityForeground, priorityClient2: Priority = 3; priorityClient3: Priority = 4; priorityFaultHandlers: Priority = 5; priorityRealTime: Priority = 6; prioritySwatWatcher: Priority = 7; SetPriority: SAFE PROC [p: Priority] = TRUSTED INLINE { h: PrincOps.PsbHandle; h _ PrincOpsUtils.ReadPSB[]; PrincOps.PDA[h].link.priority _ p; PrincOpsUtils.DisableInterrupts[]; -- (to cancel subsequent enable) <> PrincOpsUtils.EnableAndRequeue[@PrincOps.PDA.ready, @PrincOps.PDA.ready, h]; }; GetPriority: SAFE PROC RETURNS [Priority] = TRUSTED INLINE { RETURN[PrincOps.PDA[PrincOpsUtils.ReadPSB[]].link.priority]; }; <> Abort: PROC [PROCESS]; <> CheckForAbort: SAFE PROC; <> DisableAborts: PROC [pCondition: ConditionPointer] = INLINE {LOOPHOLE[pCondition^, PrincOps.ConditionVariable].condition.abortable _ FALSE}; EnableAborts: PROC [pCondition: ConditionPointer] = INLINE {LOOPHOLE[pCondition^, PrincOps.ConditionVariable].condition.abortable _ TRUE}; <> Pause: SAFE PROC [ticks: Ticks]; Yield: SAFE PROC = TRUSTED INLINE { PrincOpsUtils.DisableInterrupts[]; -- (to cancel subsequent enable) PrincOpsUtils.EnableAndRequeue[ @PrincOps.PDA.ready, @PrincOps.PDA.ready, PrincOpsUtils.ReadPSB[]]; }; SetTimeSlice: SAFE PROC [ticks: Ticks]; <> ValidateProcess: PROC [PROCESS]; InvalidProcess: ERROR [process: PROCESS]; END.