$CONTROL CODE,MAP,USLINIT                                      <<04600>>00010000
<<UCOP - MODULE 07>>                                                    00015000
<< HP32002C MPE SOURCE C.00.00>>                                        00020000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00025000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00030000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00035000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00040000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00045000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00050000
$CONTROL MAIN= UCOP                                                     00055000
$CONTROL SEGMENT= UCOP                                                  00060000
$THIRTY                                                                 00065000
$CONTROL PRIVILEGED                                                     00070000
$CONTROL UNCALLABLE                                                     00075000
****     USER     ****                                                  00080000
****  CONTROLLER  ****                                                  00085000
****   PROGRAM    ****                                                  00090000
****  U*C*O*P*    ****                                                  00095000
                                                                        00100000
                                                                        00105000
                                                                        00110000
COMMENT: PROGRAM WORKING UNDER UCOP,IN CHARGE OF MAINTAINING,           00115000
         REGULATING AND CONTROLLING USER ACTIVITY.                      00120000
         CREATES JOB MAIN PROCESS,                                      00125000
         DELETES PROCESSES,                                             00130000
         ABORTS JOBS,                                                   00135000
         ETC......                                                      00140000
         ;                                                              00145000
                                                                        00150000
BEGIN                                                                   00155000
$INCLUDE INCLPXG                                               <<06573>>00160000
$INCLUDE PCBFINCL                                              <<06573>>00165000
$PAGE "***   GENERAL EQIVALENCES   ***"                                 00170000
DEFINE                                                                  00175000
      A'        = ABSOLUTE       #,                                     00180000
      ENABLE    = ASSEMBLE(SED 1)#,                                     00185000
      DISABLE   = ASSEMBLE(SED 0)#;                                     00190000
EQUATE SYSWAITTODISPMSG=%1053;                                 <<01549>>00195000
DEFINE PHASETRANSFLAG=(3:1)#;                                  <<01549>>00200000
INTEGER                                                                 00205000
      X    = X,                                                         00210000
      XREG = X,                                                         00215000
      S3= S-3,                                                          00220000
      S1 = S-1,                                                         00225000
      S0 = S-0;                                                         00230000
INTEGER ARRAY                                                           00235000
      ARRQ0 (*) = Q+0;                                                  00240000
INTEGER                                                                 00245000
      BD0= DB+0,                                                        00250000
      DB1= DB+1,                                                        00255000
      DB2= DB+2,                                                        00260000
      DB3= DB+3,                                                        00265000
      DB4= DB+4,                                                        00270000
      DB5= DB+5,                                                        00275000
      DB6= DB+6,                                                        00280000
      DB7= DB+7,                                                        00285000
      DB8= DB+8,                                                        00290000
      DB9= DB+9,                                                        00295000
      DB10= DB+10,                                                      00300000
      DB11= DB+11;                                                      00305000
INTEGER POINTER                                                         00310000
      PDB2= DB+2,                                                       00315000
      PDB4 = DB+4,                                                      00320000
      PDB3 = DB+3,                                                      00325000
      PDB12= DB+12,                                                     00330000
      PDB13= DB+13,                                                     00335000
      PS2= S-2,                                                         00340000
      PS4= S-4;                                                         00345000
BYTE POINTER                                                            00350000
      BPS0= S-0;                                                        00355000
INTEGER ARRAY                                                           00360000
      ARRDB0 (*) = DB+0,                                                00365000
      ARRDB5 (*) = DB+5,                                                00370000
      ARRDB8 (*) = DB+8,                                                00375000
      ARRDB9 (*) = DB+9,                                                00380000
      ARRDB12 (*) = DB+12;                                              00385000
INTEGER ARRAY                                                           00390000
      ARRS24 (*) = S-24,                                                00395000
      ARRS17 (*) = S-17;                                                00400000
$PAGE "***   GLOBAL CONSTANTS   ***"                                    00405000
EQUATE                                                                  00410000
   <<FIXED CELLS>>                                                      00415000
      CSTB        = 0        ,                                          00420000
      XCST        = 1        ,                                          00425000
      DSTB        = 2        ,                                          00430000
      QI          = 5        ,                                          00435000
      CONSOLECELL  = %1074,                                    <<LJC>>  00440000
   <<TABLES/DST/SIR/SIZE>>                                              00445000
      URLDST      = 9        ,                                          00450000
      URLSIR      = 8        ,                                          00455000
   <<STACK PARMS>>                                                      00460000
      MAXSIZE     = 14000, << Need room for 8K STORE buffer >> <<02544>>00465000
      LOCSIZE     = 1300     ,                                          00470000
      DLSIZE      = 0        ,                                          00475000
      PXFILE      = 200      ,                                          00480000
      PXFIXEDJN   = 19       ,                                 <<00.01>>00485000
      PCBXSIZE    = PXG'SIZE + FIXEDSIZE + PXFILE + 3;         <<06573>>00490000
LOGICAL PCBPT;                                                 <<06574>>00495000
$INCLUDE INCLPCB5                                              <<06574>>00500000
LOGICAL POINTER PCB = SYSPCBINDEX;                             <<06574>>00505000
$INCLUDE INCLCIS                                               <<04735>>00510000
   <<SYSTEM GLOBAL>>                                                    00515000
EQUATE                                                                  00520000
         ABSYS          = %1000    ,                           <<01549>>00525000
         CIEXTL         = %157     ,                                    00530000
         CIINTL         = %160     ,                                    00535000
         MISCWORD       = %1121    ,                           <<01549>>00540000
            << JOBSYNCH BITS:                                           00545000
               15  DEVICE FREED BY DEALLOCATE,                          00550000
               14  JOB(S) WAITING FOR DEVICE IN UCOP,                   00555000
               13  JOB MADE READY BY STARTDEVICE                        00560000
                      (MORGUE/CLEANUPJOB).                              00565000
           5 - 12  PORT TIMEOUT BIT MAP                                 00570000
                   1 = TIMEOUT HAS OCCURRED ON THE PORT                 00575000
                       DATA SEGMENT.                                    00580000
                   0 = NO TIMEOUT EXISTS FOR THE PORT DATA SEG          00585000
            >>                                                          00590000
         UCOPSW         = %300     ;                                    00595000
$INCLUDE INCLLDT5                                              <<06572>>00600000
                                                               <<06572>>00605000
DEFINE                                                                  00610000
         ABSYS'CIEXTL   = A'(ABSYS+CIEXTL)    #,                        00615000
         ABSYS'CIINTL   = A'(ABSYS+CIINTL)    #,                        00620000
         ABSYS'MISCWORD   = A'(MISCWORD)#,                     <<01549>>00625000
         JOBSYNC        = (13:3)#,                             <<01549>>00630000
         PORTIMER       = (5:8)#;                              <<01549>>00635000
DEFINE                                                                  00640000
         LD'DEVTYPE     = 2).(10:6     #;                               00645000
   <<JPCNT>>                                                            00650000
$INCLUDE INCLJPCT                                              <<06534>>00655000
INTEGER ARRAY JPCNTARR(*) = DB+0; << Job Process Count Table >><<06534>>00660000
$PAGE "***   COMMON FIELDS OF JMAT, IDD, ODD   ***"                     00665000
$SET X8=OFF                                                    <<06578>>00670000
$INCLUDE INCLJMAT                                              <<06578>>00675000
                                                               <<06578>>00680000
<<  Some auxiliary JMAT definitions  >>                        <<06578>>00685000
                                                               <<06578>>00690000
DEFINE                                                         <<06578>>00695000
   <<  job/session  types  >>                                  <<06578>>00700000
   SESSTYPE   =    1#,  <<  A session  >>                      <<06578>>00705000
   JOBTYPE    =    2#,  <<  A job      >>                      <<06578>>00710000
   JOBHIPRI   =    15#, <<  high priority  >>                  <<06578>>00715000
                                                               <<06578>>00720000
   <<  job/session  states  >>                                 <<06578>>00725000
   JOBINTRO   =    1#,                                         <<06578>>00730000
   JOBWAIT    =    %40#,                                       <<06578>>00735000
   JOBINIT    =    %60#,                                       <<06578>>00740000
   JOBSCHED    =    %70#,                                      << 8198>>00745000
   JOBEXEC    =    2#,                                         <<06578>>00750000
   JOBDONE    =    3#,                                         <<06578>>00755000
   JOBSUSP    =    4#,                                         <<06578>>00760000
   JOBERR     =    %50#;                                       <<06578>>00765000
                                                               <<06578>>00770000
$PAGE "***   UCOP DECLARATIONS   ***"                                   00775000
INTEGER     REQ1    = Q+1    ,                                          00780000
            REQ2    = Q+2    ;                                          00785000
INTEGER ARRAY REQLIST(*) = DB+0;                                        00790000
DOUBLE ARRAY REQENTRY(*) = DB+0;                                        00795000
INTEGER     REQMAX  = DB+0   ,                                          00800000
            REQFREE = DB+1   ,                                          00805000
            REQNEXT = DB+2   ;                                          00810000
                                                                        00815000
<< ALLOCATE PARMS >>                                                    00820000
INTEGER ARRAY     DEVINFO (0:11);                              <<06572>>00825000
BYTE ARRAY        NULLFORMS (0:1) := "..";                              00830000
INTEGER POINTER   XDDSUBP;          <<SUB ENTRY PNTR>>                  00835000
INTEGER           XDDSUBX;          <<FOR OLD ALLOCATE>>                00840000
INTEGER           UCOPPIN;          <<ALLOCATE "OWNER">>                00845000
                                                               << 8198>>00850000
EQUATE                                                         << 8198>>00855000
   UCOPWAIT  = -24;    << %30 (decimal 24) is the WAIT     >>  << 8198>>00860000
                       << mask for JUNK and TIMER waits.   >>  << 8198>>00865000
                       << The negative value indicates     >>  << 8198>>00870000
                       << that the Wakeup Waiting Switch   >>  << 8198>>00875000
                       << is to be used.                   >>  << 8198>>00880000
                                                                        00885000
                                                                        00890000
EQUATE NONEWSES       = 80,  << CAN'T INITIATE NEW SESS... >>  <<LJC>>  00895000
       CANTGETLIST    = 81,  << ALLOCATION OF SDTLIST FAIL >>  <<LJC>>  00900000
       CANTGETIN      = 82;  << ALLOCATION OF STDIN FAIL   >>  <<LJC>>  00905000
                                                               << 8198>>00910000
EQUATE                                                         << 8198>>00915000
   SYSSET       = 1,                                           << 8198>>00920000
   SCHEDCOMPERR = 83;                                          << 8198>>00925000
                                                               << 8198>>00930000
<< the following equates are for the message numbers, to >>    << 8998>>00935000
<< inform the operator of the failure to allocate resources.>> << 8998>>00940000
<< For session, the ldev number is given.  For jobs,  >>       << 8998>>00945000
<< since the job will be put in wait state, we will let >>     << 8998>>00950000
<< them know the job number.     >>                            << 8998>>00955000
EQUATE CANTGETSTACK = 102,    << for sessions >>               << 8998>>00960000
       CANTGETJIT   = 103,                                     << 8998>>00965000
       CANTGETJDT   = 104,                                     << 8998>>00970000
       CANTGETPCB   = 105,                                     << 8998>>00975000
       CANTGETJPCNT = 106,                                     << 8998>>00980000
       CANTGETFILEDST=107,                                     << 8998>>00985000
       CANTGETJIN   = 108,                                     << 8998>>00990000
       CANTGETJLIST = 109;                                     << 8998>>00995000
EQUATE JCANTGETSTACK = 110,    << for jobs >>                  << 8998>>01000000
       JCANTGETJIT   = 111,                                    << 8998>>01005000
       JCANTGETJDT   = 112,                                    << 8998>>01010000
       JCANTGETPCB   = 113,                                    << 8998>>01015000
       JCANTGETJPCNT = 114,                                    << 8998>>01020000
       JCANTGETFILEDST=115,                                    << 8998>>01025000
       JCANTGETJIN   = 116,                                    << 8998>>01030000
       JCANTGETJLIST = 117;                                    << 8998>>01035000
LOGICAL WAITFLAGS;                                                      01040000
      << UCOP LOCAL WAIT INFORMATION:                                   01045000
         15 JOB WAITING FOR DEVICE (WILL SET JOBSYNCH BEFORE WAIT),     01050000
         0  ERROR PRINTING(S) WAITING (CHECKED BEFORE WAIT).    >>      01055000
INTEGER    COMINTLB     ,                                               01060000
           COMINTDP     ;                                               01065000
<< The following declarations are for the handling of the  >>  << 8198>>01070000
<< Timer Request List (TRL) entry used for the scheduling  >>  << 8198>>01075000
<< of jobs.                                                >>  << 8198>>01080000
   INTEGER                                                     << 8198>>01085000
      UCOPPCBINX,         << Holds the PCB Index of this   >>  << 8198>>01090000
                          << process for the TIMEREQ call. >>  << 8198>>01095000
      TRLX,               << Index of the TRL entry.       >>  << 8198>>01100000
      TRL'JMATINX,        << JMAT index of the first       >>  << 8198>>01105000
                          << scheduled job associated with >>  << 8198>>01110000
                          << the TRL entry (TRLX).         >>  << 8198>>01115000
      TRL'JSNO;           << The job number of the first   >>  << 8198>>01120000
                          << scheduled job.                >>  << 8198>>01125000
                                                               << 8198>>01130000
   EQUATE                                                      << 8198>>01135000
      UCOPLPIN  = 2,      << For the call to SYSPROC.      >>  << 8198>>01140000
      NOTRL     = -1,     << Null value for TRLX and       >>  << 8198>>01145000
                          << TRL'JSNO.                     >>  << 8198>>01150000
      WATCHDOG  = %12;    << TIMEREQ for a watchdog timer  >>  << 8198>>01155000
                          << request which will wake the   >>  << 8198>>01160000
                          << specified process at the      >>  << 8198>>01165000
                          << specified time.               >>  << 8198>>01170000
                                                               << 8198>>01175000
                                                               << 8198>>01180000
                                                                        01185000
SWITCH SWEX := NULL, JMP, PROCOUT;                                      01190000
                                                                        01195000
                                                                        01200000
INTRINSIC DEBUG;                                               <<06577>>01205000
                                                               <<06573>>01210000
LOGICAL PROCEDURE GETSIR(A);                                            01215000
   VALUE   A;                                                           01220000
   LOGICAL A;                                                           01225000
   OPTION EXTERNAL;                                                     01230000
                                                               << 8153>>01235000
DOUBLE PROCEDURE FINDPROCESSPORT(PIN);                         << 8153>>01240000
VALUE PIN;                                                     << 8153>>01245000
INTEGER PIN;                                                   << 8153>>01250000
OPTION EXTERNAL;                                               << 8153>>01255000
                                                               << 8153>>01260000
PROCEDURE SEND'DB(PORTID,SUBQUEUE,MESSAGE);                    << 8153>>01265000
VALUE PORTID,SUBQUEUE,MESSAGE;                                 << 8153>>01270000
DOUBLE PORTID;                                                 << 8153>>01275000
INTEGER SUBQUEUE;                                              << 8153>>01280000
INTEGER POINTER MESSAGE;                                       << 8153>>01285000
OPTION EXTERNAL;                                               << 8153>>01290000
                                                               << 8153>>01295000
                                                                        01300000
PROCEDURE RELSIR(A,B);                                                  01305000
   VALUE   A,B;                                                         01310000
   LOGICAL A,B;                                                         01315000
   OPTION EXTERNAL;                                                     01320000
                                                               << 8198>>01325000
PROCEDURE ABORTTIMEREQ( TRLX );                                << 8198>>01330000
   VALUE   TRLX;                                               << 8198>>01335000
   INTEGER TRLX;                                               << 8198>>01340000
OPTION EXTERNAL;                                               << 8198>>01345000
                                                               << 8198>>01350000
INTEGER PROCEDURE TIMEREQ( CODE, REQ, TIME );                  << 8198>>01355000
   VALUE   CODE, REQ, TIME;                                    << 8198>>01360000
   DOUBLE  TIME;                                               << 8198>>01365000
   INTEGER CODE, REQ;                                          << 8198>>01370000
OPTION EXTERNAL;                                               << 8198>>01375000
                                                               << 8198>>01380000
PROCEDURE SCHEDULEJOB( JMATP );                                << 8198>>01385000
   VALUE   JMATP;                                              << 8198>>01390000
   INTEGER POINTER   JMATP;                                    << 8198>>01395000
OPTION EXTERNAL;                                               << 8198>>01400000
                                                               << 8198>>01405000
INTEGER PROCEDURE COMPTIME( T1, T2, DIFF, ERR );               << 8198>>01410000
   INTEGER ARRAY   T1, T2;                                     << 8198>>01415000
   DOUBLE          DIFF;                                       << 8198>>01420000
   INTEGER         ERR;                                        << 8198>>01425000
OPTION VARIABLE, EXTERNAL;                                     << 8198>>01430000
                                                                        01435000
PROCEDURE RELDATASEG(A);                                                01440000
   VALUE   A;                                                           01445000
   LOGICAL A;                                                           01450000
   OPTION EXTERNAL;                                                     01455000
                                                                        01460000
PROCEDURE RETURNENTRY(A,B);                                             01465000
   VALUE   A,B;                                                         01470000
   LOGICAL A,B;                                                         01475000
   OPTION EXTERNAL;                                                     01480000
                                                                        01485000
INTEGER PROCEDURE GETDATASEG(MEMSIZE,VDSIZE);                           01490000
   VALUE   MEMSIZE,VDSIZE;                                              01495000
   INTEGER MEMSIZE,VDSIZE;                                              01500000
   OPTION EXTERNAL;                                                     01505000
                                                                        01510000
INTEGER PROCEDURE GETSTACK(MEMSIZE,VDSIZE);                             01515000
   VALUE   MEMSIZE,VDSIZE;                                              01520000
   INTEGER MEMSIZE,VDSIZE;                                              01525000
   OPTION EXTERNAL;                                                     01530000
                                                                        01535000
LOGICAL PROCEDURE GETENTRY(IX);                                         01540000
   VALUE   IX;                                                          01545000
   LOGICAL IX;                                                          01550000
   OPTION EXTERNAL;                                                     01555000
                                                                        01560000
LOGICAL PROCEDURE EXCHANGEDB(A);                                        01565000
   VALUE   A;                                                           01570000
   LOGICAL A;                                                           01575000
   OPTION EXTERNAL;                                                     01580000
                                                                        01585000
PROCEDURE AWAKE(PCBPT,N,W);                                             01590000
   VALUE   PCBPT,N,W;                                                   01595000
   INTEGER PCBPT,N,W;                                                   01600000
   OPTION EXTERNAL;                                                     01605000
                                                                        01610000
PROCEDURE WRITEDSEG(D);                                                 01615000
   VALUE   D;                                                           01620000
   INTEGER D;                                                           01625000
   OPTION EXTERNAL;                                                     01630000
                                                               << 8153>>01635000
INTEGER PROCEDURE GET'DCS'FAILNO(WHERE,ERRNUM);                << 8153>>01640000
VALUE WHERE,ERRNUM;                                            << 8153>>01645000
INTEGER WHERE,ERRNUM;                                         << KJ  >> 01650000
OPTION EXTERNAL;                                               << 8153>>01655000
                                                                        01660000
PROCEDURE PROCREATE (PIN, PLABEL, DELTAP, STACKDST, GLOBSIZE,  <<01200>>01665000
                     DLSIZE, LOCSIZE, PRI, STRING, STRINGLNTH, <<01200>>01670000
                     PARM, FLAGS, MAXSTACK, STDIN, STDLIST);   <<01200>>01675000
  VALUE PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE,   <<01200>>01680000
        PRI, STRING, STRINGLNTH, PARM, FLAGS, MAXSTACK;        <<01200>>01685000
  INTEGER PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE, <<01200>>01690000
          PRI, STRING, STRINGLNTH, PARM, PIN, MAXSTACK;        <<01200>>01695000
  LOGICAL FLAGS;                                               <<01200>>01700000
  LOGICAL ARRAY STDIN, STDLIST;                                <<01200>>01705000
  OPTION EXTERNAL;                                             <<01200>>01710000
                                                                        01715000
PROCEDURE WAIT(WF,JP);                                                  01720000
   VALUE   WF,JP;                                                       01725000
   INTEGER WF,JP;                                                       01730000
   OPTION EXTERNAL;                                                     01735000
                                                                        01740000
PROCEDURE BURRYPROC(PCBPT);                                             01745000
   VALUE   PCBPT;                                                       01750000
   INTEGER PCBPT;                                                       01755000
   OPTION EXTERNAL;                                                     01760000
                                                                        01765000
PROCEDURE BURYPROC(PCBPT);                                              01770000
   VALUE PCBPT;                                                         01775000
   INTEGER PCBPT;                                                       01780000
   OPTION EXTERNAL;                                                     01785000
                                                                        01790000
INTEGER PROCEDURE ALLOCATE                                              01795000
   (INDEX, OLD, OUTPRI, ID, JMPIN, FORMSMSG, JNUM, COPIES,              01800000
         DEVINFO, XDDSUBP, ACCESS);                                     01805000
      VALUE INDEX, OLD, OUTPRI, JMPIN, JNUM, COPIES;                    01810000
      INTEGER INDEX, OUTPRI, JMPIN, JNUM, COPIES, ACCESS;               01815000
      LOGICAL OLD;                                                      01820000
      ARRAY ID, DEVINFO;                                                01825000
      BYTE ARRAY FORMSMSG;                                              01830000
      INTEGER POINTER XDDSUBP;                                          01835000
      OPTION EXTERNAL;                                                  01840000
                                                                        01845000
PROCEDURE DEALLOCATE (DEVICE);                                          01850000
   VALUE DEVICE;                                                        01855000
   DOUBLE DEVICE;                                              <<06577>>01860000
   OPTION EXTERNAL;                                                     01865000
                                                                        01870000
DOUBLE PROCEDURE ATTACHIO (DEV, QM, DST, BUF, FN, CNT, P1, P2, FL);     01875000
   VALUE DEV, QM, DST, BUF, FN, CNT, P1, P2, FL;                        01880000
   INTEGER DEV, QM, DST, BUF, FN, CNT, P1, P2, FL;                      01885000
   OPTION EXTERNAL;                                                     01890000
                                                                        01895000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,A,B,C,D,E,           <<0U.EB>>01900000
      DEST,REPLY,BUFF,DST,IOTYPE);                             <<0U.EB>>01905000
   VALUE SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,           <<0U.EB>>01910000
      DST,IOTYPE;                                              <<0U.EB>>01915000
   LOGICAL SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,         <<0U.EB>>01920000
      DST,IOTYPE;                                              <<0U.EB>>01925000
   OPTION VARIABLE,EXTERNAL;                                   <<0U.EB>>01930000
                                                                        01935000
PROCEDURE ABORTPROCIO (PIN);                                            01940000
   VALUE PIN;                                                           01945000
   INTEGER PIN;                                                         01950000
   OPTION EXTERNAL;                                                     01955000
                                                                        01960000
LOGICAL PROCEDURE CILOGTABLE(C,J,L,A);                         <<00.04>>01965000
   VALUE   C,J;                                                <<00.04>>01970000
   INTEGER C,J,L;                                              <<00.04>>01975000
   INTEGER ARRAY A;                                            <<00.04>>01980000
   OPTION EXTERNAL;                                            <<00.04>>01985000
                                                               <<00.04>>01990000
PROCEDURE DELINK'JMAT (JMATINX);                               <<06578>>01995000
   VALUE JMATINX;                                              <<06578>>02000000
   INTEGER JMATINX;                                            <<06578>>02005000
   OPTION EXTERNAL;                                                     02010000
                                                                        02015000
PROCEDURE DEALLOCATE'JMAT (EP);                                <<06578>>02020000
   VALUE EP;                                                            02025000
   INTEGER POINTER EP;                                                  02030000
   OPTION EXTERNAL;                                                     02035000
                                                                        02040000
INTEGER PROCEDURE SYSPROC(LPIN);                                        02045000
   VALUE   LPIN;                                                        02050000
   INTEGER LPIN;                                                        02055000
   OPTION EXTERNAL;                                                     02060000
                                                                        02065000
PROCEDURE FCREATECB (A,B,C,D,E);                                        02070000
   VALUE A,B,C,D,E;                                                     02075000
   INTEGER C,D,E;                                              <<07270>>02080000
   DOUBLE B;                                                   <<07270>>02085000
   INTEGER POINTER A;                                                   02090000
   OPTION EXTERNAL;                                                     02095000
                                                               <<01549>>02100000
PROCEDURE FCPOSTIMEOUT(PORTMAP);                               <<01549>>02105000
   VALUE PORTMAP;                                              <<01549>>02110000
   INTEGER PORTMAP;                                            <<01549>>02115000
   OPTION EXTERNAL;                                            <<01549>>02120000
PROCEDURE PUT'JOBNUM'IN'PXFIXED(JNUM,JTYPE);                   <<06573>>02125000
VALUE JNUM,JTYPE;  INTEGER JNUM,JTYPE;                         <<06573>>02130000
<< THIS PROCEDURE IS CALLED IN SPLIT STACK MODE   >>           <<06573>>02135000
<< FROM LAUNCHJOB( DB POINTING AT JMAT ).  IT WILL>>           <<06573>>02140000
<< PUT THE JOB/SESSION NUMBER AND TYPE INTO UCOPS >>           <<06573>>02145000
<< PXFIXED FOR PROCREATE WHICH WILL TAKE IT OUT   >>           <<06573>>02150000
<< AND PLACE IT IN THE PROCESS-JOB CROSSREFERENCE >>           <<06573>>02155000
<< TABLE WHICH IS USED BY SHOWQ.                  >>           <<06573>>02160000
BEGIN                                                          <<06573>>02165000
INTEGER PXFIXEDLOC;                                            <<06573>>02170000
ARRAY QARRAY(*)=Q+0;                                           <<06573>>02175000
PXFIXED;                                                       <<06573>>02180000
PXFXJOBNUM := JNUM;                                            <<06573>>02185000
PXFXJOBTYPE := JTYPE;                                          <<06573>>02190000
END; << PUT'JOBNUM'IN'PXFIXED >>                               <<06573>>02195000
                                                               <<06573>>02200000
$PAGE "***   JOB SELECTION/LAUNCH ROUTINES   ***"                       02205000
INTEGER PROCEDURE LAUNCHJOB (JMATP);                                    02210000
   VALUE JMATP;                                                         02215000
   INTEGER POINTER JMATP;                                               02220000
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                             02225000
<< DETERMINES WHETHER JOB <JMATP> CAN BE LAUNCHED, EXAMINING            02230000
   AVAILABILITY OF JOB-LOCAL, JOB-TYPE RELEVANT, AND                    02235000
   SYSTEM RESOURCES.  YF EVERY CONDITION SATISFIED, AND ALL             02240000
   RESOURCES ACQUIRED, LAUNCHJOB UPDATES THE JMAT ENTRY                 02245000
   AND "LAUNCHES" JOB (PROCREATE/AWAKE).    >>                          02250000
<< * Fix Information                                       >>  <<LJC>>  02255000
<<                                                         >>  <<LJC>>  02260000
<<   Informs the console if the allocation for $STDLIST or >>  <<LJC>>  02265000
<<   $STDIN fails during a logon attempt                   >>  <<LJC>>  02270000
<<   The LDEV is now printed for an OVERLOAD message       >>  <<LJC>>  02275000
<<   The LDEV will be the input device the launch failed   >>  <<LJC>>  02280000
<<                                                         >>  <<LJC>>  02285000
<< ********************************************************* >><<06578>>02290000
<<        LAUNCHJOB is called in split stack with DB at      >><<06578>>02295000
<<        the JMAT.                                          >><<06578>>02300000
<< ********************************************************* >><<06578>>02305000
<< * Fix Information                                    >>     <<06534>>02310000
<<                                                      >>     <<06534>>02315000
<<   Fix pertains to the two new routines to handle the >>     <<06534>>02320000
<<   new MPEV JPCNT table.  The biggest difference in   >>     <<06534>>02325000
<<   table, is a bit map for the entries.  The routines >>     <<06534>>02330000
<<   have further information and documentation.        >>     <<06534>>02335000
<<                                                      >>     <<06534>>02340000
BEGIN                                                                   02345000
<< USED FOR BUILDING PXGLOBAL >>                               <<06573>>02350000
   ARRAY QARRAY(0:PXG'SIZE-1)=Q;                               <<06573>>02355000
   INTEGER PCBGLOBLOC := 0; << INDEX WONT CHANGE IN THIS CASE>><<06573>>02360000
$INCLUDE INCLJIT                                               <<06818>>02365000
   INTEGER           FAILNUM   = LAUNCHJOB;   <<RETURN #>>              02370000
   EQUATE            NOFAIL   = 0,     <<SUCCESSFUL>>                   02375000
                     << JOB-SPECIFIC FAILURES: >>                       02380000
                     DEFERREDFAIL   = 8,                                02385000
                     JLISTFAIL   = 9,                                   02390000
                     JINFAIL   = 10,                                    02395000
                     << JOB-GENERIC FAILURE: >>                         02400000
                     LIMITFAIL   = 16,                                  02405000
                     << SYSTEM RESOURCE FAILURES: >>                    02410000
                     SYS2FAILGROUP  = 1,                       <<LJC>>  02415000
                     SYSFAILGROUP   = 3,                                02420000
                     STACKFAIL   = 24,                                  02425000
                     JITFAIL   = 25,                                    02430000
                     JDTFAIL   = 26,                                    02435000
                     PCBFAIL   = 27,                                    02440000
                     JPCNTFAIL   = 28,                                  02445000
                     FILEFAIL    = 29;                                  02450000
<< REQUEST PARAMETERS >>                                                02455000
   EQUATE            INITSTACKSIZE   = CIS'GLOBSTKSIZE         <<04600>>02460000
                                      +PCBXSIZE +LOCSIZE,      <<04600>>02465000
                     MAXSTACKSIZE   = MAXSIZE,                          02470000
                     MAXJITSIZE   = 0,                                  02475000
                     INITJDTSIZE = 34,                                  02480000
                     MAXJDTSIZE   = 50*128-4; <<50 SECTORS-4 >><<06819>>02485000
                     << 50 is an arbitrary number to bring >>  <<06819>>02490000
                     << MAXJDTSIZE up to about 6 K.  The   >>  <<06819>>02495000
                     << -4 is for the region trailer area. >>  <<06819>>02500000
                                                               <<06819>>02505000
   EQUATE            STACKFLAG   = 0,  <<FOR GETDATASEG>>               02510000
                     BITSPERWORD = 16, << Num bits/word >>     <<06534>>02515000
                     PCBCODE   = 3,    <<FOR GETENTRY>>        <<02.EB>>02520000
                     EXPCODE = 7;  << For INITJSMP >>          <<04556>>02525000
   DEFINE NWDSBITMAP = (JPCNTMAXENTRIES+BITSPERWORD-1)/        <<07268>>02530000
                       BITSPERWORD#;                           <<07268>>02535000
LOGICAL INTERACTIVE;                                           <<01549>>02540000
   INTEGER           JIN,              <<ALLOC'D DEVS>>                 02545000
                     JLIST,                                             02550000
                     STACKDST,         <<DATA SEG #S>>                  02555000
                     JIT'DST,                                  <<06818>>02560000
                     JDTDST,                                            02565000
                     MAINPIN,          <<PCB INDEX>>                    02570000
                     FILEDST,                                           02575000
                     PRI;              <<EXECUTION PRI (#)>>            02580000
   INTEGER JNUM,JTYPE;                                         << 8998>>02585000
<< INFO PASSED TO CI  IN JIT >>                                <<02.EB>>02590000
   EQUATE            CINUMPARMS   = 4;                         <<02.EB>>02595000
   ARRAY             CIPARMS (0:CINUMPARMS-1)   = Q;                    02600000
   INTEGER POINTER   JINXDDEP   = CIPARMS;    <<JIN XDD PNTR>>          02605000
   INTEGER           JINDEVTYPE   = CIPARMS +1;    <<JIN DEVTYPE>>      02610000
   INTEGER POINTER   JLISTXDDEP   = CIPARMS +2;    <<JLIST XDD P>>      02615000
   INTEGER           JLISTALLOC   = CIPARMS +3;    <<ALLOC RETURN>>     02620000
   INTEGER POINTER   DUM;                                      <<07270>>02625000
<< MISC LOCALS >>                                                       02630000
   INTEGER           ACCESS,           <<ALLOC ACCESS>>        <<06578>>02635000
                     WORDSET, << TEMP JPCNTNEXTAVAIL FOR RELEAS<<06534>>02640000
                     BIT, << BIT ENTRY SET FOR JPCT >>         <<06534>>02645000
                     BITCOUNT,  << bits looked at in JPCOUNT >><<07269>>02650000
                     JPCNTINDEX, << REF TO BITMAP BELOW >>     <<06534>>02655000
                     SAVESIR;          <<JPCNT SIR RETURN>>             02660000
   LOGICAL        NOMESS;                                      <<LJC>>  02665000
   LOGICAL           OLD,              <<ALLOCATE OLD FLAG>>            02670000
                     SHIFT,  << "COUNTER" FOR BIT SHIFT >>     <<06534>>02675000
                     << FOLLOWING VARIABLE INDICATES ALLOC ORDER:       02680000
                        (15:1) = FIRST,  (14:1) = SECOND;               02685000
                        VALUES:  TRUE => JIN,  FALSE => JLIST.  >>      02690000
                     ALLOCORDER  := 1;  <<ASSUME (JIN THEN JLIST)>>     02695000
                                                               <<06577>>02700000
<< DFLAGDEV is a double word structure.  The high order word >><<06577>>02705000
<< contains a FLAG mask and the low order word contains a    >><<06577>>02710000
<< logical device.  Used in calls to external procecure      >><<06577>>02715000
<< DEALLOCATE (see subroutine DEALLOC in LAUNCHJOB and       >><<06577>>02720000
<< procedure GETJOB).                                        >><<06577>>02725000
DOUBLE DFLAGDEV;                                               <<06577>>02730000
LOGICAL DFLAG =DFLAGDEV;                                       <<06577>>02735000
LOGICAL DDEV =DFLAGDEV+1;                                      <<06577>>02740000
                                                               <<06577>>02745000
                                                               <<06578>>02750000
<< ........................................................ >> <<06578>>02755000
<<   **** Declarations made for the JMAT - MPEV fixes ****  >> <<06578>>02760000
<<                                                          >> <<06578>>02765000
<<      JMATARR  --  The array used to reference a JMAT     >> <<06578>>02770000
<<      JMATINX  --  The index for JMATARR                  >> <<06578>>02775000
<<                   pointer to DELINKENTRY by reference.   >> <<06578>>02780000
<<      I        --  A loop index used in ALLOC (subroutine)>> <<06578>>02785000
<<                                                          >> <<06578>>02790000
<< ........................................................ >> <<06578>>02795000
   INTEGER ARRAY    JMATARR(*) = DB+0;                         <<06578>>02800000
   INTEGER          JMATINX;                                   <<06578>>02805000
   INTEGER I;                                                  <<06578>>02810000
                                                               <<06578>>02815000
   EQUATE SPOOLEDCLASS = -3; <<ALLOCATE RETURN>>               <<00640>>02820000
   LOGICAL NOSTDIN   := 0,        << FOR PROCREATE CALL >>     <<01200>>02825000
           NOSTDLIST := 0;                                     <<01200>>02830000
   EQUATE  NOSTRING   = 0,                                     <<01200>>02835000
           NOSTLEN    = 0;                                     <<01200>>02840000
   LOGICAL PCBPT;                                              <<06574>>02845000
<< >>                                                                   02850000
LOGICAL SUBROUTINE ALLOC (OLDPARM);                                     02855000
   VALUE OLDPARM;                                                       02860000
   LOGICAL OLDPARM;    <<TRUE => JIN; FALSE => JLIST>>                  02865000
<< ALLOCATES JLIST OR JIN; SETTING <DEV>. >>                            02870000
BEGIN                                                                   02875000
   OLD := OLDPARM;    <<WON'T BE ABLE TO ACCESS S-REL.>>                02880000
<<  Push the USER, ACCT, and JOB names onto the stack >>       <<06578>>02885000
I := JMATUSERNAMEOFF;                                          <<06578>>02890000
DO BEGIN                                                       <<06578>>02895000
  TOS := JMATARR(JMATINX+I);                                   <<06578>>02900000
  I := I + 1;                                                  <<06578>>02905000
END                                                            <<06578>>02910000
UNTIL I >= JMATGRPLOGONOFF;                                    <<06578>>02915000
                                                               <<06578>>02920000
                                                               <<06578>>02925000
   TOS := "$STD";                                                       02930000
   TOS := IF OLD THEN "IN  " ELSE "LIST";                               02935000
<< STACK JMAT ENTRY PARMS FOR ALLOCATE (1ST 8) >>                       02940000
   TOS := 0;    <<RETURN PARM>>                                         02945000
   << STACK DEV & OLD/NEW FLAG; SET ACCESS >>                           02950000
   IF OLD THEN                                                          02955000
      BEGIN                                                             02960000
      TOS := JMATJINDEV;                                       <<06578>>02965000
      TOS := TRUE;                                                      02970000
      ACCESS := 0;                                                      02975000
      END                                                               02980000
   ELSE                                                                 02985000
      BEGIN                                                             02990000
      TOS := JMATJLISTDEV;                                     <<06578>>02995000
      IF LOGICAL(JMATCBIT) THEN TOS := -TOS;                   <<06578>>03000000
      TOS := FALSE;                                                     03005000
      ACCESS := 1;                                                      03010000
      END;                                                              03015000
   TOS := JMATOUTPRI;                                          <<06578>>03020000
   TOS := 0;    <<FOR @NAMES (STACK) >>                                 03025000
   TOS := MAINPIN;   <<OWNER PIN>>                                      03030000
   TOS := 0;    <<FOR @NULLFORMS>>                                      03035000
   TOS := JMATARR(JMATINX+JMATJSNOOFF);  << Number and type >> <<06578>>03040000
   TOS := JMATNUMCOPIES;                                       <<06578>>03045000
<< COMPLETE ALLOCATE SETUP FROM STACK >>                                03050000
   EXCHANGEDB (0);                                                      03055000
   @PS4 := @ARRS24;                                                     03060000
   @PS2 := @NULLFORMS;                                                  03065000
   TOS := ALLOCATE (*, *, *, *, *, *, *, *,                             03070000
         DEVINFO, XDDSUBP, ACCESS);                                     03075000
   ASSEMBLE (STAX, SUBS 16);                                            03080000
   IF XREG = SPOOLEDCLASS THEN XREG := 0;                      <<00640>>03085000
   IF XREG <= 0 THEN                                                    03090000
      BEGIN    <<SUCCESSFUL ALLOC>>                                     03095000
          << Note: DEVINFO is returned by the call to >>       <<06572>>03100000
          <<       ALLOCATE.  It returns the following>>       <<06572>>03105000
          <<       MPE V format:                      >>       <<06572>>03110000
          << DEVINFO (0)   - LDEV or VDEV ALLOCATED   >>       <<06572>>03115000
          <<         (1)-(4) LPTD entry               >>       <<06572>>03120000
          <<         (5)-(11) LDT entry               >>       <<06572>>03125000
          <<                                          >>       <<06572>>03130000
          << ************ C A U T I O N ************* >>       <<06572>>03135000
          << This is the change for   MPE V !!!!!!!   >>       <<06572>>03140000
          <<                                          >>       <<06572>>03145000
          <<******************************************>>       <<06572>>03150000
      IF OLD THEN                                                       03155000
         BEGIN    << SET JIN AND CI PARMS >>                            03160000
         JIN := DEVINFO;                                                03165000
         @JINXDDEP := @XDDSUBP;                                         03170000
         JINDEVTYPE := DEVINFO (5 +LD'DEVTYPE);                <<06572>>03175000
         END                                                            03180000
      ELSE                                                              03185000
         BEGIN    << SET JLIST & CI PARMS >>                            03190000
         JLISTALLOC := XREG;                                            03195000
         JLIST := DEVINFO;                                              03200000
         @JLISTXDDEP := @XDDSUBP;                                       03205000
         END;                                                           03210000
      ALLOC := TRUE;                                                    03215000
      END                                                               03220000
   ELSE                                                                 03225000
      ALLOC := FALSE;                                                   03230000
   EXCHANGEDB (JMATDST);                                                03235000
   END;    << ALLOC >>                                                  03240000
   << >>                                                                03245000
SUBROUTINE DEALLOC (DEV);                                               03250000
   VALUE DEV;                                                           03255000
   INTEGER DEV;                                                         03260000
<< DEALLOCATE DEV >>                                                    03265000
BEGIN                                                                   03270000
   EXCHANGEDB (0);                                                      03275000
   DFLAG:=%1400;  << High order word of DFLAGDEV >>            <<06577>>03280000
   DDEV:=DEV;     << Low order word of DFLAGDEV >>             <<06577>>03285000
   DEALLOCATE(DFLAGDEV);                                       <<06577>>03290000
   EXCHANGEDB (JMATDST);                                                03295000
   END;    << DEALLOC >>                                                03300000
   << >>                                                                03305000
LOGICAL SUBROUTINE GETFILEDST;                                          03310000
<< ALLOCATES FILE NOBUF DST; SETS FILEDST >>                            03315000
BEGIN                                                                   03320000
   GETFILEDST := TRUE;                                                  03325000
   FILEDST := 0;                                                        03330000
   IF JMATJSTYPE <> SESSTYPE THEN                              <<06578>>03335000
      BEGIN                                                             03340000
      EXCHANGEDB(0);                                                    03345000
      FCREATECB(DUM,0D,-69,0,0);                               <<07270>>03350000
      DDEL;DEL;                                                <<07270>>03355000
      IF < THEN GETFILEDST := FALSE;                                    03360000
      FILEDST := EXCHANGEDB(JMATDST);                                   03365000
      END;                                                              03370000
   END;                                                                 03375000
   << >>                                                                03380000
SUBROUTINE RELJPCNT;                                                    03385000
<< RELEASE JPCNT ENTRY <JPCNTP>. >>                                     03390000
<< Reset bit to 0 showing unused entry                      >> <<06534>>03395000
<< Called when other system resourses couldn't be allocated >> <<06534>>03400000
<< and the JPCNT entry must be released.  JPCNTINDEX is     >> <<06534>>03405000
<< gotten form WORDSET.(5:7) and the entry to be free is BIT>> <<06534>>03410000
BEGIN                                                                   03415000
   EXCHANGEDB (JPCNTDST);                                               03420000
   SAVESIR := GETSIR (JPCNTSIR);                                        03425000
   JPCNTINDEX:=WORDSET.(5:7);<< Remember? Got it in GETJPCNT >><<06534>>03430000
   TOS:=JPCNTBITMAP;                                           <<06534>>03435000
   XREG:=BIT;                                                  <<06534>>03440000
   ASSEMBLE(TSBC 0,X);             << Set entry to 1 as free >><<06534>>03445000
   JPCNTBITMAP:=TOS;               << Update the table >>      <<06534>>03450000
   JPCNTFREENTRIES:=JPCNTFREENTRIES+1;<< Up # free entries >>  <<06534>>03455000
   RELSIR (JPCNTSIR, SAVESIR);                                          03460000
   EXCHANGEDB (JMATDST);                                                03465000
   END;    << RELJPCNT >>                                               03470000
                                                                        03475000
                                                                        03480000
   << >>                                                                03485000
LOGICAL SUBROUTINE GETJPCNT;                                   <<06534>>03490000
<< Written for MPEV.  Uses a simular algorithm that the >>     <<06534>>03495000
<< directory uses for its bit map.  The search for a    >>     <<06534>>03500000
<< bit will use a JPCNTNEXTAVAIL word from the dst to start  >><<06534>>03505000
<< Allocates the JPCNT entry for the Session/Job.  The       >><<06534>>03510000
<< variables WORDSET and BIT, after getting a value here,    >><<06534>>03515000
<< will be used in this Logical Procedure and in the         >><<06534>>03520000
<< Subroutine RELJPCNT.                                      >><<06534>>03525000
<< The first entry allocated is zero (0).  WORDSET is the    >><<06534>>03530000
<< calculated JPCNT entry; and if all of the other resourses >><<06534>>03535000
<< that are needed for a successful launch are allocated,    >><<06534>>03540000
<< then WORDSET is stored in PXG'JPCNTINX (8th word of user  >><<06534>>03545000
<< stack) in the LAUNCHJOB main body below.                  >><<06534>>03550000
BEGIN                                                          <<06534>>03555000
  GETJPCNT := FALSE;                                           <<07269>>03560000
  EXCHANGEDB(JPCNTDST);                                        <<06534>>03565000
  SAVESIR:=GETSIR(JPCNTSIR);                                   <<06534>>03570000
  IF JPCNTFREENTRIES = 0                                       <<06534>>03575000
     THEN GETJPCNT:=FALSE                                      <<06534>>03580000
     ELSE                                                      <<06534>>03585000
     BEGIN                                                     <<06534>>03590000
     SHIFT:=TRUE;                                              <<06534>>03595000
     WORDSET:=0;                                               <<06534>>03600000
     BIT:=0;                                                   <<06534>>03605000
     BITCOUNT := 0;                                            <<07269>>03610000
     WHILE (SHIFT) AND (BITCOUNT < JPCNTMAXENTRIES)  DO        <<07269>>03615000
       BEGIN                                                   <<06534>>03620000
       JPCNTINDEX:=JPCNTNEXTAVAIL;                             <<06534>>03625000
       IF ((JPCNTBITMAP&LSL(BIT)) < 0)                         <<06534>>03630000
          THEN BEGIN                                           <<06534>>03635000
               TOS:=JPCNTBITMAP;                               <<06534>>03640000
               << Set the bit to 0 showing used entry >>       <<06534>>03645000
               XREG:=BIT;                                      <<06534>>03650000
               ASSEMBLE(TRBC 0,X);                             <<06534>>03655000
               JPCNTBITMAP:=TOS;                               <<06534>>03660000
               JPCNTFREENTRIES:=JPCNTFREENTRIES-1;             <<06534>>03665000
               WORDSET.(5:7):=JPCNTNEXTAVAIL;                  <<06534>>03670000
               WORDSET.(12:4):=BIT;                            <<06534>>03675000
               SHIFT:=FALSE;                                   <<06534>>03680000
               GETJPCNT:=TRUE;                                 <<06534>>03685000
               END                                             <<07269>>03690000
          ELSE                                                 <<07269>>03695000
               IF BIT=15  OR  (JPCNTNEXTAVAIL*BITSPERWORD+BIT+1<<07269>>03700000
                              =JPCNTMAXENTRIES)                <<07269>>03705000
               THEN BEGIN                                      <<07269>>03710000
                  IF JPCNTNEXTAVAIL =(NWDSBITMAP -1)           <<07269>>03715000
                        THEN JPCNTNEXTAVAIL:=0                 <<07269>>03720000
                        ELSE JPCNTNEXTAVAIL:=JPCNTNEXTAVAIL+1; <<07269>>03725000
                  BIT := 0;                                    <<07269>>03730000
               END                                             <<07269>>03735000
               ELSE BIT := BIT + 1;                            <<07269>>03740000
               BITCOUNT := BITCOUNT + 1;                       <<07269>>03745000
       END; << WHILE >>                                        <<06534>>03750000
    END; << ELSE BEGIN >>                                      <<06534>>03755000
  RELSIR(JPCNTSIR,SAVESIR);                                    <<06534>>03760000
  EXCHANGEDB(JMATDST);                                         <<06534>>03765000
END; << PROCEDURE GETJPCNT >>                                  <<06534>>03770000
                                                                        03775000
                                                                        03780000
<< ....................................................... >>  <<06578>>03785000
<<                                                         >>  <<06578>>03790000
<<    ************ Main Body of LAUNCHJOB **************   >>  <<06578>>03795000
<<                                                         >>  <<06578>>03800000
<< ....................................................... >>  <<06578>>03805000
                                                               <<06577>>03810000
<< DEBUG; >>                                                   <<06577>>03815000
                                                               <<06577>>03820000
I := -1;                                                       <<06573>>03825000
WHILE (I := I + 1) <= PXG'SIZE-1                               <<06573>>03830000
  DO QARRAY(I) := 0;                                           <<06573>>03835000
                                                               <<06578>>03840000
<< JMATINX  is the JMAT entry index of the job to be launched>><<06578>>03845000
JMATINX := @JMATP;                                             <<06578>>03850000
   FAILNUM := LIMITFAIL;                                                03855000
   IF (JMATINPRI = JOBHIPRI  LAND  NOT(LOGICAL(JMATLGBITS)))   <<06578>>03860000
   OR (JMATJSTYPE = JOBTYPE  LAND JMATJNUM < JMATJLIMIT)       <<06578>>03865000
   OR (JMATJSTYPE = SESSTYPE LAND JMATSNUM < JMATSLIMIT)       <<06578>>03870000
   THEN                                                        <<06578>>03875000
      BEGIN    << We are under limits >>                       <<06578>>03880000
      IF JMATJSTYPE = JOBTYPE                                  <<06578>>03885000
      THEN JMATJNUM := JMATJNUM + 1 << Increment job count >>  <<06578>>03890000
      ELSE JMATSNUM := JMATSNUM + 1;<< Increment sess count >> <<06578>>03895000
      FAILNUM := DEFERREDFAIL;                                          03900000
      IF JMATINPRI > JMATJOBFENCE THEN                         <<06578>>03905000
         BEGIN    <<SATISFIED FENCE>>                                   03910000
         FAILNUM := PCBFAIL;                                            03915000
         IF ( MAINPIN := GETENTRY (PCBCODE) ) <> 0 THEN                 03920000
            BEGIN    <<GOT PCB>>                                        03925000
            FAILNUM := STACKFAIL;                                       03930000
            IF (STACKDST := GETSTACK(INITSTACKSIZE,MAXSTACKSIZE))       03935000
                  <> 0 THEN                                             03940000
               BEGIN    <<GOT STACK>>                                   03945000
               FAILNUM := JITFAIL;                                      03950000
               IF (JIT'DST:=GETDATASEG(JIT'ENTRY'SIZE,         <<06818>>03955000
                           MAXJITSIZE)) <> 0 THEN              <<06818>>03960000
                  BEGIN    <<GOT JIT>>                                  03965000
                  FAILNUM := JDTFAIL;                                   03970000
                  IF (JDTDST := GETDATASEG (INITJDTSIZE, MAXJDTSIZE))   03975000
                        <> 0 THEN                                       03980000
                     BEGIN    <<GOT JDT>>                               03985000
                     FAILNUM := FILEFAIL;                               03990000
                     IF GETFILEDST THEN                                 03995000
                      BEGIN  <<GOT FILE NOBUF DST>>                     04000000
                      FAILNUM := JPCNTFAIL;                             04005000
                      IF GETJPCNT THEN                                  04010000
                        BEGIN    <<GOT JPCNT ENTRY>>                    04015000
                        IF LOGICAL(JMATCBIT)                   <<06578>>04020000
                         OR JMATJINDEV <> JMATJLISTDEV THEN    <<06578>>04025000
                           BEGIN   <<IN <> LIST: ALLOC LIST, THEN IN>>  04030000
                           ALLOCORDER := 2;  <<LIST THEN IN SIGNAL>>    04035000
                           FAILNUM := JLISTFAIL;  <<IN CASE FAILS>>     04040000
                           END                                          04045000
                     << ELSE                                            04050000
                           JIN= JLIST: ALLOC IN, THEN LIST.             04055000
                           ALLOCORDER := 1; BY INITIALIZATION;          04060000
                           FAILNUM NOT SET,                             04065000
                              'CAUSE ALLOC (JIN) WON'T FAIL. >>;        04070000
                        IF ALLOC (ALLOCORDER) THEN                      04075000
                           BEGIN    <<GOT JOB LIST, OR IN  DEV>>        04080000
                           FAILNUM:=(IF ALLOCORDER THEN        <<SB.00>>04085000
                                     JLISTFAIL ELSE JINFAIL);  <<SB.00>>04090000
                           IF ALLOC (ALLOCORDER &LSR(1)) THEN           04095000
                           BEGIN                               <<06578>>04100000
                                                               <<06578>>04105000
<< ........................................................ >> <<06578>>04110000
<<    We are here if we got everything we needed. Now we    >> <<06578>>04115000
<<    set up and launch the job.                            >> <<06578>>04120000
<< ........................................................ >> <<06578>>04125000
                                                               <<06578>>04130000
                              << SETUP FOR JOB LAUNCH >>                04135000
                              FAILNUM := NOFAIL;                        04140000
                              DELINK'JMAT (@JMATP);            <<06578>>04145000
                              << UPDATE JMAT >>                         04150000
                              JMATJOBSTATE := JOBINIT;         <<06578>>04155000
                              JMATORIGJIN := JMATJINDEV;       <<06578>>04160000
                              JMATJINDEV := JIN;               <<06578>>04165000
                              JMATORIGJLIST := JMATJLISTDEV;   <<06578>>04170000
                              JMATJLISTDEV := JLIST;           <<06578>>04175000
                              JMATMAINPIN := MAINPIN;          <<06578>>04180000
                              << PROCREATE C.I. >>                      04185000
                              PRI := JMATXPRI;                 <<06578>>04190000
                              <<SETUP CI PXGLOB (3:6)>>                 04195000
                              PUT'JOBNUM'IN'PXFIXED(           <<06573>>04200000
                           JMATJSNO, JMATJSTYPE);              <<06578>>04205000
                              PXG'INPUTLDEV := JIN;            <<06573>>04210000
                              PXG'JMATINX := JMATINX/          <<06578>>04215000
                                    JMATENTRYSIZE;             <<06578>>04220000
                              PXG'OUTPUTLDEV := JLIST;         <<06573>>04225000
                              << WORDSET set in GETJPCNT >>    <<06534>>04230000
                              PXG'JPCNTINX := WORDSET;         <<06534>>04235000
                              PXG'JDTDST := JDTDST;            <<06573>>04240000
                              PXG'JITDST:=JIT'DST;             <<06818>>04245000
                              PXG'RESTART := JMATRESTART;      <<06578>>04250000
                              PXG'JOBTYPE := JMATJSTYPE;       <<06578>>04255000
                           PXG'DUPLICATIVE := JMATDUPLICATIVE; <<06578>>04260000
                           PXG'INTERACTIVE := JMATINTERACTIVE; <<06578>>04265000
                              EXCHANGEDB (0);                           04270000
                              IF PXG'INTERACTIVE = 1           <<06573>>04275000
                                 THEN INTERACTIVE := TRUE      <<06573>>04280000
                                 ELSE INTERACTIVE := FALSE;    <<06573>>04285000
                              PROCREATE (                               04290000
                                  MAINPIN, COMINTLB, COMINTDP,          04295000
                                  STACKDST,                    <<04600>>04300000
                                  CIS'GLOBSTKSIZE, DLSIZE,     <<04600>>04305000
                                  LOCSIZE-128, PRI, NOSTRING,  <<01200>>04310000
                                  NOSTLEN, EXPCODE, 0,         <<04556>>04315000
                                  MAXSIZE, NOSTDIN, NOSTDLIST);<<01200>>04320000
                              << INITIALIZE PCBX >>                     04325000
                              << MOVE PXGLOB (3:6) IN >>                04330000
                              TOS := STACKDST;  <<SETUP MOVE>>          04335000
                              TOS := PXG'JOBINFO'OFFSET;       <<06573>>04340000
                              TOS :=@QARRAY+PXG'JOBINFO'OFFSET;<<06573>>04345000
                              TOS := PXG'JOBINFO'LEN;          <<06573>>04350000
                              ASSEMBLE (MTDS 4);                        04355000
                              << PUT COMM. INFO INTO JIT >>    <<02.EB>>04360000
                              TOS:=JIT'DST;                    <<06818>>04365000
                              TOS := 0; << OFFSET IN JIT>>     <<02.EB>>04370000
                              TOS := @CIPARMS;<<SOURCE>>       <<02.EB>>04375000
                              TOS := CINUMPARMS;<<COUNT>>      <<02.EB>>04380000
                              ASSEMBLE(MTDS 4);                <<02.EB>>04385000
                              << FIND PXFILE >>                         04390000
                              << MOVE FILE NOBUF DST >>                 04395000
                              TOS := STACKDST;                          04400000
                              TOS := 0;                                 04405000
                              TOS := @S0;                               04410000
                              TOS := STACKDST;                          04415000
                              TOS := PXG'SIZE;                 <<06573>>04420000
                              TOS := 1;                                 04425000
                              ASSEMBLE(MFDS 4);                         04430000
                              TOS := TOS+PXG'SIZE+10;          <<07270>>04435000
                              TOS := @FILEDST;                          04440000
                              TOS := 1;                                 04445000
                              ASSEMBLE(MTDS 4);                         04450000
                              EXCHANGEDB (JMATDST);                     04455000
                              << AWAKE C.I. >>                          04460000
                              PCBPT := MAINPIN * PCBSIZE;      <<06574>>04465000
                              SPCBCRIT := 1;                   <<06574>>04470000
IF INTERACTIVE THEN                                            <<01549>>04475000
                              QUEUEINGINFO.INTERACTIVEFLAG :=1;<<06574>>04480000
                              AWAKE(PCBPT,1,0);                <<06574>>04485000
                              RETURN;    <<TO UCOP LOOP>>               04490000
                              END;    <<SUCCESSFUL LAUNCH>>             04495000
      << UNWIND ACQUISITIONS BY "UNNESTING" >>                          04500000
                           <<EITHER JIN OR JLIST FAILED>>      <<SB.00>>04505000
                           IF FAILNUM=JINFAIL THEN             <<SB.00>>04510000
                                DEALLOC(JLIST)                 <<SB.00>>04515000
                           ELSE                                <<SB.00>>04520000
                                DEALLOC(JIN);                  <<SB.00>>04525000
                           END;                                <<SB.00>>04530000
                         RELJPCNT;                                      04535000
                         END;                                           04540000
                        IF FILEDST <> 0 THEN                            04545000
                           RELDATASEG(FILEDST);                         04550000
                        END;                                            04555000
                     RELDATASEG (JDTDST);                               04560000
                     END;                                               04565000
                  RELDATASEG(JIT'DST);                         <<06818>>04570000
                  END;                                                  04575000
               RELDATASEG (STACKDST);                                   04580000
               END;                                                     04585000
            RETURNENTRY (PCBCODE, MAINPIN);                             04590000
            END;                                                        04595000
         END;                                                           04600000
      IF JMATJSTYPE = JOBTYPE                                  <<06578>>04605000
      THEN JMATJNUM := JMATJNUM - 1 << Decrement job count >>  <<06578>>04610000
      ELSE JMATSNUM := JMATSNUM - 1;<< Decrement sess count >> <<06578>>04615000
      END;                                                              04620000
   WRITEDSEG(JMATDST);                                                  04625000
   << FAILNUM (TYPE RETURN) CONTAINS THE FAILURE REASON >>              04630000
   << INFORM OPERATOR, IF SYSTEM RESOURCE FAILURE >>                    04635000
   JIN := JMATJINDEV;                                          <<06578>>04640000
  JTYPE := JMATJSTYPE;                                         << 8998>>04645000
  JNUM  := JMATJSNO;                                           << 8998>>04650000
   IF FAILNUM.(10:3) = SYSFAILGROUP THEN                                04655000
      BEGIN    <<TELL OP OF JOB RESOURCE DEPLETION>>                    04660000
      EXCHANGEDB (0);                                                   04665000
      IF JTYPE = SESSTYPE THEN                                 << 8998>>04670000
       CASE FAILNUM.(13:3) OF                                  << 8998>>04675000
         BEGIN                                                 << 8998>>04680000
         GENMSG(1,CANTGETSTACK,%10000,JIN,,,,,0);              << 8998>>04685000
         GENMSG(1,CANTGETJIT,%10000,JIN,,,,,0);                << 8998>>04690000
         GENMSG(1,CANTGETJDT,%10000,JIN,,,,,0);                << 8998>>04695000
         GENMSG(1,CANTGETPCB,%10000,JIN,,,,,0);                << 8998>>04700000
         GENMSG(1,CANTGETJPCNT,%10000,JIN,,,,,0);              << 8998>>04705000
         GENMSG(1,CANTGETFILEDST,%10000,JIN,,,,,0)             << 8998>>04710000
         END                                                   << 8998>>04715000
      ELSE                                                     << 8998>>04720000
       CASE FAILNUM.(13:3) OF                                  << 8998>>04725000
         BEGIN                                                 << 8998>>04730000
         GENMSG(1,JCANTGETSTACK,%10000,JNUM,,,,,0);            << 8998>>04735000
         GENMSG(1,JCANTGETJIT,%10000,JNUM,,,,,0);              << 8998>>04740000
         GENMSG(1,JCANTGETJDT,%10000,JNUM,,,,,0);              << 8998>>04745000
         GENMSG(1,JCANTGETPCB,%10000,JNUM,,,,,0);              << 8998>>04750000
         GENMSG(1,JCANTGETJPCNT,%10000,JNUM,,,,,0);            << 8998>>04755000
         GENMSG(1,JCANTGETFILEDST,%10000,JNUM,,,,,0)           << 8998>>04760000
         END;                                                  << 8998>>04765000
      EXCHANGEDB (JMATDST);                                             04770000
      END                                                      <<LJC>>  04775000
      ELSE IF FAILNUM.(10:3) = SYS2FAILGROUP                   <<LJC>>  04780000
               << POSSIBLE ALLOCATION PROBLEMS >>              <<LJC>>  04785000
              THEN BEGIN                                       <<LJC>>  04790000
                   NOMESS:=FALSE;                              <<LJC>>  04795000
                   EXCHANGEDB(0);                              <<LJC>>  04800000
                   CASE FAILNUM.(13:3) OF                      <<LJC>>  04805000
                      BEGIN                                    <<LJC>>  04810000
                      NOMESS:=TRUE; << DEFERRED FAIL NOMSG >>  <<LJC>>  04815000
         <<1>> IF JTYPE = SESSTYPE THEN                        << 8998>>04820000
                GENMSG(1,CANTGETJLIST,%10000,JIN,,,,,0)        << 8998>>04825000
               ELSE                                            << 8998>>04830000
                GENMSG(1,JCANTGETJLIST,%10000,JNUM,,,,,0);     << 8998>>04835000
         <<2>> IF JTYPE = SESSTYPE THEN                        << 8998>>04840000
                GENMSG(1,CANTGETJIN,%10000,JIN,,,,,0)          << 8998>>04845000
               ELSE                                            << 8998>>04850000
                GENMSG(1,JCANTGETJIN,%10000,JNUM,,,,,0);       << 8998>>04855000
           END;   <<CASE FAILNUM >>                            << 8998>>04860000
                   EXCHANGEDB(JMATDST);                        <<LJC>>  04865000
                   END;                                        <<LJC>>  04870000
   END;    <<LAUNCHJOB>>                                                04875000
$PAGE "CHECKSCHED:  Handles the Scheduled Jobs Queue."         << 8198>>04880000
PROCEDURE CHECKSCHED;                                          << 8198>>04885000
BEGIN                                                          << 8198>>04890000
                                                               << 8198>>04895000
<<*********************************************************>>  << 8198>>04900000
<<                                                         >>  << 8198>>04905000
<< This procedure manages the Scheduled Jobs queue.  It    >>  << 8198>>04910000
<< has several responsibilities:                           >>  << 8198>>04915000
<<                                                         >>  << 8198>>04920000
<<    o It checks the scheduled jobs scheduled             >>  << 8198>>04925000
<<      times against the current time and places          >>  << 8198>>04930000
<<      appropriate jobs into the WAIT queue.              >>  << 8198>>04935000
<<                                                         >>  << 8198>>04940000
<<    o It handles the Timer Request List request          >>  << 8198>>04945000
<<      that is set for the next job's scheduled           >>  << 8198>>04950000
<<      start time or 24 days, whichever comes             >>  << 8198>>04955000
<<      first.  Note that there is no TRL entry            >>  << 8198>>04960000
<<      if the Scheduled Jobs queue is empty.              >>  << 8198>>04965000
<<      Also note that 24 days is the maximum number       >>  << 8198>>04970000
<<      of days expressable in milliseconds stored         >>  << 8198>>04975000
<<      in a double word integer.                          >>  << 8198>>04980000
<<                                                         >>  << 8198>>04985000
<<    o It handles the case that a newly introduced        >>  << 8198>>04990000
<<      Scheduled Job is scheduled earlier than the        >>  << 8198>>04995000
<<      job associated with the current TRL entry.         >>  << 8198>>05000000
<<                                                         >>  << 8198>>05005000
<< The Timer Request List must be handled carefully.  UCOP >>  << 8198>>05010000
<< will get a TRL entry for the first job in the Scheduled >>  << 8198>>05015000
<< jobs queue only.  Since each entry in the TRL must be   >>  << 8198>>05020000
<< aborted explicitly, this procedure will abort the       >>  << 8198>>05025000
<< current TRL entry (if present) when it is entered and   >>  << 8198>>05030000
<< will create a TRL entry for the first job in the        >>  << 8198>>05035000
<< Scheduled Jobs queue before completion.  Note that the  >>  << 8198>>05040000
<< deletion of the current TRL entry is always safe:  it   >>  << 8198>>05045000
<< is either popped, or it is associated with a job that   >>  << 8198>>05050000
<< may not yet need to be placed in the WAIT queue.        >>  << 8198>>05055000
<<                                                         >>  << 8198>>05060000
<< It should be noted that UCOP will WAIT on events other  >>  << 8198>>05065000
<< than a TIMER wait.  It is not possible to determine     >>  << 8198>>05070000
<< which event awakened a process once it is awake.  Thus, >>  << 8198>>05075000
<< this procedure is called at the beginning of GETJOB     >>  << 8198>>05080000
<< which is part of the UCOP loop that launches jobs.      >>  << 8198>>05085000
<<                                                         >>  << 8198>>05090000
<< This procedure assumes that the JMAT SIR is being held  >>  << 8198>>05095000
<< by the caller and that DB is still pointing at UCOP's   >>  << 8198>>05100000
<< stack.  Holding the JMAT SIR will prevent any other     >>  << 8198>>05105000
<< process from trying to INTROduce a job while we are     >>  << 8198>>05110000
<< playing with the various job queues.                    >>  << 8198>>05115000
<<                                                         >>  << 8198>>05120000
<< Note that this procedure uses MOVEFROMDSEG to access    >>  << 8198>>05125000
<< the JMAT.  COMPTIME cannot be called in split stack     >>  << 8198>>05130000
<< mode.  Further, some of the variables used by this      >>  << 8198>>05135000
<< procedure (notably the TRL variables) are global to     >>  << 8198>>05140000
<< UCOP's outer block and are thus DB-relative--these      >>  << 8198>>05145000
<< variables cannot, therefore, be referenced in split     >>  << 8198>>05150000
<< stack mode.                                             >>  << 8198>>05155000
<<                                                         >>  << 8198>>05160000
<<*********************************************************>>  << 8198>>05165000
                                                               << 8198>>05170000
                                                               << 8198>>05175000
<< The following declarations are used for comparing the   >>  << 8198>>05180000
<< Scheduled Jobs' times against the current time.         >>  << 8198>>05185000
   INTEGER ARRAY                                               << 8198>>05190000
      NOWTIME(0:2),        << Holds current time.          >>  << 8198>>05195000
      TIME(0:2);           << Holds target's time.         >>  << 8198>>05200000
                                                               << 8198>>05205000
   LOGICAL                                                     << 8198>>05210000
      NOWCAL;              << Year and day specifications. >>  << 8198>>05215000
                                                               << 8198>>05220000
   DOUBLE                                                      << 8198>>05225000
      TEMP'D,                 << Temporary storage.        >>  << 8198>>05230000
      TRLDELAY,               << TRL request time units.   >>  << 8198>>05235000
      NOWCLOCK;               << Time specifications.      >>  << 8198>>05240000
                                                               << 8198>>05245000
   INTEGER                                                     << 8198>>05250000
      TRL'JMATINX'L,          << Local TRL variables used  >>  << 8198>>05255000
      TRL'JSNO'L,             << for split stack scan.     >>  << 8198>>05260000
      TEMP'0  = TEMP'D,       << Temporary storage.        >>  << 8198>>05265000
      TEMP'1  = TEMP'D+1;                                      << 8198>>05270000
                                                               << 8198>>05275000
   INTRINSIC                                                   << 8198>>05280000
      CALENDAR, CLOCK;                                         << 8198>>05285000
                                                               << 8198>>05290000
   DEFINE                                                      << 8198>>05295000
      DAYS'24 = 2073600000D#;   << TRL units in 24 days.   >>  << 8198>>05300000
                                                               << 8198>>05305000
                                                               << 8198>>05310000
<< The following declarations are used in comparing two    >>  << 8198>>05315000
<< times (in internal JMAT format).                        >>  << 8198>>05320000
   INTEGER                                                     << 8198>>05325000
      COMPERROR := 0,  << Holds the error value returned   >>  << 8198>>05330000
                       << by COMPTIME.                     >>  << 8198>>05335000
      COMPRETURN;      << Return value from COMPTIME.      >>  << 8198>>05340000
                                                               << 8198>>05345000
   EQUATE              << Possible COMPRETURN values.      >>  << 8198>>05350000
      LESSTHAN     = -1,                                       << 8198>>05355000
      EQUALS       = 0,                                        << 8198>>05360000
      GREATERTHAN  = 1,                                        << 8198>>05365000
      VERY'GREAT   = 2,                                        << 8198>>05370000
      ERRINCOMP    = 10;                                       << 8198>>05375000
                                                               << 8198>>05380000
   LOGICAL                                                     << 8198>>05385000
      NOTDONE,               << Looping Flag.              >>  << 8198>>05390000
      ERRFLAG    := FALSE;   << Flags COMPTIME error.      >>  << 8198>>05395000
                                                               << 8198>>05400000
   DOUBLE                                                      << 8198>>05405000
      DIFF;                  << Holds TRL time unit delay. >>  << 8198>>05410000
                                                               << 8198>>05415000
                                                               << 8198>>05420000
<< The following DEFINE is used to handle the occurrence   >>  << 8198>>05425000
<< of an error detected by COMPTIME.                       >>  << 8198>>05430000
   DEFINE                                                      << 8198>>05435000
      PRINTCOMPERROR                                           << 8198>>05440000
         =  BEGIN                                              << 8198>>05445000
               GENMSG( SYSSET, SCHEDCOMPERR,                   << 8198>>05450000
                       %11000, COMPERROR, JMATJSNO,,,, 0 );    << 8198>>05455000
               ERRFLAG := FALSE;                               << 8198>>05460000
               COMPERROR := 0;                                 << 8198>>05465000
            END  #;                                            << 8198>>05470000
                                                               << 8198>>05475000
<< The following definitions are used for the referencing  >>  << 8198>>05480000
<< of the JMAT.                                            >>  << 8198>>05485000
   INTEGER ARRAY    JMATARR(0:JMATENTRYSIZE-1);                << 8198>>05490000
   INTEGER          JMATINX := 0, << References JMATARR.   >>  << 8198>>05495000
                    CURRINX,      << Current Entry's JMAT  >>  << 8198>>05500000
                                  << index.                >>  << 8198>>05505000
                    LINK;         << Local Scheduling link.>>  << 8198>>05510000
   INTEGER POINTER  JMATP;                                     << 8198>>05515000
   EQUATE           JOBCHAINEND  = 0;                          << 8198>>05520000
                                                               << 8198>>05525000
$PAGE                                                          << 8198>>05530000
<< MOVEFROMDSEG:  Standard MFDS subroutine.                >>  << 8198>>05535000
   SUBROUTINE MOVEFROMDSEG( TARGET, DSTN, OFFSET, COUNT );     << 8198>>05540000
      VALUE   TARGET, DSTN, OFFSET, COUNT;                     << 8198>>05545000
      LOGICAL TARGET, DSTN, OFFSET, COUNT;                     << 8198>>05550000
   BEGIN                                                       << 8198>>05555000
                                                               << 8198>>05560000
      X := TOS;         << Save subroutine return address. >>  << 8198>>05565000
      ASSEMBLE( MFDS 0 );                                      << 8198>>05570000
      TOS := X;         << Restore return address.         >>  << 8198>>05575000
                                                               << 8198>>05580000
   END;                                                        << 8198>>05585000
                                                               << 8198>>05590000
                                                               << 8198>>05595000
<< MOVETODSEG:  Standard MTDS subroutine.                  >>  << 8198>>05600000
   SUBROUTINE MOVETODSEG( DSTN, OFFSET, SOURCE, COUNT );       << 8198>>05605000
      VALUE   DSTN, OFFSET, SOURCE, COUNT;                     << 8198>>05610000
      LOGICAL DSTN, OFFSET, SOURCE, COUNT;                     << 8198>>05615000
   BEGIN                                                       << 8198>>05620000
                                                               << 8198>>05625000
      X := TOS;         << Save subroutine return address. >>  << 8198>>05630000
      ASSEMBLE( MTDS 0 );                                      << 8198>>05635000
      TOS := X;         << Restore return address.         >>  << 8198>>05640000
                                                               << 8198>>05645000
   END;                                                        << 8198>>05650000
                                                               << 8198>>05655000
                                                               << 8198>>05660000
<< CANGO:  examines the current JMAT entry to determine if >>  << 8198>>05665000
<< it is time for it to be placed into the WAIT state.     >>  << 8198>>05670000
   LOGICAL SUBROUTINE CANGO;                                   << 8198>>05675000
   BEGIN                                                       << 8198>>05680000
                                                               << 8198>>05685000
   << This subroutine examines the current JMAT entry in   >>  << 8198>>05690000
   << the JMATARR array to determine if it is time for the >>  << 8198>>05695000
   << associated job to be placed into the WAIT state.     >>  << 8198>>05700000
                                                               << 8198>>05705000
      TIME(0) := JMATCALENDAR;                                 << 8198>>05710000
      MOVE TIME(1) := JMATTIME, (2);                           << 8198>>05715000
      COMPRETURN := COMPTIME( TIME, NOWTIME , , COMPERROR );   << 8198>>05720000
      IF COMPRETURN = ERRINCOMP THEN                           << 8198>>05725000
      BEGIN                                                    << 8198>>05730000
         ERRFLAG := TRUE;                                      << 8198>>05735000
         CANGO := FALSE;                                       << 8198>>05740000
         RETURN;                                               << 8198>>05745000
      END;                                                     << 8198>>05750000
      IF COMPRETURN = LESSTHAN  OR  COMPRETURN = EQUALS        << 8198>>05755000
         THEN CANGO := TRUE                                    << 8198>>05760000
         ELSE CANGO := FALSE;                                  << 8198>>05765000
                                                               << 8198>>05770000
      RETURN;                                                  << 8198>>05775000
                                                               << 8198>>05780000
   END;                                                        << 8198>>05785000
$PAGE                                                          << 8198>>05790000
<< Start of Main Code for CHECKSCHED.                      >>  << 8198>>05795000
                                                               << 8198>>05800000
<< First, initialize the values for the current time.      >>  << 8198>>05805000
   NOWCAL   := CALENDAR;                                       << 8198>>05810000
   TEMP'D   := CLOCK;                                          << 8198>>05815000
   NOWTIME    := NOWCAL;                                       << 8198>>05820000
   NOWTIME(1) := TEMP'0;                                       << 8198>>05825000
   NOWTIME(2) := TEMP'1;                                       << 8198>>05830000
                                                               << 8198>>05835000
<< Check the Scheduled Jobs queue for jobs that are ready  >>  << 8198>>05840000
<< to go.  If found, these are placed into the WAIT queue  >>  << 8198>>05845000
<< by the call to SCHEDULEJOB, and the Scheduled Jobs      >>  << 8198>>05850000
<< queue is updated.  When done, the scheduled job to be   >>  << 8198>>05855000
<< run will be the new JMATSCHEDHEAD.                      >>  << 8198>>05860000
                                                               << 8198>>05865000
<< Look at the first job in the Scheduled Jobs queue.      >>  << 8198>>05870000
   MOVEFROMDSEG( @JMATARR, JMATDST, 0, JMATENTRYSIZE );        << 8198>>05875000
   LINK := JMATSCHEDHEAD;                                      << 8198>>05880000
   IF LINK = JOBCHAINEND                                       << 8198>>05885000
      THEN RETURN;          << No Scheduled Jobs.          >>  << 8198>>05890000
                                                               << 8198>>05895000
   MOVEFROMDSEG( @JMATARR, JMATDST, LINK, JMATENTRYSIZE );     << 8198>>05900000
   CURRINX := LINK;                                            << 8198>>05905000
   LINK := JMATSCHEDLINK;                                      << 8198>>05910000
                                                               << 8198>>05915000
   NOTDONE := TRUE;                                            << 8198>>05920000
   WHILE NOTDONE DO                                            << 8198>>05925000
   BEGIN                                                       << 8198>>05930000
                                                               << 8198>>05935000
   << The current job can be placed into the WAIT state.   >>  << 8198>>05940000
   << Do so, and maintain the Scheduled Jobs queue.        >>  << 8198>>05945000
      IF CANGO THEN                                            << 8198>>05950000
      BEGIN                                                    << 8198>>05955000
         @JMATP := CURRINX;                                    << 8198>>05960000
         MOVEFROMDSEG( @JMATARR, JMATDST, 0,                   << 8198>>05965000
                       JMATENTRYSIZE         );                << 8198>>05970000
         JMATSCHEDHEAD := LINK;                                << 8198>>05975000
         MOVETODSEG( JMATDST, 0, @JMATARR,                     << 8198>>05980000
                     JMATENTRYSIZE           );                << 8198>>05985000
         SCHEDULEJOB( JMATP );                                 << 8198>>05990000
                                                               << 8198>>05995000
      << Get next JMAT entry if it exists.                 >>  << 8198>>06000000
         IF LINK = JOBCHAINEND                                 << 8198>>06005000
            THEN NOTDONE := FALSE                              << 8198>>06010000
         ELSE                                                  << 8198>>06015000
         BEGIN                                                 << 8198>>06020000
            MOVEFROMDSEG( @JMATARR, JMATDST, LINK,             << 8198>>06025000
                          JMATENTRYSIZE            );          << 8198>>06030000
            CURRINX := LINK;                                   << 8198>>06035000
            LINK := JMATSCHEDLINK;                             << 8198>>06040000
         END;                                                  << 8198>>06045000
      END    << Current job CANGO case. >>                     << 8198>>06050000
                                                               << 8198>>06055000
      ELSE IF ERRFLAG                                          << 8198>>06060000
         THEN PRINTCOMPERROR                                   << 8198>>06065000
                                                               << 8198>>06070000
      ELSE NOTDONE := FALSE;                                   << 8198>>06075000
                                                               << 8198>>06080000
   END;                                                        << 8198>>06085000
                                                               << 8198>>06090000
                                                               << 8198>>06095000
<< JMATSCHEDHEAD in the JMAT header now points to          >>  << 8198>>06100000
<< the first job in the Scheduled Jobs queue.  Delete the  >>  << 8198>>06105000
<< current TRL entry if it exists--it is no longer needed. >>  << 8198>>06110000
<< A new entry for the first job in the Scheduled Jobs     >>  << 8198>>06115000
<< queue will be obtained.                                 >>  << 8198>>06120000
                                                               << 8198>>06125000
   IF TRLX <> NOTRL                                            << 8198>>06130000
      THEN ABORTTIMEREQ( TRLX );                               << 8198>>06135000
                                                               << 8198>>06140000
                                                               << 8198>>06145000
<< If necessary, create a new timer request for the first  >>  << 8198>>06150000
<< job in the Scheduled Jobs queue.                        >>  << 8198>>06155000
   MOVEFROMDSEG( @JMATARR, JMATDST, 0, JMATENTRYSIZE );        << 8198>>06160000
   CURRINX := JMATSCHEDHEAD;                                   << 8198>>06165000
   IF CURRINX = JOBCHAINEND THEN                               << 8198>>06170000
   BEGIN                                                       << 8198>>06175000
                                                               << 8198>>06180000
   << The Scheduled Jobs queue is empty.  No TRL request.  >>  << 8198>>06185000
      TRL'JMATINX := NOTRL;  << Signifies no TRL request.  >>  << 8198>>06190000
      TRL'JSNO := NOTRL;                                       << 8198>>06195000
      TRLX := NOTRL;                                           << 8198>>06200000
                                                               << 8198>>06205000
   END                                                         << 8198>>06210000
   ELSE                                                        << 8198>>06215000
   BEGIN                                                       << 8198>>06220000
                                                               << 8198>>06225000
   << The Scheduled Jobs queue is not empty.  Generate a   >>  << 8198>>06230000
   << Timer Request for it.                                >>  << 8198>>06235000
      JMATINX := 0;                                            << 8198>>06240000
      MOVEFROMDSEG( @JMATARR, JMATDST, CURRINX,                << 8198>>06245000
                    JMATENTRYSIZE               );             << 8198>>06250000
      TIME(0) := JMATCALENDAR;                                 << 8198>>06255000
      MOVE TIME(1) := JMATTIME, (2);                           << 8198>>06260000
      COMPRETURN := COMPTIME( TIME, NOWTIME,                   << 8198>>06265000
                              DIFF, COMPERROR );               << 8198>>06270000
      IF COMPRETURN = ERRINCOMP                                << 8198>>06275000
         THEN PRINTCOMPERROR                                   << 8198>>06280000
      ELSE                                                     << 8198>>06285000
      BEGIN                                                    << 8198>>06290000
                                                               << 8198>>06295000
         IF COMPRETURN = VERY'GREAT                            << 8198>>06300000
            THEN DIFF := DAYS'24;                              << 8198>>06305000
         TRLX := TIMEREQ( WATCHDOG, UCOPPCBINX, DIFF );        << 8198>>06310000
         TRL'JMATINX := CURRINX;                               << 8198>>06315000
         IF COMPRETURN = VERY'GREAT                            << 8198>>06320000
            THEN TRL'JSNO := NOTRL                             << 8198>>06325000
            ELSE TRL'JSNO := JMATJSNO;                         << 8198>>06330000
                                                               << 8198>>06335000
      END;                                                     << 8198>>06340000
                                                               << 8198>>06345000
   END;                                                        << 8198>>06350000
                                                               << 8198>>06355000
END;  << CHECKSCHED >>                                         << 8198>>06360000
                                                               << 8198>>06365000
                                                               << 8198>>06370000
$PAGE "GETJOB:  Checks to see if a Jobs are Ready."            << 8198>>06375000
LOGICAL PROCEDURE GETJOB;                                               06380000
<< SCANS JMAT SCHEDULING QUEUE ATTEMPTING TO: 1). LAUNCH A              06385000
   QUALIFYING SESSION;  2). PRINT A PENDING JOB ERROR                   06390000
   MESSAGE;  OR 3). LAUNCH A QUALIFYING BATCH JOB.                      06395000
   REMOVES EVERY SESSION ENCOUNTERED WHICH CANNOT BE LAUNCHED           06400000
   IMMEDIATELY.  RETURNS (TRUE) AS SOON AS A JOB IS LAUNCHED.           06405000
   SETS <WAITFLAGS> AS APPROPRIATE (I.E. ERROR MESSAGE                  06410000
   WAITING FOR THE ERROR BUFFER; AND/OR ENTRY WAITING FOR A             06415000
   DEVICE).  SEE, ALSO, LAUNCHJOB.    >>                                06420000
                                                               <<LJC>>  06425000
<< * Fix Information                                       >>  <<LJC>>  06430000
<<                                                         >>  <<LJC>>  06435000
<<   Two things: 1.  Puts the message "CAN'T INITIATE NEW  >>  <<LJC>>  06440000
<<   SESSIONS NOW" in CATALOG.PUB.SYS under $SET 1, $MSG80 >>  <<LJC>>  06445000
<<   2. Prints a message to the user if the allocation for >>  <<LJC>>  06450000
<<   $STDLIST/$STDIN during a logon attempt, will UP the   >>  <<LJC>>  06455000
<<   device, print the message and the DOWN the device     >>  <<LJC>>  06460000
<<                                                         >>  <<LJC>>  06465000
<<  * Fix information                                       >> <<06578>>06470000
<<                                                          >> <<06578>>06475000
<<      These are the MPE-V JMAT changes.                   >> <<06578>>06480000
<<      Note -- We keep a list of all the devices which     >> <<06578>>06485000
<<      have failed upon allocation in order to prevent     >> <<06578>>06490000
<<      duplication of error messages.  This list is kept on>> <<06578>>06495000
<<      TOS.  Each entry is now two words long (before the  >> <<06578>>06500000
<<      advent of 16 bit ldevs it was only one word) with   >> <<06578>>06505000
<<      the following format:                               >> <<06578>>06510000
<<              Word 0:    The failed LDEV                  >> <<06578>>06515000
<<              Word 1:    0  =  Input device               >> <<06578>>06520000
<<                         1  =  List device                >> <<06578>>06525000
<<                         2  =  List device is an index    >> <<06578>>06530000
<<                                                          >> <<06578>>06535000
<<      NUMCANTALLOC is the number of failed LDEVS.         >> <<06578>>06540000
<<                                                          >> <<06578>>06545000
BEGIN                                                                   06550000
                                                               <<06578>>06555000
<< ........................................................ >> <<06578>>06560000
<<    **** Declarations for the JMAT - MPEV  fixes ****     >> <<06578>>06565000
<<                                                          >> <<06578>>06570000
<<  JMATARR    - is used by the JMAT include file to        >> <<06578>>06575000
<<               reference the JMAT.                        >> <<06578>>06580000
<<  JMATINX    - is the index into the JMATARR array        >> <<06578>>06585000
<<  NEXTENTRY  - saves the index to the next JMAT entry     >> <<06578>>06590000
<<               in the scheduling list.                    >> <<06578>>06595000
<<  JMATP      - is used as a parameter to LAUNCHJOB who    >> <<06578>>06600000
<<               expects a pointer to the JMAT of the job   >> <<06578>>06605000
<<               to be launched.                            >> <<06578>>06610000
<< ........................................................ >> <<06578>>06615000
                                                               <<06578>>06620000
INTEGER ARRAY JMATARR(*) = DB + 0;<< Using exchg DB >>         <<06578>>06625000
INTEGER       JMATINX;  << This is the index into the JMATARR>><<06578>>06630000
INTEGER       NEXTENTRY;                                       <<06578>>06635000
INTEGER POINTER JMATP;                                         <<06578>>06640000
                                                               << 8153>>06645000
INTEGER ARRAY                                                  << 8153>>06650000
    ARR(0:2);  << Used to send messages to creator. >>         << 8153>>06655000
                                                               <<06578>>06660000
<< LOCAL UCOP WAIT FLAGS >>                                             06665000
   LOGICAL           LWAITFLAGS;                                        06670000
   DEFINE            WAITDEV   = LWAITFLAGS.(15:1) #,                   06675000
                     WAITERRBUF   = LWAITFLAGS.(0:1) #;                 06680000
<< MISC. VARS >>                                                        06685000
   LOGICAL           STOPFLG := FALSE; << STOP SCAN FLAG >>    <<06574>>06690000
   INTEGER           CILOGX;                                   <<00.04>>06695000
   INTEGER           ACTION,           <<LAUNCHJOB'S ACTION>>           06700000
                     SIRRETURN;        <<JMAT SIR RETURN>>              06705000
   INTEGER                                                     << 8153>>06710000
      CREATOR'PIN; << Used to find Creators Port ID. >>        << 8153>>06715000
                                                               << 8153>>06720000
   DOUBLE                                                      << 8153>>06725000
      PORT'ID;  << Creators Port ID. >>                        << 8153>>06730000
                                                               << 8153>>06735000
   INTEGER                                                     << 8153>>06740000
      SUB'QUEUE; << Subqueue we are sending message to. >>     << 8153>>06745000
                                                               << 8153>>06750000
   EQUATE            LAUNCHOK   = 0,   <<LAUNCHJOB RETURNS>>            06755000
                     SPECIFICFAIL   = 1,                                06760000
                     JOBCHAINEND    = 0,<< End of JMAT list >> <<06578>>06765000
                     JINFAIL   = 10,                                    06770000
                     JLISTFAIL   = 9;                                   06775000
   DOUBLE ARRAY      DARRS0 (*)  = S-0;<<To access LDEV list >><<06578>>06780000
   INTEGER ARRAY     ARRS0  (*)  = S-0;                                 06785000
   INTEGER           NUMCANTALLOC  := 0; << List count >>      <<06578>>06790000
   DOUBLE            TARGIN,                                   <<06578>>06795000
                     TARGLIST;  << Hold new list failure >>    <<06578>>06800000
   EQUATE            TERMTYPE  = 16;   << TERM DEV TYPE >>              06805000
   INTEGER           LISTDEVICE;                               <<01029>>06810000
                                                               <<06577>>06815000
<< DFLAGDEV is a double word structure.  The high order word >><<06577>>06820000
<< contains a FLAG mask and the low order word contains a    >><<06577>>06825000
<< logical device.  Used in calls to external procecure      >><<06577>>06830000
<< DEALLOCATE (see subroutine DEALLOC in LAUNCHJOB and       >><<06577>>06835000
<< procedure GETJOB).                                        >><<06577>>06840000
DOUBLE DFLAGDEV;                                               <<06577>>06845000
LOGICAL DFLAG =DFLAGDEV;                                       <<06577>>06850000
LOGICAL DDEV =DFLAGDEV+1;                                      <<06577>>06855000
                                                               <<06577>>06860000
   INTEGER                                                     <<06572>>06865000
      LDT'INDEX := 0;                                          <<06572>>06870000
   LOGICAL ARRAY LDT(*) = DB + 0;                              <<06572>>06875000
   << >>                                                                06880000
   GETJOB := FALSE;                                                     06885000
   LWAITFLAGS := 4;                                                     06890000
   SIRRETURN := GETSIR (JMATSIR);                                       06895000
                                                               << 8198>>06900000
<< Place appropriate Scheduled Jobs into WAIT queue.       >>  << 8198>>06905000
   CHECKSCHED;                                                 << 8198>>06910000
   EXCHANGEDB( JMATDST );                                      << 8198>>06915000
                                                               << 8198>>06920000
   DISABLE;                                                    <<01549>>06925000
   TOS:=ABSYS'MISCWORD; TOS.JOBSYNC:=0; ABSOLUTE(XREG):=TOS;   <<01549>>06930000
   ENABLE;                                                     <<01549>>06935000
   JMATINX := JMATHEADPTR; << Start at head of queue >>        <<06578>>06940000
   @JMATP  := JMATINX; << Remember, some people prefer ptrs >> <<06578>>06945000
   WHILE (JMATINX <> JOBCHAINEND) AND (NOT (STOPFLG)) DO       <<06578>>06950000
      BEGIN                                                             06955000
      NEXTENTRY := JMATSCHEDLINK;  << Remember next entry >>   <<06578>>06960000
      IF NUMCANTALLOC > 0 THEN                                          06965000
         BEGIN  <<CHECK 2 C IF THIS JIN/JLIST FAILED B4>>               06970000
         TOS         :=  JMATJLISTDEV;                         <<06578>>06975000
         TOS         :=  IF LOGICAL(JMATCBIT) THEN 2  ELSE 1;  <<06578>>06980000
         TARGLIST    :=  TOS;                                  <<06578>>06985000
                                                               <<06578>>06990000
         TOS         :=  JMATJINDEV;                           <<06578>>06995000
         TOS         :=  0;                                    <<06578>>07000000
         TARGIN      :=  TOS;                                  <<06578>>07005000
                                                               <<06578>>07010000
         XREG := -NUMCANTALLOC +1;                                      07015000
         DO IF DARRS0 (XREG) = TARGLIST  OR                    <<06578>>07020000
               DARRS0 (XREG) = TARGIN    THEN GOTO NEXT        <<06578>>07025000
         UNTIL (XREG := XREG +1) > 0;                                   07030000
         << JIN OR JLIST HASN'T PREVIOUSLY FAILED >>                    07035000
         END;                                                           07040000
      IF (ACTION := LAUNCHJOB (JMATP)) = LAUNCHOK THEN                  07045000
         STOPFLG := (GETJOB := TRUE)                           <<06574>>07050000
      ELSE                                                              07055000
         BEGIN    <<COULDN'T LAUNCH>>                                   07060000
         IF JMATJSTYPE = SESSTYPE THEN                         <<06578>>07065000
            BEGIN    <<COULDN'T LAUNCH SESSION: REMOVE>>                07070000
            LDT'INDEX := JMATJINDEV * SIZE'OF'LDT'ENTRY;       <<06578>>07075000
            EXCHANGEDB (LDT'DST);                              <<06572>>07080000
            << C IF NECESSARY 2 SETUP TERMINAL DEVICE >>                07085000
            TOS := (LDT'DEVICE'TYPE = TERMTYPE);               <<06572>>07090000
            EXCHANGEDB (JMATDST);                                       07095000
            IF (JMATPROGLOGON=1) AND (JMATWAITTILLON = 1) THEN << 8153>>07100000
                                                               << 8153>>07105000
            << Session was programmatically created and the >> << 8153>>07110000
            << creator process is waiting to find out if the>> << 8153>>07115000
            << session made it.  We will let him know via   >> << 8153>>07120000
            << IPC.                                         >> << 8153>>07125000
            BEGIN                                              << 8153>>07130000
              CREATOR'PIN := JMATCREATOR;                      << 8153>>07135000
              EXCHANGEDB(0);  << No split stack now >>         << 8153>>07140000
              PORT'ID := FINDPROCESSPORT(CREATOR'PIN);         << 8153>>07145000
              SUB'QUEUE := 3; << Must match the subqueue    >> << 8153>>07150000
                              << the creator is waiting on. >> << 8153>>07155000
              ARR(1) := 3;  << Msg length. >>                  << 8153>>07160000
              ARR(2) := GET'DCS'FAILNO(2,ACTION);              << 8153>>07165000
              SEND'DB(PORT'ID,SUB'QUEUE,ARR);                  << 8153>>07170000
              EXCHANGEDB(JMATDST);                             << 8153>>07175000
              JMATWAITTILLON := 0;                             << 8153>>07180000
            END;                                               << 8153>>07185000
                                                               << 8153>>07190000
            IF TOS THEN                                                 07195000
               ATTACHIO (JMATJINDEV, 0, 0, 0, 21, 0,           <<06578>>07200000
                         1, 0, %13);                           <<06578>>07205000
            IF LOGICAL(JMATCBIT)                               <<06578>>07210000
            OR (JMATJINDEV <> JMATJLISTDEV) THEN               <<06578>>07215000
               BEGIN  << TELL OP 'CAUSE CAN'T TELL USER >>              07220000
               EXCHANGEDB (0);                                          07225000
               << MESSAGE >>                                            07230000
               EXCHANGEDB (JMATDST);                                    07235000
               END                                                      07240000
            ELSE IF JMATPROGLOGON = 0 THEN                              07245000
               BEGIN    <<TELL USER>>                                   07250000
               LISTDEVICE := JMATJLISTDEV;                     <<06578>>07255000
               EXCHANGEDB (0);                                          07260000
               IF((ACTION=JLISTFAIL)LOR(ACTION=JINFAIL))       <<LJC>>  07265000
                 THEN                                          <<LJC>>  07270000
                  IF LISTDEVICE <> ABSOLUTE(CONSOLECELL)       <<06817>>07275000
                     THEN                                      <<LJC>>  07280000
                     BEGIN                                     <<LJC>>  07285000
                       ATTACHIO(LISTDEVICE,0,0,0,24,0,0,0,0);  <<LJC>>  07290000
                       IF ACTION=JLISTFAIL                     <<LJC>>  07295000
                          THEN GENMSG(1,CANTGETLIST,,,,,,,     <<LJC>>  07300000
                                      LISTDEVICE)                       07305000
                          ELSE IF ACTION=JINFAIL               <<LJC>>  07310000
                                  THEN GENMSG(1,CANTGETIN,     <<LJC>>  07315000
                                             ,,,,,,LISTDEVICE);<<LJC>>  07320000
                       ATTACHIO(LISTDEVICE,0,0,0,4,0,0,0,0);   <<LJC>>  07325000
                     END << IF NOT CONSOLE >>                  <<LJC>>  07330000
                     ELSE  <<  FOR LOOKS NO NEW MSG->CONS >>   <<LJC>>  07335000
                  ELSE GENMSG(1,NONEWSES,,,,,,,LISTDEVICE);    <<LJC>>  07340000
               EXCHANGEDB (JMATDST);                                    07345000
               END;                                                     07350000
            << REMOVE JMAT ENTRY >>                                     07355000
            DELINK'JMAT (@JMATP);                              <<06578>>07360000
            DFLAG:=%3400; << High order word of DFLAGDEV >>    <<07325>>07365000
            DDEV:=JMATJINDEV; << Low order word of DFLAGDEV >> <<06577>>07370000
            CILOGX := JMATFTBITS;                              <<06578>>07375000
            DEALLOCATE'JMAT(JMATP);                            <<06578>>07380000
            EXCHANGEDB (0);                                             07385000
            DEALLOCATE(DFLAGDEV);                              <<06577>>07390000
            IF CILOGX <> 0 THEN                                <<00.04>>07395000
                  CILOGTABLE(2,@JMATP,CILOGX,ARRS0);           <<00.04>>07400000
            EXCHANGEDB (JMATDST);                              <<00.04>>07405000
            END                                                         07410000
         ELSE                                                           07415000
            BEGIN    <<COULDN'T LAUNCH JOB>>                            07420000
            IF ACTION = JLISTFAIL THEN                                  07425000
               BEGIN    << ADD JLIST TO CANT ALLOC LIST >>              07430000
               TOS := JMATJLISTDEV;                            <<06578>>07435000
               IF LOGICAL(JMATCBIT)                            <<06578>>07440000
               THEN TOS := 2                                   <<06578>>07445000
               ELSE TOS := 1;                                  <<06578>>07450000
               NUMCANTALLOC := NUMCANTALLOC +1;                         07455000
               WAITDEV := TRUE;                                         07460000
               END                                                      07465000
            ELSE                                                        07470000
               IF ACTION = JINFAIL THEN                                 07475000
                  BEGIN    << ADD JIN TO CANT ALLOC LIST >>             07480000
                  TOS := JMATJINDEV;                           <<06578>>07485000
                  TOS := 0;                                    <<06578>>07490000
                  NUMCANTALLOC := NUMCANTALLOC +1;                      07495000
                  WAITDEV := TRUE;                                      07500000
                  END                                                   07505000
               ELSE                                                     07510000
                  << ALL OTHER LAUNCH FAILURES WOULD CAUSE              07515000
                     ANY SUBSEQUENT JOB TO FAIL ALSO >>                 07520000
                  STOPFLG := TRUE;                             <<06574>>07525000
            END;                                                        07530000
         END;    << LAUNCH FAILURE HANDLING >>                          07535000
NEXT:                                                                   07540000
      JMATINX := NEXTENTRY;                                    <<06578>>07545000
      @JMATP  := JMATINX;                                      <<06578>>07550000
      END;                                                              07555000
   RELSIR (JMATSIR, SIRRETURN);                                         07560000
   EXCHANGEDB (0);                                                      07565000
   WAITFLAGS := LWAITFLAGS;                                             07570000
   END;    << GETJOB >>                                                 07575000
$PAGE "***   OUTER BLOCK   ***"                                         07580000
      <<INITIALISATION PHASE:SET UP UCOP REQUEST LIST>>                 07585000
                                                                        07590000
      ASSEMBLE(ADDS 17);                                                07595000
      EXCHANGEDB(URLDST);          <<SET DB TO URL>>                    07600000
      REQFREE := 2;                 <<INIT LIST POINTERS>>              07605000
      REQNEXT := 2;                                                     07610000
      EXCHANGEDB(0);                                                    07615000
      <<COMMAND INTERPRETER LABELS>>                                    07620000
      COMINTLB := ABSYS'CIEXTL.(8:8) LOR %100000;                       07625000
      COMINTDP:= ABSYS'CIINTL;                                          07630000
      UCOPPCBINX := SYSPROC( UCOPLPIN );                       << 8198>>07635000
      TRLX := NOTRL;                                           << 8198>>07640000
      TRL'JMATINX := NOTRL;                                    << 8198>>07645000
      TRL'JSNO := NOTRL;                                       << 8198>>07650000
      PCBPT := CURPRC;                                         <<06574>>07655000
      SPCBPTYPE' := 3;  << PROCESS TYPE >>                     <<06574>>07660000
      AWAKE(SYSPROC(0),2,%20);                 <<AWAKE PROGENITOR>>     07665000
                                                                        07670000
                                                                        07675000
START:                                                                  07680000
      EXCHANGEDB(URLDST);          <<SET DB TO URL>>                    07685000
U4:   DISABLE;                                                          07690000
      IF REQNEXT = REQFREE THEN                                         07695000
      BEGIN                            <<NO MORE REQUESTS>>             07700000
U1:      ENABLE;                                                        07705000
U1':     EXCHANGEDB (0);                                                07710000
U3:      IF GETJOB THEN GOTO U1                                         07715000
         ELSE                                                           07720000
            BEGIN                      << NO READY JOB FOUND >>         07725000
            << WAIT IFF:                                                07730000
               - UCOP REQUEST QUEUE EMPTY,  AND                         07735000
               - NO "STOP" REQUESTED,  AND                              07740000
               - NO JOB(S) JUST MADE READY,  AND                        07745000
               - NO (DEV JUST MADE AVAIL AND JOB(S) WAITING),  AND      07750000
            << SETUP XREG VALUES NEEDED AFTER DISABLE >>                07755000
            TOS := MISCWORD;  <<JOB SYNCH WORD>>               <<01549>>07760000
            PUSH (Q);                                                   07765000
            TOS := -TOS +@WAITFLAGS;                                    07770000
            TOS := ABSYS+UCOPSW;  <<UCOP STOP WORD>>                    07775000
            EXCHANGEDB (URLDST);                                        07780000
            DISABLE;                      << GO >>                      07785000
            IF REQNEXT <> REQFREE THEN                                  07790000
               BEGIN                   <<UCOP REQ. Q NOT EMPTY>>        07795000
               ASSEMBLE (DDEL, DEL);                                    07800000
               GOTO U2;                                                 07805000
               END;                                                     07810000
            XREG := TOS;                                                07815000
            IF ABSOLUTE(XREG) < 0 THEN                                  07820000
               BEGIN                   <<STOP REQUESTED>>               07825000
               ENABLE;                                                  07830000
               ABORTPROCIO (0);        <<STOP ANY ERROR PRINTING>>      07835000
               AWAKE (SYSPROC(0), 2, 0);  <<AWAKE PROGEN, SIGNAL STOP>> 07840000
               WAIT (0, 0);                                             07845000
               END;                                                     07850000
            XREG := TOS;                                                07855000
            TOS := ARRQ0(XREG);        <<LOCAL WAIT INDICATORS>>        07860000
            ASSEMBLE (STBX, DUP);                                       07865000
            TOS := ABSOLUTE (XREG);    <<JOB SYNCH WORD>>               07870000
            ASSEMBLE (AND, DEL);                                        07875000
            IF <> THEN                                                  07880000
               BEGIN                   <<JOB JUST MADE READY,  OR>>     07885000
               ENABLE;                 <<DEVICE FREED AND JOB(S) WAIT>> 07890000
               DDEL;                                                    07895000
               GOTO U1';                                                07900000
               END;                                                     07905000
            <<SHIFT JOB SYNC BITS ONE TO THE LEFT TO SIGNAL>>  <<01549>>07910000
            <<IF JOBS ARE WAITING.>>                           <<01549>>07915000
            DISABLE;                                           <<01549>>07920000
            TOS:=ABSOLUTE(XREG); ASSEMBLE(XCH);                <<01549>>07925000
            TOS:=(TOS&LSL(1)).JOBSYNC;  <<ALSO CLEARS PORTS>>  <<01549>>07930000
            ABSOLUTE(XREG):=TOS;                               <<01549>>07935000
            ENABLE;                                            <<01549>>07940000
            TOS:=TOS.PORTIMER;  <<PORT TIMEOUT?>>              <<01549>>07945000
            IF <> THEN                                         <<01549>>07950000
               FCPOSTIMEOUT(*)                                 <<01549>>07955000
            ELSE                                               <<01549>>07960000
               DEL;                                            <<01549>>07965000
            WAIT( UCOPWAIT, 0 );                               << 8198>>07970000
            DEL;                                                        07975000
            GOTO U4;                                                    07980000
            END;                                                        07985000
      END ELSE                                                          07990000
      BEGIN                                                             07995000
                                                                        08000000
      <<THE REQUEST LIST IS NOT EMPTY>>                                 08005000
U2:      TOS := REQENTRY(REQNEXT);  <<DOUBLE REQUEST>>                  08010000
         REQNEXT := IF REQNEXT=REQMAX+1 THEN 2 ELSE REQNEXT+1; <<06159>>08015000
         ENABLE;                                                        08020000
         EXCHANGEDB(0);                                                 08025000
         REQ2:=TOS;                                                     08030000
         REQ1:=TOS;                                                     08035000
         GOTO SWEX(REQ1.(12:4));                                        08040000
      END;                                                              08045000
                                                                        08050000
                                                                        08055000
NULL:                                                                   08060000
      GOTO START;                                                       08065000
                                                                        08070000
JMP:                                                                    08075000
                                                                        08080000
PROCOUT:                                                                08085000
      BURRYPROC(REQ2 * PCBSIZE);                               <<06534>>08090000
      PCBPT := CURPRC;                                         <<06574>>08095000
      IF SPCBSONINFO = 0 THEN                                  <<06574>>08100000
         << REMOVING LAST SON >>                                        08105000
         << TRY AWAKENING PROGEN IN CASE THIS IS LOGOFF (WAIT FOR SON)>>08110000
         AWAKE (SYSPROC(0), 2, 0);                                      08115000
      GOTO START;                                                       08120000
                                                               <<01549>>08125000
                                                                        08130000
                                                                        08135000
END.    << UCOP >>                                             << 8198>>08140000
