@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             LIB101
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YLIB101
~S1~M~OLIB IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 10  Version 1~
~S1~OSection 10.1 System Maintenance~
~S1~O1. General Description~
~BThis module provides a set of procedures to facilitate system maintenance.
~S1~O2. Interfaces~
~
Library procedures~
   LIST.JOBS ()~
   SET.UP ()~
~S1~O3. Implementation~
~S1~O3.1 Outline of Operation~
~BThe operation of the procedures in this module is
straightforward.~
~S1~O3.2 Data Structures~
~BNone.~
~S1~O3.3 Special Notes~
~BNone.~
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                LIB101
~V9 -1
~F
@TITLE LIB10(1,8)

@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
SYSTEM MAINTENANCE
@BOX 4.0
PROCEDURES IN MODULE:
   LIST.JOBS
   SET UP
   SET COMMON SEGMENT
@BOX 6.0
END
@BOX 1.1
#LIB10/1
MODULE LIB10 (lIST.jOBS, SET.UP, SET.COMMON.SEGMENT);
@BOX 2.1
TYPE JOB.LIST IS
   LOGICAL64 P.NAME, U.NAME
LOGICAL8 FILLER1, SUS.RSN, STAT, PRI
LOGICAL32 CPU.USED, PID, START;
@BOX 3.1
LITERAL / INTEGER NO.OF.UPDS = 14;
*GLOBAL 9;
LABEL EXIT.LABEL;
@BOX 4.1
LSPEC LIST.JOBS ();
LSPEC SET.UP  ();
LSPEC SET.COMMON.SEGMENT (ADDR [LOGICAL8], LOGICAL64, INTEGER, LOGICAL);
   #LIB10.1
   #LIB10.3
   #LIB10.4
@BOX 6.1
*END
@END

@TITLE LIB10/1(1,11)

@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
SYS13 PROCESS MANAGEMENT
SYS14 MEMORY MANAGEMENT
SYS16 FILE SYSTEM
SYS22 SYSTEM MAINTENANCE
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 4.1
LSPEC CATALOGUE.PROCESSES ();
IMPORT LITERAL SYS14.SEG.SHIFT;
LSPEC RELEASE.SEGMENT (INTEGER);
LSPEC MAP (INTEGER, INTEGER, INTEGER);
LSPEC READ.FILE.STATUS (ADDR[LOGICAL8], LOGICAL64);
LSPEC OPEN.FILE (ADDR [LOGICAL8], LOGICAL64, INTEGER, LOGICAL);
LSPEC CHANGE.COMMON.SEGMENT (INTEGER, INTEGER);
LSPEC SET.MACHINE (INTEGER);
LSPEC SET.NETWORK (INTEGER, LOGICAL64, INTEGER);
LSPEC SET.SUPERVISOR (INTEGER, LOGICAL64, LOGICAL64, INTEGER, INTEGER, INTEGER);
LSPEC SET.PERIPHERAL (INTEGER, LOGICAL64, INTEGER);
LSPEC REROUTE.PERI (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER);
LSPEC CONFIG (INTEGER, LOGICAL, INTEGER, INTEGER, LOGICAL, LOGICAL, LOGICAL);
IMPORT LITERAL LIB05.NO.OF.TRAPS;
PSPEC OUT.LINE.NO (INTEGER32);
PSPEC I.POS () / INTEGER32;
PSPEC ECHO.LINE ();
PSPEC IN.NAME () / LOGICAL64;
PSPEC IN.STR (ADDR [LOGICAL8]) / INTEGER;
PSPEC IN.HEX () / LOGICAL64;
IMPORT LITERAL INTEGER LIB04.MAPPED.IO.CONTROL.SEG;
PSPEC INIT.IO ();
PSPEC TRAP.PROC (INTEGER, INTEGER);
PSPEC SET.TRAP (INTEGER, ADDR TRAP.PROC);
PSPEC SET.RECOVERY.STATUS (INTEGER, INTEGER);
PSPEC DEFINE.INPUT (INTEGER, ADDR [LOGICAL8], INTEGER32) / INTEGER;
PSPEC DEFINE.OUTPUT (INTEGER, ADDR [LOGICAL8], INTEGER32, INTEGER32) / INTEGER;
PSPEC SELECT.OUTPUT (INTEGER);
PSPEC SELECT.INPUT (INTEGER);
PSPEC I.ENQ () / INTEGER;
PSPEC IN.CH () / INTEGER;
PSPEC NEXT.CH () / INTEGER;
PSPEC END.INPUT (INTEGER, INTEGER);
PSPEC END.OUTPUT (INTEGER, INTEGER);
PSPEC LIST.FILE (ADDR [LOGICAL8], ADDR [LOGICAL8]);
PSPEC OUT.TD (LOGICAL64, INTEGER);
PSPEC OUT.NAME (LOGICAL64);
PSPEC NEWLINES (INTEGER);
PSPEC IN.I () / ADDR;
PSPEC OUT.I (INTEGER32, INTEGER);
PSPEC SPACES (INTEGER);
PSPEC OUT.FN (ADDR [LOGICAL8]);
PSPEC CAPTION (ADDR [LOGICAL8]);
ADDR PW0, PW1, PW2, PW6;
@END

@TITLE LIB10.1(1,9)

@COL 1S-2T-3R-7R-4R-5R-6F
@FLOW 1-2OK-3-7-4-5-6
@FLOW 2FAILED-6
@BOX 1.0
LIST JOBS
@BOX 2.0
CATALOGUE PROCESSES OK?
@BOX 3.0
INITIALIZE POINTER
@BOX 4.0
OUTPUT JOB LISTS
@BOX 5.0
RELEASE SEGMENT
@BOX 6.0
END
@BOX 7.0
OUTPUT HEADING
@BOX 1.1
PROC LIST.JOBS;
INTEGER I, PROCS, SEG, MAPPED.SEG;
ADDR [JOB.LIST] LIST;
DATAVEC REASONS (LOGICAL32)
   0
   "   T"
   "  M "
   "  MT"
   " S  "
   " S T"
   " SM "
   " SMT"
   "I   "
   "I  T"
   "I M "
   "I MT"
   "IS  "
   "IS T"
   "ISM "
   "ISMT"
END
@BOX 2.1
CATALOGUE.PROCESSES ();
IF PW0 /= 0
@BOX 3.1
PW1 => PROCS;
MAP (PW2 => SEG, 1, 0);
PW1 => MAPPED.SEG;
MAKE (JOB.LIST, PROCS, PW6 <<- SYS14.SEG.SHIFT)
   => LIST;
@BOX 4.1
FOR I < PROCS DO
   IF P.NAME OF LIST^ [I] /= 0 THEN
      SELECT LIST^ [I];
      OUT.I (I, 3); SPACES (2);
      OUT.NAME (P.NAME); SPACES (2);
      OUT.NAME (U.NAME); SPACES (4);
      OUT.NAME (REASONS [SUS.RSN]);
      OUTI (PRI, 2);
      OUT.I (CPU.USED, 10);
      OUT.I (PID, 8);
      SPACES (2);
      OUT.TD (START, 0);
      NEWLINES (1);
   FI
OD
@BOX 5.1
MAP (MAPPED.SEG, 1, 0);
RELEASE.SEGMENT (SEG);
@BOX 6.1
END
@BOX 7.1
OUT.FN (%"  JOBS"); NEWLINES (1);
CAPTION (%" SPN  PROCESS   USER      STATUS  ");
CAPTION (%"PRIORITY  CPU USED    PID  CREATED");
NEWLINES (1);
@END

@TITLE LIB10.3(1,11)

@COL 1S-2R-3R-4T-5R-6R-10R-11R-12R-13F
@COL 15R

@ROW 15-5

@FLOW 1-2-3-4NO-5-6-10-11-12-13
@FLOW 4YES-15-10
@FLOW 6YES-10

@BOX 1.0
SET UP ()
@BOX 2.0
INITIALIZE I/O
@BOX 3.0
SET TRAPS
@BOX 4.0
CONFIGURATION FILE UNAVAILABLE?
@BOX 5.0
DEFINE INPUT AND OUTPUT
@BOX 6.0
INTERPRET SET UP FILE
#LIB10.3.2
@BOX 10.0
END INPUT AND OUTPUT STREAMS
@BOX 11.0
DEFINE OUTPUT TO OPERATORS
CONSOLE
@BOX 12.0
OUTPUT START UP MESSAGE AND
ERROR MONITORING
@BOX 13.0
END
@BOX 15.0
NOTE ERROR STATUS
@BOX 1.1
PROC SET.UP;
INTEGER I, ERROR.STATUS, TABLE.TYPE, CH, TABLE.INDEX;
LITERAL / ADDR [LOGICAL8] NIL = ;
LITERAL NO.OF.TABLE.TYPES = 8, MARKER = "@";
DATAVEC TABLE.ID (LOGICAL8)
   "E" ::END OF SET UP
   "M" ::MACHINE NUMBER
   "N" ::NETWORK
   "S" ::SUPERVISORS
   "P" ::PERIPHERAL
   "D" ::DEVICE
   "R" ::REROUTING
   "C" ::COMMON SEGMENT
END
PSPEC SKIP ();
PROC SKIP;
WHILE I.ENQ () & %C = 0 AND
   IN.CH () /= "$L" DO OD
END
PSPEC SET.UP.TRAP (INTEGER, INTEGER);
PROC SET.UP.TRAP (CLASS, CODE);
IF CLASS /= 6 OR CODE /= 1 /= 8 THEN
   LOOP:->LOOP;
ELSE
   CODE => PW0;
   -> EXIT.LABEL;
FI
END
PSPEC ERROR (INTEGER);
   #LIB10.3.1
-1 => TABLE.TYPE;
0 => ERROR.STATUS;
@BOX 2.1
INIT.IO ();
-> L1;
LINE.EXIT1:-> LINE.EXIT;
L1:
LINE.EXIT1 => EXIT.LABEL;
@BOX 3.1
FOR I < LIB05.NO.OF.TRAPS DO
   SET.TRAP (I, ^SET.UP.TRAP);
   SET.RECOVERY.STATUS (I, 0);
OD
@BOX 4.1
READ.FILE.STATUS (%"CONFIG", "SYSTEM");
IF PW0 /= 0
@BOX 5.1
DEFINE.INPUT (0, %"SYSTEM:CONFIG", 0);
DEFINE.OUTPUT (0, NIL, 0, 0);
SELECT.OUTPUT (0);
SELECT.INPUT (0);
WHILE I.ENQ () & %C = 0
   AND NEXT.CH () = "$L" DO
   IN.CH ();
OD
@BOX 6.1
#LIB10.3.2
@BOX 10.1
END.INPUT (0, 0);
END.OUTPUT (0, 0);
@BOX 11.1
DEFINE.OUTPUT (0, %"OPR*", %100, 0);
SELECT.OUTPUT (0);
@BOX 12.1
OUT.FN (%"START UP");
NEW.LINES (1);
ALTERNATIVE ERROR.STATUS FROM
   CAPTION (%"SET UP OK$L");
   CAPTION (%"NO CONFIGURATION FILE$L");
   BEGIN
      CAPTION (%"ERROR(S) IN SET UP:$L");
      LIST.FILE (NIL, %"STR0*");
   END
END
END.OUTPUT (0, 0);
MAP (0, LIB04.MAPPED.IO.CONTROL.SEG, 0);
@BOX 13.1
END
@BOX 15.1
1 =>  ERROR.STATUS;
@END
@TITLE LIB10.3.1(1,8)

@COL 1S-2R-3R-4F

@FLOW 1-2-3-4

@BOX 1.0
ERROR (ERROR NUMBER)
@BOX 2.0
SET ERROR STATUS
@BOX 3.0
OUTPUT ERROR MESSAGE
@BOX 4.0
END
@BOX 1.1
PROC ERROR (ERROR.NO);
INTEGER ERROR.TYPE;
@BOX 2.1
2 => ERROR.STATUS;
IF ERROR.NO = 1 THEN
   0 => TABLE.TYPE;
FI
@BOX 3.1
IF ERROR.NO < 0 THEN
   0 => ERROR.TYPE;
ELSE
   IF ERROR.NO = 8 THEN
      2 => ERROR.TYPE;
   ELSE
      ERROR.NO => ERROR.TYPE;
   FI
FI
ALTERNATIVE ERROR.TYPE FROM
   BEGIN
      CAPTION (%"COMMAND ERROR ");
      OUT.I (ERROR.NO, 0);
   END
   CAPTION (%"UNEXPECTED END OF INPUT");
   CAPTION (%"WRONG FORMAT FOR ENTRY");
   CAPTION (%"UNKNOWN SET UP TYPE");
END
CAPTION (%":");
OUT.LINE.NO (I.POS());
ECHO.LINE ();
NEWLINES (1);
@BOX 4.1
END
@END
@TITLE LIB10.3.2(1,9)

@COL 17N-14R-16N
@COL 1S-18N-6T-7T-8T-9R-13F

@ROW 17-18
@ROW 14-8

@FLOW 1-18-6NO-7OK-8N0-9-8
@FLOW 6YES-13
@FLOW 7FAIL-14-16-17-18
@FLOW 8YES-16
@BOX 1.0
INTERPRET SET UP FILE
@BOX 6.0
END OF FILE?
@BOX 7.0
READ TABLE TYPE
@BOX 8.0
END OF TABLE?
@BOX 9.0
INSERT TABLE ENTRIES
@BOX 14.0
MONITOR ERROR
@BOX 13.0
END
@BOX 1.1
::INTERPRET SET UP FILE
::BEGIN
LOGICAL8 [16] FILE.NAME;
@BOX 6.1
IF I.ENQ () & %C /= 0
   OR TABLE.TYPE = 0
@BOX 7.1
NO.OF.TABLE.TYPES => TABLE.TYPE;
WHILE I.ENQ () & %C = 0 AND
   IN.CH () /= MARKER DO
   SKIP ();
OD
IF I.ENQ () & %C = 0 THEN
   IN.CH () => CH;
   -1 => TABLE.TYPE;
   WHILE  1 +> TABLE.TYPE < NO.OF.TABLE.TYPES
      AND CH /= TABLE.ID [TABLE.TYPE] DO OD
FI
-1 => TABLE.INDEX;
SKIP ();
IF TABLE.TYPE = NO.OF.TABLE.TYPES
@BOX 8.1
IF TABLE.TYPE = 0 OR
   I.ENQ () & %C /= 0 OR
   NEXT.CH () = MARKER
@BOX 9.1
1 +> TABLE.INDEX;
ALTERNATIVE TABLE.TYPE - 1 FROM
   SET.MACHINE (INHEX ());
   SET.NETWORK (TABLE.INDEX, IN.NAME (), IN.HEX ());
   SET.SUPERVISOR (TABLE.INDEX, IN.NAME (), IN.NAME (), IN.HEX (),
      IN.HEX (), IN.HEX ());
   SET.PERIPHERAL (TABLE.INDEX, IN.NAME (), IN.HEX ());
   CONFIG (IN.HEX (), IN.HEX (), IN.HEX (), IN.HEX (), IN.HEX (), IN.HEX (), IN.
HEX ());
   REROUTE.PERI (TABLE.INDEX, IN.HEX (), IN.HEX (), IN.HEX (), IN.HEX ());
   SET.COMMON.SEGMENT (PART (^FILE.NAME, 0, IN.STR (^FILE.NAME) - 1),
       IN.NAME (), IN.HEX (), IN.HEX ());
END
LINE.EXIT:
IF PW0 /= 0 THEN
   ERROR (PW0);
FI
IF TABLE.TYPE /= 0 THEN
   SKIP ();
FI
@BOX 14.1
ERROR (3);
@BOX 13.1
::END
@END
@TITLE LIB10.4(1,11)
@COL 1S-2T-3R-4R-5F
@FLOW 1-2OK-3-4-5
@FLOW 2FAIL-5

@BOX 1.0
SET COMMON SEGMENT (FILNAME, USER NAME, COMMON SEGMENT, ACCESS)
@BOX 2.0
OPEN FILE
@BOX 3.0
CHANGE COMMON SEGMENT
@BOX 4.0
RELEASE OLD SEGMENT
@BOX 5.0
END
@BOX 1.1
PROC SET.COMMON.SEGMENT (FNAME, USER, COMMON.SEG, ACCESS);
INTEGER SEG.NO, SAVE.PW0;
@BOX 2.1
OPEN.FILE (FNAME, USER, -1, ACCESS);
IF PW0 /= 0
@BOX 3.1
PW1 => SEG.NO;
CHANGE.COMMON.SEGMENT (SEG.NO, COMMON.SEG);
@BOX 4.1
PW0 => SAVE.PW0;
RELEASE.SEGMENT (SEG.NO);
SAVE.PW0 => PW0;
@BOX 5.1
END
@END


