-- ProcessOperations.mesa (last edited by Knutsen on December 9, 1980 10:18 PM)
DIRECTORY
PrincOps USING [PSBreg, PTCreg, WDCreg],
Mopcodes USING [
zBCAST, zDWDC, zME, zMRE, zMXD, zMXW, zNOTIFY, zREQUEUE, zRR, zWR],
PSB USING [ProcessStateBlock, PsbHandle, PsbIndex, Queue, QueueHandle, Ticks];
ProcessOperations: DEFINITIONS =
BEGIN OPEN PSB;
QueueHandle: TYPE = PSB.QueueHandle;
Enter: PROCEDURE [POINTER TO MONITORLOCK] RETURNS [success: BOOLEAN] = MACHINE
CODE BEGIN Mopcodes.zME END;
LongEnter: PROCEDURE [LONG POINTER TO MONITORLOCK] RETURNS [success: BOOLEAN] =
MACHINE CODE BEGIN Mopcodes.zME END;
Exit: PROCEDURE [POINTER TO MONITORLOCK] = MACHINE CODE BEGIN Mopcodes.zMXD END;
LongExit: PROCEDURE [LONG POINTER TO MONITORLOCK] = MACHINE CODE
BEGIN Mopcodes.zMXD END;
Wait: PROCEDURE [
POINTER TO MONITORLOCK, POINTER TO CONDITION, --timeout:--CARDINAL] = MACHINE
CODE BEGIN Mopcodes.zMXW END;
LongWait: PROCEDURE [
LONG POINTER TO MONITORLOCK, LONG POINTER TO CONDITION,
--timeout:--CARDINAL] = MACHINE CODE BEGIN Mopcodes.zMXW END;
ReEnter: PROCEDURE [POINTER TO MONITORLOCK, POINTER TO CONDITION]
RETURNS [success: BOOLEAN] = MACHINE CODE BEGIN Mopcodes.zMRE END;
LongReEnter: PROCEDURE [LONG POINTER TO MONITORLOCK, LONG POINTER TO CONDITION]
RETURNS [success: BOOLEAN] = MACHINE CODE BEGIN Mopcodes.zMRE END;
Notify: PROCEDURE [POINTER TO CONDITION] = MACHINE CODE
BEGIN Mopcodes.zNOTIFY END;
LongNotify: PROCEDURE [LONG POINTER TO CONDITION] = MACHINE CODE
BEGIN Mopcodes.zNOTIFY END;
Broadcast: PROCEDURE [POINTER TO CONDITION] = MACHINE CODE
BEGIN Mopcodes.zBCAST END;
LongBroadcast: PROCEDURE [LONG POINTER TO CONDITION] = MACHINE CODE
BEGIN Mopcodes.zBCAST END;
Requeue: PROCEDURE [
from: LONG POINTER TO Queue, to: LONG POINTER TO Queue, p: PsbHandle] =
MACHINE CODE BEGIN Mopcodes.zREQUEUE END;
EnableAndRequeue: PROCEDURE [
from: LONG POINTER TO Queue, to: LONG POINTER TO Queue, p: PsbHandle] =
-- Note: this depends on having one instruction after enabling.
MACHINE CODE BEGIN Mopcodes.zDWDC; Mopcodes.zREQUEUE END;
ReadPSB: PROCEDURE RETURNS [currentProcess: PsbHandle] = MACHINE CODE
BEGIN Mopcodes.zRR, PrincOps.PSBreg END;
WritePSB: PROCEDURE [currentProcess: PsbHandle] = MACHINE CODE
BEGIN Mopcodes.zWR, PrincOps.PSBreg END;
HandleToIndex: PROCEDURE [handle: PsbHandle] RETURNS [PsbIndex] = INLINE {
RETURN[LOOPHOLE[handle, CARDINAL]/SIZE[ProcessStateBlock]]};
IndexToHandle: PROCEDURE [index: PsbIndex] RETURNS [PsbHandle] = INLINE {
RETURN[LOOPHOLE[index*SIZE[ProcessStateBlock]]]};
ReadPTC: PROCEDURE RETURNS [time: Ticks] = MACHINE CODE
BEGIN Mopcodes.zRR, PrincOps.PTCreg END;
WritePTC: PROCEDURE [time: Ticks] = MACHINE CODE
BEGIN Mopcodes.zWR, PrincOps.PTCreg END;
ReadWDC: PROCEDURE RETURNS [countDisabled: CARDINAL] = MACHINE CODE
BEGIN Mopcodes.zRR, PrincOps.WDCreg END;
WriteWDC: PROCEDURE [countDisabled: CARDINAL] = MACHINE CODE
BEGIN Mopcodes.zWR, PrincOps.WDCreg END;
END.