Process.mesa
Copyright © 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
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
Initializing monitors and condition variables
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];
Timeouts
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};
Detaching processes
Detach: PROC [PROCESS];
Identity of the currently executing process
GetCurrent: SAFE PROC RETURNS [PROCESS]
= TRUSTED INLINE {
RETURN[PrincOpsUtils.PsbIndexToProcess[PrincOpsUtils.PsbHandleToIndex[PrincOpsUtils.ReadPSB[]]]]};
Priorities of processes
Priority: TYPE = PrincOps.Priority;
The reserved priority levels (0, 5, 7) should not be used except by wizards.
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)
move to appropriate spot in ready queue:
PrincOpsUtils.EnableAndRequeue[@PrincOps.PDA.ready, @PrincOps.PDA.ready, h];
};
GetPriority: SAFE PROC RETURNS [Priority]
= TRUSTED INLINE {
RETURN[PrincOps.PDA[PrincOpsUtils.ReadPSB[]].link.priority];
};
Aborting a process
Abort: PROC [PROCESS];
Requests that the indicated process be aborted.
CheckForAbort: SAFE PROC;
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.
DisableAborts: PROC [pCondition: ConditionPointer]
= INLINE {LOOPHOLE[pCondition^, PrincOps.ConditionVariable].condition.abortable ← FALSE};
EnableAborts: PROC [pCondition: ConditionPointer]
= INLINE {LOOPHOLE[pCondition^, PrincOps.ConditionVariable].condition.abortable ← TRUE};
Control of Scheduling
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];
Process validation
ValidateProcess: PROC [PROCESS];
InvalidProcess: ERROR [process: PROCESS];
END.