DIRECTORY PrincOps USING [ ConditionVariable, Monitor, NoTimeout, PDA, Priority, PsbHandle, PsbNull, Ticks, UnlockedEmpty], PrincOpsUtils USING [ DisableInterrupts, EnableAndRequeue, PsbHandleToIndex, ReadPSB]; Process: DEFINITIONS IMPORTS PrincOpsUtils = BEGIN Ticks: TYPE = PrincOps.Ticks; Milliseconds: TYPE = CARDINAL; Seconds: TYPE = CARDINAL; InitializeMonitor: PROC [monitor: LONG POINTER TO MONITORLOCK] = INLINE { LOOPHOLE[monitor^, PrincOps.Monitor] _ PrincOps.UnlockedEmpty}; InitializeCondition: PROC [condition: LONG POINTER TO CONDITION, 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 ] }; MsecToTicks: SAFE PROC [Milliseconds] RETURNS [Ticks]; SecondsToTicks: SAFE PROC [Seconds] RETURNS [Ticks]; TicksToMsec: SAFE PROC [Ticks] RETURNS [Milliseconds]; SetTimeout: PROC [condition: LONG POINTER TO CONDITION, ticks: Ticks] = INLINE { condition.timeout _ IF ticks = PrincOps.NoTimeout THEN PrincOps.NoTimeout+1 ELSE ticks}; DisableTimeout: PROC [condition: LONG POINTER TO CONDITION] = INLINE { condition.timeout _ PrincOps.NoTimeout}; Detach: PROC [PROCESS]; GetCurrent: SAFE PROC RETURNS [PROCESS] = TRUSTED INLINE { RETURN[LOOPHOLE[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 [UNSPECIFIED]; --parameter should be any process DisableAborts: PROC [pCondition: LONG POINTER TO CONDITION] = INLINE { LOOPHOLE[pCondition^, PrincOps.ConditionVariable].condition.abortable _ FALSE}; EnableAborts: PROC [pCondition: LONG POINTER TO CONDITION] = 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 [UNSPECIFIED]; InvalidProcess: ERROR [process: UNSPECIFIED]; END. †Process.mesa last edited by: Levin on June 14, 1983 4:04 pm 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 Control of Scheduling Process validation Κj– "Cedar" style˜Jšœ ™ Jšœ.™.J˜šΟk ˜ šœ œ˜Jšœ'œ6˜`—šœœ˜Jšœ@˜@——J˜Jšœ œ˜,J˜Jš˜J˜Jšœœ˜Jšœœœ˜Jšœ œœ˜J˜Jšœ.™.˜šΟnœœ œœœ œœ˜IJšœ7˜?—J˜šžœœ œœœ œœ˜Yšœ,˜4Jšœ/œ œ˜EJšœ œœœ˜IJšœ˜—Jšœ˜—J˜Jšž œœœœ ˜6J˜Jšžœœœ œ ˜4J˜Jšž œœœ œ˜6J˜—Jšœ™˜šž œœ œœœ œœ˜PJšœœœœ˜X—J˜šžœœ œœœ œœ˜FJšœ(˜(—J˜—Jšœ™˜Jšžœœœ˜J˜—Jšœ+™+˜š ž œ œœœœ˜:Jšœœ<˜K—J˜—Jšœ™˜Jšœ œ˜#J˜JšœL™LJ™Jšœ"˜"Jšœ2˜2Jšœ.˜.Jšœ2˜2Jšœ˜Jšœ$˜$Jšœ˜Jšœ"˜"J˜šž œœœœ˜7J˜J˜Jšœ œ˜"Jšœ$Οc ˜DJšœ(™(Jšœ)œœ ˜LJ˜—J˜š ž œœœœœ˜