@X @~
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             SYS061
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YSYS061
~S1~M~OSYS IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 6 Version 1~
~S1~OSection 6.1 Process Scheduler~
~S1~O1. General Description~
~BThe process scheduler is responsible for multiplexing the
small number of interrupt level activities which support user
level virtual machines among the user processes. In doing so
it co-operates closely with the process manager. Interfaces are
provided to enable other modules to activate (i.e. make eligible
for scheduling) and de-activate processes, and a user interface
is provided via the SUSPEND.PROCESS and FREE.PROCESS organisational
commands.~
~S1~O2. Interfaces~
Other modules used~
   Section 13 (Process Management)~
Interrupt level interface procedures~
   ACTIVATION (PROCESS, REASON)~
   DEACTIVATION (PROCESS, REASON)~
   TIME SLICE END ()~
Command level interface procedures~
   INIT.PROCESS (SPN, PID, PRIORITY)~
   READ.SUSP.REASON (SPN) REASON~
Organisational command procedures~
   SUSPEND.PROCESS (SPN, PID)~
   FREE.PROCESS (SPN, PID)~
~S1~O2.1 Hardware Interface~
~BNone.~
~S1~O2.2 Software Interface~
~S11) ACTIVATION (PROCESS, REASON)~
~BThis interface procedure activates (i.e. makes eligible for
scheduling) a specified process, identified by its System
Process Number, provided that the REASON parameter matches the
one for which the process is waiting.~
~BIt is possible for more than one REASON to be set when
a process is deactivated. For example, a process may be
suspended using the SUSPEND.PROCESS command while it is
already deactivated for another reason - e.g. waiting for
a message. In such a case, the process will not become
eligible for scheduling again until ~Wall its deactivation
reasons have been removed. This may require more than one
call to the ACTIVATION procedure.~
~S12) DEACTIVATION (REASON, DUMMY)~
~BThis procedure de-activates the current process. The process
ceases to execute, and will not be scheduled for execution again
until re-activated. The REASON parameter is
bit significant, and indicates one or more events which
must be signalled (via ACTIVATION) before the process will
be re-activated.~
~BThe currently assigned deactivation reasons are:~
~3
~
   CMD.SUS              Suspended by the SUSPEND.PROCESS command~
   TERM                 Process is terminating~
   MESSAGE.WAIT         Process is waiting for a message.~
~0
~
~S13) TIMESLICE.END ()~
~BThis procedure is called by the virtual machine timer module
(section 11) to indicate that a timer interrupt has occurred,
and therefore the process'
timeslice has expired.~
~S14) INIT.PROCESS (SPN, PID, PRIORITY)~
~BThis procedure is used by the Process Manager, to signal
the presence of a new process for scheduling. The process'
SPN, PID and PRIORITY are supplied; initially, the process
is inactive, and may only be freed by the FREE.PROCESS command.~
~S15) READ.SUSP.REASON (SPN) REASON~
~BThis procedure returns the reasons for which the specified process
is suspended.~
~P~S1~O3. Implementation~
~S1~O3.1 Outline of Operation~
~BThe process scheduling is performed by an interrupt level activity,
driven by the ACTIVATION and DEACTIVATION interface procedures. In this
version, the process scheduler selects a mix of jobs for execution, allocates
a timeslice to each, and informs the process manager of their identities. It
then performs no further scheduling until all of the processes have either
used up their timeslice or deactivated, when a new mix is selected.
Obviously, this strategy sets a limit on the response of the system
to urgent process' requests.
Notice also that the SUSPEND.PROCESS command does not actually
de-activate the process immediately if it is in the current mix;
the process is allowed to continue until either it de-activates itself
or its timeslice expires.~
~BThe mix selected consists of up to fifteen interactive processes,
and one batch process which is always assigned to the lowest priority
activity. The batch process selected is always the highest priority free
batch process; in the case of ties, the oldest such process (i.e. the one
with the smallest PID) is chosen. Interactive processes are selected by a
cyclic scan through all processes, with preference given to higher priority
ones (i.e. top priority processes receive a timeslice on every scan, lower
priority ones less frequently).~
~S1~O3.2 Data Structures~
~T%24
~
~
PROC.PRI~IA vector, indexed by System Process Number,
giving the priority of each process.~
~
PROC.PID~IA vector, indexed by System Process Number, giving
the process identifier of each process.~
~
PROC.SUSP.REASON~IA vector, indexed by System Process Number, giving
the reason (if any) for which the process is
deactivated. If zero, the process is free to be
scheduled. Individual bits of this correspond to
different reasons for deactivation, as follows:~
   :CMD.SUS~ISuspended by the SUSPEND.PROCESS command.~
   :TERM~IThe process is terminating.~
   :MESSAGE.WAIT~IThe process is waiting for a message.~
~
PROC.TS.COUNTER~IA vector, indexed by System Process Number,
used to determine when an interactive process
receives a timeslice. Its initial value
depends on the process priority (see TS.INIT
below), and it is decremented each time the
process is considered for scheduling. Only when the
counter falls to zero is the process actually
allocated a timeslice.~
~
TS.INIT~IA vector with sixteen entries, giving the initial
value of the timeslice counter for each of the
sixteen priority levels.~
~
ACTIVE.INTERACTIVE~IThe number of currently active interactive processes.~
~
INTERACTIVE.COUNT~IThe number of interactive processes in the current
execution mix.~
~
ACTIVE.BATCH~IThe number of currently active batch processes.~
~
BATCH.COUNT~IThe number of batch processes in the current
execution mix.~
~
INTERACTIVE.PTR~ICyclic pointer used in selecting interactive processes
for the execution mix.~
~S1~O3.3 Special Notes~~
~BNone.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                SYS061
~V9 -1
~F

@TITLE SYS06(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
PROCESS SCHEDULER
@BOX 4.0
PROCEDURES IN MODULE
   INT1 PROCESS SCHEDULING ACTIVITY
   INT2 ACTIVATION
   INT3 DEACTIVATION
   INT4 TIMESLICE END
   CMD1 INITIALISE PROCESS
   CMD2 SUSPEND PROCESS
   CMD3 FREE PROCESS
   CMD4 READ SUSP REASON
@BOX 6.0
END
@BOX 1.1
#SYS06/1
MODULE SYS06 (ACTIVATION, DEACTIVATION, TIMESLICE.END,
   INIT.PROCESS, SUSPEND.PROCESS, FREE.PROCESS,
   PROCESS.SCHEDULER, READ.SUSP.REASON);
@BOX 3.1
*GLOBAL 5;
INTEGER INTERACTIVE.COUNT, BATCH.COUNT, INTERACTIVE.PTR, BATCH.NUMBER;
INTEGER [SYS13.NO.OF.PROCS] PROC.PID;
LOGICAL8 [SYS13.NO.OF.PROCS] PROC.PRI;
INTEGER16 [SYS13.NO.OF.PROCS] PROC.TS.COUNTER, SCALE;
LOGICAL8 [SYS13.NO.OF.PROCS] PROC.SUSP.REASON;
INTEGER INIT.INTERACTIVE.SCHEDULES, INTERACTIVE.SCHEDULES,
   BATCH.TIMESLICE, INTERACTIVE.TIMESLICE, MAX.SCALE;
DATAVEC TS.INIT (LOGICAL8)
   0 1 1 1
   2 2 2 2
   4 4 4 4
   1 2 4 6
END
@BOX 4.1
::*INIT %6000;
*CODE 2;
PSPEC PROCESS.SCHEDULER ();
PSPEC ACTIVATION (INTEGER, LOGICAL);
PSPEC DEACTIVATION (LOGICAL, LOGICAL);
PSPEC TIMESLICE.END ();
   #SYSINT06.1
   #SYSINT06.2
   #SYSINT06.3
   #SYSINT06.4
::*INIT %7000;
*CODE 19;
PSPEC INIT.PROCESS (INTEGER, INTEGER, INTEGER);
LSPEC SUSPEND.PROCESS (INTEGER, INTEGER);
LSPEC FREE.PROCESS (INTEGER, INTEGER);
PSPEC READ.SUSP.REASON (INTEGER) / LOGICAL;
   #SYSCMD06.1
   #SYSCMD06.2
   #SYSCMD06.3
   #SYSCMD06.4
@BOX 5.1
::*INIT %6000;
*CODE 7;
PSPEC INIT.SYS06 ();
INIT.SYS06 ();
PROC INIT.SYS06;
INTEGER PTR;
FOR PTR < SYS13.NO.OF.PROCS DO
   TERM.SUS => PROC.SUSP.REASON [PTR];
OD
1 => INTERACTIVE.PTR;
END
BATCH.TS => BATCH.TIMESLICE;
INTERACTIVE.TS => INTERACTIVE.TIMESLICE;
-1 => INIT.INTERACTIVE.SCHEDULES => INTERACTIVE.SCHEDULES;
8 => MAX.SCALE;
BATCH.NO => BATCH.NUMBER;
SYS23.NOTE.OP.PARAM (%0601, ^INIT.INTERACTIVE.SCHEDULES);
SYS23.NOTE.OP.PARAM (%0602, ^BATCH.TIMESLICE);
SYS23.NOTE.OP.PARAM (%0603, ^INTERACTIVE.TIMESLICE);
SYS23.NOTE.OP.PARAM (%0604, ^MAX.SCALE);
SYS23.NOTE.OP.PARAM (%0605, ^BATCH.NUMBER);
@BOX 6.1
*END
@END
@TITLE SYS06/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
   SYS01 CO-ORDINATOR
   SYS13 PROCESS MANAGEMENT
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT LITERAL INTERACTIVE.TS, BATCH.TS, BATCH.NO, CMD.SUS, TERM.SUS, MESSAGE.SU
S;
@BOX 4.1
IMPORT LITERAL SYS01.PROC.SCHEDULER.ACTIVITY, SYS01.NO.OF.ACTIVITIES,
   SYS01.NO.OF.INT.ACTIVITIES;
INTEGER SYS01.CURRENT.ACTIVITY;
PSPEC SYS01.CLEAR.INTERRUPT ();
PSPEC SYS01.NEXT.ACTIVITY ();
PSPEC SYS01.CHECK.IN (INTEGER, INTEGER);
PSPEC SYS01.CHECK.OUT (INTEGER, INTEGER);
PSPEC SYS01.SET.INTERRUPT (LOGICAL, LOGICAL);
IMPORT LITERAL SYS13.NO.OF.PROCS;
INTEGER SYS13.CURRENT.SPN;
PSPEC SYS13.SCHEDULE (INTEGER, INTEGER, INTEGER);
PSPEC SYS13.REMOVE ();
PSPEC SYS13.INT.PROC (LOGICAL, LOGICAL);
PSPEC SYS13.ENTER.INT.LEVEL (ADDR SYS13.INT.PROC, LOGICAL, LOGICAL);
PSPEC SYS13.CHECK.REQUEST (LOGICAL, LOGICAL);
PSPEC SYS23.NOTE.OP.PARAM (INTEGER, ADDR INTEGER);
ADDR PW0;
@END
@TITLE SYSINT06.1(1,9)

@COL 1S-10R-9R-2T-3R-4T-5R-11R-8R-7R-6F

@FLOW 1-10-9-2-3-4-5-11-8-7-10
@FLOW 2YES-4YES-11

@BOX 1.0
PROCESS SCHEDULING ACTIVITY
@BOX 2.0
INTERACTIVE SCHEDULING
NOT REQUIRED?
@BOX 3.0
INTERACTIVE SCHEDULING
#SYSINT06.1.1
@BOX 4.0
BATCH SCHEDULING
NOT REQUIRED?
@BOX5.0
BATCH SCHEDULING
#SYSINT06.1.2
@BOX 6.0
END
@BOX 7.0
CALL LOW LEVEL SCHEDULER
(NEXT ACTIVITY)
[SYS01]
@BOX 8.0
CLEAR SOFTWARE INTERRUPT
FOR CURRENT ACTIVITY
[SYS01]
@BOX 9.0
FIND CHARACTERISTICS OF JOB MIX
@BOX 10.0
CHECKIN
[SYS01]
@BOX 11.0
CHECKOUT
[SYS01]
@BOX 1.1
PROC PROCESS.SCHEDULER;
INTEGER ACTIVE.BATCH, ACTIVE.INTERACTIVE, MIN.TS.COUNT, PROC.NO;
@BOX 2.1
IF ACTIVE.INTERACTIVE = 0
   OR INTERACTIVE.COUNT /= 0
   OR [ACTIVE.BATCH > 0 AND
      INTERACTIVE.SCHEDULES = 0]
@BOX 3.1
IF INTERACTIVE.SCHEDULES > 0 THEN
   1 -> INTERACTIVE.SCHEDULES;
FI
::INTERACTIVE SCHEDULING
#SYSINT06.1.1
@BOX 4.1
IF ACTIVE.BATCH = 0
   OR BATCH.COUNT /= 0
   OR [ACTIVE.INTERACTIVE > 0
      AND INTERACTIVE.SCHEDULES > 0]
@BOX 5.1
::BATCH SCHEDULING
#SYSINT06.1.2
@BOX 6.1
END
@BOX7.1
SYS01.NEXT.ACTIVITY ();
@BOX8.1
SYS01.CLEAR.INTERRUPT ();
@BOX 9.1
0 => PROC.NO => ACTIVE.BATCH => ACTIVE.INTERACTIVE;
%7FFF => MIN.TS.COUNT;
WHILE 1 +> PROC.NO < SYS13.NO.OF.PROCS DO
   IF PROC.SUSP.REASON [PROC.NO] = 0 THEN
      IF PROC.PRI [PROC.NO] >= 12 THEN
         1 +> ACTIVE.BATCH;
      ELSE
         1 +> ACTIVE.INTERACTIVE;
         IF PROC.TS.COUNTER [PROC.NO] < MIN.TS.COUNT THEN
            PROC.TS.COUNTER [PROC.NO] => MIN.TS.COUNT;
         FI
      FI
   FI
OD
@BOX 10.1
SYS01.CHECK.IN (0, 0);
@BOX 11.1
SYS01.CHECK.OUT (0, 0);
@END


@TITLE SYSINT06.1.1(1,11)

@COL 1S-2R-3T-4T-9T-5R-7T-10T-8F

@FLOW 1-2-3INTERACTIVE-4ELIGIBLE-9NO-5-7NO SPACE OR NO MORE PROCS-10NO-8
@FLOW 3BATCH-7-3
@FLOW 4-7
@FLOW 9YES-7
@FLOW 10YES-2

@BOX 1.0
INTERACTIVE SCHEDULING
@BOX 2.0
INITIALISE POINTERS TO SCAN
LIST OF PROCESSES
@BOX 3.0
TEST STATUS OF NEXT PROCESS
@BOX 4.0
IS PROCESS ELIGIBLE
FOR A TIME SLICE?
@BOX 5.0
INFORM PROCESS MANAGER
[SYS13]
@BOX 7.0
MOVE TO NEXT PROCESS
@BOX 8.0
END
@BOX 9.0
IS PROCESS SUSPENDED?
@BOX 10.0
ANOTHER SCHEDULING
PASS NECESSARY?
@BOX 1.1
INTERACTIVE.SCHEDULING:  BEGIN
INTEGER I.PTR, INT.NO;
@BOX 2.1
INTERACTIVE.PTR => I.PTR;
0 => INT.NO;
@BOX 3.1
IF PROC.PRI [INTERACTIVE.PTR] >= 12
@BOX 4.1
IF MIN.TS.COUNT -> PROC.TS.COUNTER [INTERACTIVE.PTR] > 0
@BOX 5.1
1 +> INT.NO;
1 +> INTERACTIVE.COUNT;
SYS13.SCHEDULE (INT.NO + SYS01.NO.OF.INT.ACTIVITIES, INTERACTIVE.PTR,
   INTERACTIVE.TIMESLICE * SCALE [INTERACTIVE.PTR]);
@BOX 7.1
IF 1 +> INTERACTIVE.PTR = SYS13.NO.OF.PROCS THEN
   1 => INTERACTIVE.PTR;
FI
IF [INTERACTIVE.PTR /= I.PTR
      AND INT.NO + 1 < BATCH.NUMBER]
@BOX 8.1
END
@BOX 9.1
0 => PROC.TS.COUNTER [INTERACTIVE.PTR];
IF PROC.SUSP.REASON [INTERACTIVE.PTR] /= 0
@BOX 10.1
IF INTERACTIVE.COUNT = 0 AND
   ACTIVE.INTERACTIVE /= 0
@END

@TITLE SYSINT06.1.2(1,11)

@COL 1S-2R-3T-4R-5T-6R-7F

@FLOW 1-2-3BATCH AND READY-4-5NO MORE PROCS-6-7
@FLOW 3INTERACTIVE OR HALTED-5-3

@BOX 1.0
BATCH SCHEDULING
@BOX 2.0
INITIALISE POINTERS TO SCAN
LIST OF PROCESSES
@BOX 3.0
TEST STATUS OF NEXT PROCESS
@BOX 4.0
NOTE PROCESS NUMBER IF
THE BEST SO FAR
(OLDEST AT HIGHEST PRIORITY)
@BOX 5.0
MOVE TO NEXT PROCESS
@BOX 6.0
INFORM PROCESS MANAGER
[SYS13]
@BOX 7.0
END
@BOX 1.1
BATCH.SCHEDULING: BEGIN
INTEGER B.PTR, BEST, BEST.PRI, BEST.PID;
@BOX 2.1
16 => BEST.PRI;
-1 => BEST.PID;
1 => B.PTR;
@BOX 3.1
IF PROC.PRI [B.PTR] < 12
   OR PROC.SUSP.REASON [B.PTR] /= 0
@BOX 4.1
IF PROC.PRI [B.PTR] < BEST.PRI
   OR [PROC.PRI [B.PTR] = BEST.PRI
      AND PROC.PID [B.PTR] < BEST.PID] THEN
   B.PTR => BEST;
   PROC.PID [B.PTR] => BEST.PID;
   PROC.PRI [B.PTR] => BEST.PRI;
FI
@BOX 5.1
IF 1 +> B.PTR < SYS13.NO.OF.PROCS
@BOX 6.1
1 +> BATCH.COUNT;
SYS13.SCHEDULE (BATCH.NUMBER + SYS01.NO.OF.INT.ACTIVITIES, BEST,
   BATCH.TIMESLICE);
@BOX 7.1
END
@END

@TITLE SYSINT06.2(1,6)
@COL 1S-2T-4R-5F
@FLOW 1-2-4-5
@FLOW 2STILL SUSPENDED-5
@BOX 1.0
ACTIVATION (PROCESS, REASON)
@BOX 2.0
REMOVE SUSPENSION REASON
@BOX 4.0
TRIGGER PROCESS SCHEDULER
[SYS01]
@BOX 5.0
END
@BOX 1.1
PROC ACTIVATION (PROC.NO, REASON);
LOGICAL TEMP;
@BOX 2.1
IF REASON & PROC.SUSP.REASON [PROC.NO] => TEMP = 0
   OR TEMP -=> PROC.SUSP.REASON [PROC.NO] /= 0
@BOX 4.1
SYS01.SET.INTERRUPT (SYS01.PROC.SCHEDULER.ACTIVITY, 0);
@BOX 5.1
END
@END
@TITLE SYSINT06.3(1,8)
@COL 1S-2R-3R-5R-6R-7R-9R-8F
@FLOW 1-2-3-5-6-7-9-8
@BOX 1.0
DEACTIVATION (REASON)
@BOX 2.0
CHECK OUT
[SYS01]
@BOX 3.0
SET SUSPENSION REASON
@BOX 5.0
ADJUST COUNTS OF
ACTIVE PROCESSES
@BOX 6.0
TRIGGER PROCESS SCHEDULER
[SYS01]
@BOX 7.0
INFORM PROCESS MANAGER
OF DEACTIVATION
[SYS13]
@BOX 8.0
END
@BOX 9.0
CALL THE LOW LEVEL SCHEDULER
(NEXT ACTIVITY)
[SYS01]
@BOX 1.1
PROC DEACTIVATION (REASON, DUMMY);
@BOX 2.1
SYS01.CHECK.OUT (0, 0);
@BOX 3.1
REASON !> PROC.SUSP.REASON [SYS13.CURRENT.SPN];
@BOX 5.1
IF PROC.PRI [SYS13.CURRENT.SPN] < 12 THEN
   1 -> INTERACTIVE.COUNT;
ELSE
   1 -> BATCH.COUNT;
   INIT.INTERACTIVE.SCHEDULES => INTERACTIVE.SCHEDULES;
FI
1 => SCALE [SYS13.CURRENT.SPN];
TS.INIT [PROC.PRI [SYS13.CURRENT.SPN]] => PROC.TS.COUNTER [SYS13.CURRENT.SPN];
@BOX 6.1
SYS01.SET.INTERRUPT (SYS01.PROC.SCHEDULER.ACTIVITY, 0);
@BOX 7.1
SYS13.REMOVE ();
@BOX 8.1
END
@BOX 9.1
SYS01.NEXT.ACTIVITY ();
@END
@TITLE SYSINT06.4(1,11)
@COL 1S-3R-4R-5R-7R-6F
@FLOW 1-3-4-5-7-6
@BOX 1.0
TIME SLICE END
@BOX 3.0
ADJUST COUNTS OF
ACTIVE PROCESSES
@BOX 4.0
TRIGGER PROCESS SCHEDULER
[SYS01]
@BOX 5.0
INFORM PROCESS MANAGER
OF DEACTIVATION
[SYS13]
@BOX 6.0
END
@BOX 7.0
CALL THE LOW LEVEL SCHEDULER
(NEXT ACTIVITY)
[SYS01]
@BOX 1.1
PROC TIMESLICE.END;
@BOX 3.1
IF PROC.PRI [SYS13.CURRENT.SPN] < 12 THEN
   1 -> INTERACTIVE.COUNT;
   IF SCALE [SYS13.CURRENT.SPN] /= MAX.SCALE THEN
      SCALE [SYS13.CURRENT.SPN] <<- 1 => SCALE [SYS13.CURRENT.SPN];
   FI
ELSE
   1 -> BATCH.COUNT;
   INIT.INTERACTIVE.SCHEDULES => INTERACTIVE.SCHEDULES;
FI
TS.INIT [PROC.PRI [SYS13.CURRENT.SPN]] * SCALE [SYS13.CURRENT.SPN]
   => PROC.TS.COUNTER [SYS13.CURRENT.SPN];
@BOX 4.1
SYS01.SET.INTERRUPT (SYS01.PROC.SCHEDULER.ACTIVITY, 0);
@BOX 5.1
SYS13.REMOVE ();
@BOX 6.1
END
@BOX 7.1
SYS01.NEXT.ACTIVITY ();
@END
@TITLE SYSCMD06.1(1,8)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INITIALISE PROCESS (SPN, PID, PRIORITY)
@BOX 2.0
RECORD THE PROCESS
PID AND PRIORITY
@BOX 3.0
MARK THE PROCESS AS
DEACTIVATED BY SUSPEND
PROCESS COMMAND
@BOX 4.0
END
@BOX 1.1
PROC INIT.PROCESS (SPN, PID, PRIORITY);
@BOX 2.1
PID => PROC.PID [SPN];
PRIORITY => PROC.PRI [SPN];
1 => SCALE [SPN];
0 => PROC.TS.COUNTER [SPN];
@BOX 3.1
CMD.SUS => PROC.SUSP.REASON [SPN];
@BOX 4.1
END
@END
@TITLE SYSCMD06.2(1,6)
@COL 1S-2R-3T-4R-5R-6F
@FLOW 1-2-3NO-4-5-6
@FLOW 3YES-5
@BOX 1.0
SUSPEND PROCESS (SPN,PID)
@BOX 2.0
CHECK IN
[SYS01]
@BOX 3.0
IS REQUEST INVALID?
[SYS13]
@BOX 4.0
MARK THE PROCESS
AS SUSPENDED
@BOX 5.0
CHECK OUT
[SYS01]
@BOX 6.0
END
@BOX 1.1
PROC SUSPEND.PROCESS (SPN, PID);
0 => PW0;
@BOX 2.1
SYS13.ENTER.INT.LEVEL (^SYS01.CHECK.IN, 0, 0);
@BOX 3.1
SYS13.CHECK.REQUEST (SPN, PID);
IF PW0 < 0
@BOX 4.1
CMD.SUS !> PROC.SUSP.REASON [SPN ->> 9];
@BOX 5.1
SYS13.ENTER.INT.LEVEL (^SYS01.CHECK.OUT, 0, 0);
@BOX 6.1
END
@END
@TITLE SYSCMD06.3(1,6)
@COL 1S-2R-3T-4R-5R-6F
@FLOW 1-2-3NO-4-5-6
@FLOW 3YES-5
@BOX 1.0
FREE PROCESS (SPN, PID)
0 => PW0;
@BOX 2.0
CHECK IN
[SYS01]
@BOX 3.0
IS REQUEST INVALID?
[SYS13]
@BOX 4.0
ENTER INTERRUPT LEVEL
TO ACTIVATE THE PROCESS
@BOX 5.0
CHECK OUT
[SYS01]
@BOX 6.0
END
@BOX 1.1
PROC FREE.PROCESS (SPN, PID);
@BOX 2.1
SYS13.ENTER.INT.LEVEL (^SYS01.CHECK.IN, 0, 0);
@BOX 3.1
SYS13.CHECK.REQUEST (SPN, PID);
IF PW0 < 0
@BOX 4.1
SYS13.ENTER.INT.LEVEL (^ACTIVATION, SPN ->> 9, CMD.SUS ! MESSAGE.SUS);
@BOX 5.1
SYS13.ENTER.INT.LEVEL (^SYS01.CHECK.OUT, 0, 0);
@BOX 6.1
END
@END


@TITLE SYSCMD06.4(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
READ SUSP REASON (SPN)
@BOX 2.0
RETURN SUSPENSION REASON
FOR THE PROCESS
@BOX 3.0
END
@BOX1.1
PROC READ.SUSP.REASON (SPN);
@BOX 2.1
PROC.SUSP.REASON [SPN] => READ.SUSP.REASON;
@BOX 3.1
END
@END
