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. δProcess.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Levin on June 14, 1983 4:04 pm Russ Atkinson (RRA) February 27, 1985 8:07:06 pm PST Doug Wyatt, February 26, 1985 3:05:31 pm PST Initializing monitors and condition variables Timeouts Detaching processes Identity of the currently executing process Priorities of processes The reserved priority levels (0, 5, 7) should not be used except by wizards. move to appropriate spot in ready queue: Aborting a process Requests that the indicated process be aborted. Checks for the current process being asked to abort by Abort. Raises ABORTED if such a request has been made. Otherwise CheckForAbort is a null operation. Control of Scheduling Process validation Κt– "Cedar" style˜codešœ ™ Kšœ Οmœ1™