$CONTROL USLINIT,CODE,MAP,PRIVILEGED                                    00010000
<< LOGSEG0 - MODULE 90 >>                                               00012000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00016000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00018000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00020000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00022000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00024000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00026000
$TITLE "LOGGING PROCESS"                                                00028000
$CONTROL ADR                                                   <<04162>>00030000
<< Store fully qualified filename correctly in the tables. >>  <<03566>>00032000
<<Check for early release of LOGBUFF DST.                   >> <<03567>>00034000
<< Adds extra error checking and makes use of equated values.>><<03568>>00036000
<< Correct recover from powerfail routine.                  >> <<03570>>00038000
<< Changes equates to user new error msg -> ULOGERR 28.    >>  <<03569>>00040000
<< Fix non-recovery of logfile on warmstart >>                 <<03571>>00042000
<< Enhancement - Logging to labeled serial disc, LINUS  >>     <<03572>>00044000
<< Post GAP table after every write to serial disc. Also>>     <<03732>>00046000
<< cleanup recovery routine to work for all logfiles    >>     <<03732>>00048000
<< Make sure HDR labels posted to tape file right after FOPEN>><<04163>>00050000
<<  Also perform abortio to tape upon a powerfail.           >><<04163>>00052000
<< Preserve locking hierarchy - get logsir before resource. >> <<04164>>00054000
<< Remove declarations of unused items. General clean up.    >><<04162>>00056000
<< New procedure to stop all log processes upon =SHUTDOWN.   >><<04165>>00058000
<< Make DB at stack when call FWRITEDIR for restart.         >><<04286>>00060000
<< One last "fix" to powerfail recovery stuff.               >><<04454>>00062000
<< Problem with log process calling FLUSH and losing STOPs.  >><<04820>>00064000
<< Make use of include file for table definitions, etc.      >><<04886>>00066000
<< Remove all dependencies to the DST table.                 >><<04887>>00068000
<< Print out File System errors along with U.L. errors.      >><<04888>>00070000
BEGIN                                                                   00072000
$CONTROL SEGMENT=LOGSEG0,MAIN=LOGSEG0                                   00074000
                                                                        00076000
$INCLUDE INCLLOG                                               <<04886>>00078000
                                                                        00102000
<<FILE LABEL EQUATES>>                                                  00104000
                                                                        00106000
EQUATE                                                                  00108000
EOF               =       21,                                           00110000
FCODE             =       26,                    <<FILE CODE>>          00112000
FLIMIT            =       15,   << File limit >>               <<03568>>00114000
FBLKSIZE          =       38,   << Blocksize >>                <<03568>>00116000
FEXTSIZE          =       41,   << Size of extent >>           <<03568>>00118000
LASTEXT           =       40;             <<LAST EXTENT SIZE>>          00120000
                                                                        00122000
                                                                        00124000
                                                                        00126000
EQUATE                                                                  00128000
PRI            =   140,            <<PRIORITY OF REC PROCESS>>          00130000
PCBSIZE        =   16,                                                  00132000
ABSYS          =   %1000,                                               00134000
SYSEXTPTR      =   ABSYS+%377,                                          00136000
LOCSIZE      =   1000,   <<Q TO Z>>                            <<00753>>00138000
                                                                        00140000
                                                                        00142000
GLOBSIZE       =   4620          <<BLOCKSIZE>>+128<<REC SIZE>>          00144000
+ 100                             <<MISC>>+256<<PRIMARY DB>> ,          00146000
INITSTACK      =   GLOBSIZE+LOCSIZE+512 ,          <<PCBX>>             00148000
MAXSTACK     =   INITSTACK+1024;                               <<00753>>00150000
                                                                        00152000
DEFINE                                                                  00154000
RECLOGPLABEL   =    ABSYS+ABSOLUTE(SYSEXTPTR)+%62#,                     00156000
RECLOGDELTAP   =    ABSYS+ABSOLUTE(SYSEXTPTR)+%63#,                     00158000
A'             =    ABSOLUTE#;                                          00160000
                                                                        00162000
                                                                        00164000
                                                                        00166000
DEFINE                                                                  00168000
                                                                        00170000
ULOGPLABEL   =   ABSYS+ABSOLUTE(SYSEXTPTR)+%60#,                        00174000
ULOGDELTAP   =   ABSYS+ABSOLUTE(SYSEXTPTR)+%61#,                        00176000
ULOGRSTARTPLABEL  =  ABSYS+ABSOLUTE(SYSEXTPTR)+%65#,                    00178000
ULOGRSTARTDELTAP  =  ABSYS+ABSOLUTE(SYSEXTPTR)+%64#;                    00180000
                                                                        00182000
                                                                        00184000
                                                                        00190000
INTEGER POINTER PDB  = DB;                                     <<04886>>00192000
                                                               <<04886>>00194000
INTEGER X = X;                                                          00196000
                                                                        00202000
<< Any changes to the following DB-relative declarations will>><<04162>>00204000
<< require changes to INITLOG & INITRECLOG. Those routines   >><<04162>>00206000
<< are responsible for initializing the logging process and  >><<04162>>00208000
<< the warmstart recovery process. That initialization       >><<04162>>00210000
<< involves setting up the addresses for these DB variables. >><<04162>>00212000
                                                               <<04162>>00214000
                                                                        00216000
BYTE ARRAY ZEROS(0:3);                                         <<04162>>00218000
BYTE ARRAY FORMS(0:9);                                                  00220000
BYTE ARRAY FNAME(0:35);                                        <<04162>>00224000
BYTE ARRAY BFNAME(0:35);                                       <<04162>>00228000
BYTE ARRAY PROCNAME(0:8);                                               00232000
LOGICAL ARRAY BUFFAREA(0:BLKSIZE-1);                           <<03568>>00234000
DOUBLE ARRAY DBUFFAREA(*) = BUFFAREA;                                   00236000
LOGICAL ARRAY DISCREC(0:RECSIZEM1);                            <<03568>>00238000
DOUBLE ARRAY DDISCREC(*) = DISCREC;                                     00240000
                                                                        00244000
                                                                        00246000
$PAGE                                                          <<04163>>00250000
PROCEDURE DELAY(MSEC);                                         <<04165>>00254000
   VALUE MSEC;                                                 <<04165>>00256000
   DOUBLE MSEC;                                                <<04165>>00258000
   OPTION EXTERNAL;                                            <<04165>>00260000
                                                               <<04165>>00262000
                                                               <<04165>>00264000
                                                               <<04165>>00266000
INTEGER PROCEDURE GETDATASEG(MEMSIZE,VDSIZE);                           00268000
VALUE MEMSIZE,VDSIZE;                                                   00270000
INTEGER MEMSIZE,VDSIZE;                                                 00272000
OPTION EXTERNAL;                                                        00274000
                                                                        00276000
                                                                        00278000
INTEGER PROCEDURE FLABIO(D,S,F,A);                                      00280000
VALUE D,S,F;                                                            00282000
INTEGER D,F;                                                            00284000
DOUBLE S;                                                               00286000
INTEGER ARRAY A;                                                        00288000
OPTION EXTERNAL;                                                        00290000
                                                                        00292000
                                                                        00296000
LOGICAL PROCEDURE EXCHANGEDB(DSTX);                                     00298000
VALUE DSTX;                                                             00300000
LOGICAL DSTX;                                                           00302000
OPTION EXTERNAL;                                                        00304000
                                                                        00306000
                                                                        00310000
PROCEDURE AWAKE(PCBPT,N,WAITF);                                         00312000
VALUE PCBPT,N,WAITF;                                                    00314000
INTEGER PCBPT,N,WAITF;                                                  00316000
OPTION PRIVILEGED UNCALLABLE,EXTERNAL;                                  00318000
                                                                        00320000
PROCEDURE WAIT(WAITC,JPCOUNTX);                                         00322000
VALUE WAITC,JPCOUNTX;                                                   00324000
INTEGER WAITC,JPCOUNTX;                                                 00326000
OPTION PRIVILEGED,UNCALLABLE,EXTERNAL;                                  00328000
                                                                        00330000
                                                                        00336000
LOGICAL PROCEDURE GETSIR(SIRN);                                         00338000
VALUE SIRN;                                                             00340000
INTEGER SIRN;                                                           00342000
OPTION PRIVILEGED,UNCALLABLE,EXTERNAL;                                  00344000
                                                                        00346000
PROCEDURE RELSIR(SIRN,A);                                               00348000
VALUE SIRN,A;                                                           00350000
INTEGER SIRN;                                                           00352000
LOGICAL A;                                                              00354000
OPTION PRIVILEGED,UNCALLABLE,EXTERNAL;                                  00356000
                                                                        00358000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS);   00360000
VALUE LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                        00362000
INTEGER LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                      00364000
OPTION EXTERNAL;                                                        00366000
                                                                        00368000
INTRINSIC FFILEINFO;                                           <<03732>>00370000
INTRINSIC FCONTROL,FSPACE;                                     <<04162>>00372000
INTRINSIC FOPEN,FCLOSE,FREADDIR,FWRITEDIR,FGETINFO,FWRITE;     <<04162>>00374000
INTRINSIC FPOINT,FCHECK,ASCII,DASCII,CLOCK,CALENDAR,FREAD;     <<04162>>00376000
                                                                        00378000
                                                                        00382000
                                                                        00384000
LOGICAL PROCEDURE INITLOG(LOGNAME,TYPE);                                00386000
VALUE TYPE;                                                             00388000
INTEGER TYPE;                                                           00390000
BYTE ARRAY LOGNAME;                                                     00392000
OPTION FORWARD;                                                         00394000
                                                                        00396000
LOGICAL PROCEDURE FINDLOG(LOGNAME,INDEX);                               00398000
INTEGER INDEX;                                                          00400000
BYTE ARRAY LOGNAME;                                                     00402000
OPTION FORWARD;                                                         00404000
                                                                        00406000
LOGICAL PROCEDURE RECPFAIL(BUFFILENO,RECNUM,TAPELDEV);         <<04163>>00408000
VALUE BUFFILENO,RECNUM,TAPELDEV;                               <<04163>>00410000
INTEGER BUFFILENO,TAPELDEV;                                    <<04163>>00412000
DOUBLE RECNUM;                                                          00414000
OPTION FORWARD;                                                         00416000
                                                               <<03570>>00418000
                                                               <<03570>>00420000
LOGICAL PROCEDURE GENTRY(INDEX,TYPE);                                   00422000
VALUE TYPE;                                                             00424000
INTEGER INDEX,TYPE;                                                     00426000
OPTION FORWARD;                                                         00428000
                                                                        00430000
LOGICAL PROCEDURE STOPLOG(LOGGING'NAME);                                00432000
BYTE ARRAY LOGGING'NAME;                                                00434000
OPTION FORWARD;                                                         00436000
                                                                        00438000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,PARM1,PARM2,PARM3,            00440000
PARM4,PARM5,DEST,REPLY,OFFSET,DST',CONTROL);                            00442000
VALUE SETNO,MSGNO,MASK,PARM1,PARM2,PARM3,PARM4,PARM5,DEST,              00444000
REPLY,OFFSET,DST',CONTROL;                                              00446000
INTEGER SETNO,MSGNO,DEST,DST';                                          00448000
LOGICAL MASK,PARM1,PARM2,PARM3,PARM4,PARM5,REPLY,OFFSET,                00450000
CONTROL;                                                                00452000
OPTION VARIABLE,EXTERNAL;                                               00454000
                                                                        00456000
                                                                        00458000
PROCEDURE RELDATASEG(IX);                                               00460000
VALUE IX;                                                               00462000
INTEGER IX;                                                             00464000
OPTION EXTERNAL;                                                        00466000
                                                                        00468000
                                                                        00470000
PROCEDURE RELENTRY(INDEX,TYPE);                                <<04162>>00472000
VALUE INDEX,TYPE;                                                       00474000
INTEGER INDEX,TYPE;                                                     00476000
OPTION FORWARD;                                                         00478000
                                                                        00480000
PROCEDURE FENTRY(LOGID',PASS',FNAME',UNAME',                            00482000
UACCT',TYPE');                                                          00484000
BYTE ARRAY LOGID',PASS',FNAME',UNAME',UACCT';                           00486000
LOGICAL TYPE';                                                          00488000
OPTION EXTERNAL,PRIVILEGED,VARIABLE;                                    00490000
                                                                        00492000
                                                                        00494000
PROCEDURE RELEASE(RES,ALTRES,WAKEUP);                                   00496000
VALUE RES,ALTRES,WAKEUP;                                                00498000
LOGICAL WAKEUP;                                                         00500000
LOGICAL POINTER RES,ALTRES;                                             00502000
OPTION EXTERNAL;                                                        00504000
                                                                        00506000
INTEGER PROCEDURE OBTAIN(RES,ALTRES);                                   00508000
VALUE RES,ALTRES;                                                       00510000
LOGICAL POINTER RES,ALTRES;                                             00512000
OPTION EXTERNAL;                                                        00514000
                                                                        00516000
INTEGER PROCEDURE LUN(VTABINDX,MVTABX);                                 00518000
VALUE VTABINDX,MVTABX;                                                  00520000
INTEGER VTABINDX,MVTABX;                                                00522000
OPTION EXTERNAL;                                                        00524000
                                                                        00526000
                                                                        00528000
                                                                        00530000
PROCEDURE PROCREATE (PINN, PLABEL, DELTAP, STACKDST, GLOBSIZE, <<01200>>00532000
                     DLSIZE, LOCSIZE, PRI, STRING, STRINGLNTH, <<01200>>00534000
                     PARM, FLAGS, MAXSTACK, STDIN, STDLIST);   <<01200>>00536000
  VALUE PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE,   <<01200>>00538000
        PRI, STRING, STRINGLNTH, PARM, FLAGS, MAXSTACK;        <<01200>>00540000
  INTEGER PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE, <<01200>>00542000
          PRI, STRING, STRINGLNTH, PARM, PINN, MAXSTACK;       <<01200>>00544000
  LOGICAL FLAGS;                                               <<01200>>00546000
  LOGICAL ARRAY STDIN, STDLIST;                                <<01200>>00548000
  OPTION EXTERNAL;                                             <<01200>>00550000
                                                                        00552000
                                                                        00554000
LOGICAL PROCEDURE GETSTACK(N,MP);                                       00556000
VALUE N,MP;                                                             00558000
LOGICAL N,MP;                                                           00560000
OPTION EXTERNAL;                                                        00562000
                                                                        00564000
                                                                        00566000
PROCEDURE WRITEDSEG(EN);                                                00568000
VALUE EN;                                                               00570000
INTEGER EN;                                                             00572000
OPTION EXTERNAL;                                                        00574000
                                                                        00576000
INTEGER PROCEDURE ADOPT(A,B);                                  <<00601>>00578000
VALUE A,B; INTEGER A,B;                                        <<00601>>00580000
OPTION EXTERNAL, PRIVILEGED;                                   <<00601>>00582000
                                                               <<00720>>00584000
INTEGER PROCEDURE FGETPVINFO(FILENUM);                         <<00720>>00586000
VALUE FILENUM;                                                 <<00720>>00588000
INTEGER FILENUM;                                               <<00720>>00590000
OPTION EXTERNAL;                                               <<00720>>00592000
                                                               <<00720>>00594000
                                                                        00596000
PROCEDURE FLUSH(I);                                            <<01380>>00598000
VALUE I;                                                       <<01380>>00600000
INTEGER I;                                                     <<01380>>00602000
OPTION EXTERNAL;                                               <<01380>>00604000
                                                                        00606000
PROCEDURE MOVE'FROM'DSEG(TARGET,SEGMENT,OFFSET,COUNT);         <<03567>>00608000
   VALUE TARGET,SEGMENT,OFFSET,COUNT;                          <<03567>>00610000
   INTEGER TARGET,SEGMENT,OFFSET,COUNT;                        <<03567>>00612000
   OPTION FORWARD,INTERNAL;                                    <<03567>>00614000
                                                               <<03567>>00616000
                                                               <<03567>>00618000
PROCEDURE MOVE'TO'DSEG(SEGMENT,OFFSET,SOURCE,COUNT);           <<03567>>00620000
   VALUE SEGMENT,OFFSET,SOURCE,COUNT;                          <<03567>>00622000
   INTEGER SEGMENT,OFFSET,SOURCE,COUNT;                        <<03567>>00624000
   OPTION FORWARD,INTERNAL;                                    <<03567>>00626000
                                                               <<03567>>00628000
                                                               <<03567>>00630000
                                                               <<03567>>00632000
INTEGER PROCEDURE IOSTAT(STAT);                                <<04888>>00634000
   VALUE STAT;                                                 <<04888>>00636000
   INTEGER STAT;                                               <<04888>>00638000
   OPTION EXTERNAL;                                            <<04888>>00640000
$PAGE                                                          <<03566>>00642000
LOGICAL PROCEDURE ULOGPROC;                                    <<00720>>00644000
                                                               <<00720>>00646000
OPTION PRIVILEGED,UNCALLABLE;                                           00648000
BEGIN                                                                   00650000
                                                                        00652000
COMMENT                                                        <<03568>>00654000
                                                               <<03568>>00656000
User Logging Process. Has responsibility for creating          <<03568>>00658000
and initializing the Logging Buffer Table. It will open the    <<03568>>00660000
User Logging files - the disc logging file (disc logging) or   <<03568>>00662000
the tape logging file and the disc buffer file (tape logging). <<03568>>00664000
                                                               <<03568>>00666000
If a Restart was requested (via the LOG command), then will    <<03568>>00668000
re-read the logging file to find where it left off, output a   <<03568>>00670000
Log restart record to the buffer area of the Logging Buffer and<<03568>>00672000
continue as if a Start was requested. If a Start was requested,<<03568>>00674000
then will output a Log header (start) record to the buffer area<<03568>>00676000
                                                               <<03568>>00678000
After this initialization, will wait (at label WAIT1) for a    <<03568>>00680000
request from a user (via the intrinsics). The type of action   <<03568>>00682000
desired by the user will be communicated here via the Global   <<03568>>00684000
Area of the Logging Buffer. This process will then perform the <<03568>>00686000
function, clear the request word, and return any error conditio<<03568>>00688000
to the user process, and then wait for another request.        <<03568>>00690000
                                                               <<03568>>00692000
When the request is to stop, will set the internal message word<<03568>>00694000
of the global area, and wait for the number of active users to <<03568>>00696000
become zero. At this point the buffer area will be flushed to  <<03568>>00698000
the logging file, the files closed, and the Logging Buffer Tabl<<03568>>00700000
will be released.                                              <<03568>>00702000
NOTE:                                                          <<04886>>00704000
  Cartridge tape and serial disc logfiles are treated the same <<04886>>00706000
  as tape logfiles.                                            <<04886>>00708000
                                                               <<04886>>00710000
;                                                              <<03568>>00712000
                                                                        00714000
                                                                        00716000
ENTRY RESTART;                                                          00718000
                                                               <<03568>>00720000
LOGICAL                                                        <<03568>>00722000
   MAX,              << Max block count >>                     <<03568>>00724000
   SIZE;             << Size (in blks) of new extent >>        <<03568>>00726000
                                                               <<03568>>00728000
DOUBLE  BLOCKNUM;                                              <<03568>>00730000
DOUBLE ADDR;                              <<FOR DISC ADDRESS>>          00732000
DOUBLE                                                         <<04888>>00734000
   ATT'STAT;                                                   <<04888>>00736000
                                                               <<04888>>00738000
INTEGER                                                        <<04888>>00740000
   ATT'STAT0 = ATT'STAT + 0;                                   <<04888>>00742000
                                                               <<04888>>00744000
INTEGER ADDR1 = ADDR;                           <<FIRST WORD>>          00746000
INTEGER ADDR2 = ADDR + 1;                      <<SECOND WORD>>          00748000
DOUBLE OUTBUFREC;             <<NEXT RECORD INTO DISC BUFFER>>          00750000
LOGICAL LEN,EXTNUM,NUMEXT;                                              00752000
LOGICAL LEXTNUM = EXTNUM;                                               00754000
LOGICAL RESTART';                                                       00756000
LOGICAL DONE;                                                           00758000
INTEGER J;                                                              00760000
INTEGER TEMP;                                                           00762000
INTEGER TABINDEX' = Q-4; <<INDEX TO LOGTAB ENTRY. PASSED FROM PCREAT>>  00764000
INTEGER A;                                                              00766000
INTEGER DB;                                                             00768000
INTEGER FILENO;                                                         00770000
INTEGER BUFFILENO;                                                      00772000
INTEGER TABINDEX;                                                       00774000
INTEGER INDEX;                                                          00776000
INTEGER BUFDST;                                                         00778000
INTEGER ERRCODE;                                                        00780000
INTEGER I;                                                     <<03568>>00782000
LOGICAL LI = I;                                                         00784000
INTEGER COUNT,NUMCHAR,TEMPCNT;                                 <<03568>>00786000
LOGICAL MAXUSERS;                                                       00790000
DOUBLE POINTER DBUF;                                                    00792000
BYTE POINTER BBUF;                                                      00794000
DOUBLE LIMIT;                                                           00796000
LOGICAL POINTER BUF;                                                    00798000
INTEGER MSGNO;                                                          00802000
INTEGER TAPEDEV;        << Ldev of tape log file >>            <<04163>>00804000
LOGICAL VALID;                                                          00806000
LOGICAL NOTIFIED;                                                       00808000
LOGICAL                                                        <<04820>>00810000
   FORMATTED'TRAILER,                                          <<04820>>00812000
   FREE'LAST'EXTENT;  << True if released the saved space in la<<04820>>00814000
DOUBLE CURRREC;                                                         00816000
DOUBLE POINTER DRECPTR;                                        <<04162>>00818000
BYTE POINTER BRECPTR;                                          <<04886>>00820000
POINTER RECPTR;                                                <<04162>>00822000
LOGICAL EXTSIZE;                                               <<00757>>00824000
LOGICAL EOFORERR;                                                       00826000
DOUBLE LASTREC;                                                         00828000
INTEGER LAST'REC'CODE;                                         <<01380>>00830000
LOGICAL RESFLAG;                                               <<00728>>00834000
DOUBLE DTEMP;                                                  <<01380>>00836000
LOGICAL ABNORMAL'EXIT;                                         <<01432>>00838000
BYTE ARRAY DEV(0:7) = Q;                                                00840000
LOGICAL ARRAY ENTRY'(0:TENTRYSIZE-1) = Q;                      <<03568>>00842000
BYTE ARRAY BENTRY'(*) = ENTRY';                                         00844000
DOUBLE ARRAY DENTRY'(*) = ENTRY';                                       00846000
LOGICAL ARRAY FLAB(0:127)=Q;                                            00848000
DOUBLE ARRAY DFLAB(*) = FLAB;                                           00850000
                                                               <<03566>>00854000
                                                               <<03566>>00856000
                                                               <<03566>>00858000
                                                               <<03566>>00860000
                                                               <<04820>>00864000
                                                               <<04820>>00866000
                                                                        00868000
SUBROUTINE CHECKMSG;                                           <<04820>>00870000
BEGIN                                                          <<04820>>00872000
                                                               <<04820>>00874000
<< This subroutine is used to check for special conditions >>  <<04820>>00876000
<< after calling FLUSH when stoppping the logging process. >>  <<04820>>00878000
<<                                                         >>  <<04820>>00880000
                                                               <<04820>>00882000
                                                               <<04820>>00884000
IF LOGBUFF(USERMSG) <> CONTINUE  OR                            <<04886>>00886000
   LOGBUFF(LOGMSG) <> CONTINUE  THEN                           <<04886>>00888000
BEGIN                                                          <<04820>>00890000
                                                               <<04820>>00892000
   IF LOGBUFF(USERMSG) = DISCSPACE THEN GO GETIT;              <<04886>>00894000
                                                               <<04820>>00896000
   IF LOGBUFF(MSG) = STOP AND LOGBUFF(NUMUSER) = 0  THEN       <<04820>>00898000
   BEGIN                                                       <<04820>>00900000
      << We have an error during the STOP, just quit >>        <<04820>>00902000
                                                               <<04820>>00904000
      IF LOGBUFF(LOGMSG) = WRITEERR THEN                       <<04886>>00906000
      BEGIN                                                    <<04820>>00908000
         IF LOGBUFF(LOGTYPE) = DISC  THEN                      <<04820>>00910000
         BEGIN                                                 <<04820>>00912000
            LOGBUFF(MSG) := STOP;                              <<04820>>00914000
            ABNORMAL'EXIT := TRUE;                             <<04820>>00916000
         END                                                   <<04820>>00918000
         ELSE LOGBUFF(MSG) := SUSPEND;                         <<04820>>00920000
                                                               <<04820>>00922000
         GO WAIT1;                                             <<04820>>00924000
      END;        << Write error >>                            <<04820>>00926000
                                                               <<04820>>00928000
      IF LOGBUFF(LOGMSG) = EOFONLOGFILE THEN                   <<04886>>00930000
      BEGIN                                                    <<04820>>00932000
         IF DLOGBUFF(FSPACE') = 0D AND FORMATTED'TRAILER THEN  <<04820>>00934000
         BEGIN                                                 <<04820>>00936000
            LOGBUFF(LOGMSG) := CONTINUE;                       <<04886>>00938000
            LOGBUFF(USERMSG) := CONTINUE;                      <<04886>>00940000
         END                                                   <<04820>>00942000
         ELSE                                                  <<04820>>00944000
         BEGIN                                                 <<04820>>00946000
            IF LOGBUFF(LOGTYPE) = DISC THEN                    <<04820>>00948000
            BEGIN                                              <<04820>>00950000
               ABNORMAL'EXIT := TRUE;                          <<04820>>00952000
               GO ABEXIT;                                      <<04820>>00954000
            END                                                <<04820>>00956000
            ELSE GO ABEXIT';                                   <<04820>>00958000
         END;                                                  <<04820>>00960000
      END;       << EOF on the log file >>                     <<04820>>00962000
   END;         << Error while stopping >>                     <<04820>>00964000
END;                                                           <<04820>>00966000
                                                               <<04820>>00968000
END;       << Subroutine CHECKMSG >>                           <<04820>>00970000
                                                               <<04820>>00972000
                                                               <<04820>>00974000
                                                               <<04820>>00976000
                                                               <<04820>>00978000
                                                                        00980000
                                                               <<01380>>00982000
SUBROUTINE FORMAT'TRAILER;                                     <<01380>>00984000
<< Outputs a trailer record padded by null records to fill out <<03568>>00986000
<< the block.                                                  <<03568>>00988000
                                                               <<01380>>00990000
                                                               <<01380>>00992000
BEGIN                                                          <<01380>>00994000
      DTEMP:=DLOGBUFF(TRECS)/DOUBLE(BLKFACTOR);                <<01380>>00996000
      DTEMP:=DTEMP*DOUBLE(BLKFACTOR);                          <<01380>>00998000
      J:=INTEGER(DLOGBUFF(TRECS)-DTEMP);                       <<01380>>01000000
      J:=BLKFACTOR-J;                                          <<01380>>01002000
      IF LOGBUFF(BSPACE) < LOGICAL(J)  THEN                    <<04820>>01004000
      BEGIN                                                    <<04820>>01006000
                                                               <<04820>>01008000
         << Not enough room in the buffer for the trailer   >> <<04820>>01010000
         << record. We need to flush it and then add the    >> <<04820>>01012000
         << trailer record.                                 >> <<04820>>01014000
                                                               <<04820>>01016000
         FLUSH(NULL);   << Tell it we are the log process   >> <<04820>>01018000
                                                               <<04820>>01020000
         CHECKMSG;                                             <<04820>>01022000
                                                               <<04820>>01024000
      END;                                                     <<04820>>01026000
                                                               <<04820>>01028000
      @BUF := BUFBASE + LOGBUFF(BUFUSED)*RECSIZE;              <<04820>>01030000
                                                               <<04820>>01032000
      @DBUF:=@BUF;                                             <<01380>>01034000
      @BBUF:=2*@BUF;                                           <<01380>>01036000
      BUF := "  ";                                             <<04820>>01038000
      MOVE BUF(1) := BUF, (LOGBUFF(BSPACE)*RECSIZE-1);         <<03568>>01040000
      BUF(CODE):=TRAILER;                                      <<04820>>01042000
      MOVE BBUF(LID') := BLOGBUFF(LOGID), (8);                 <<04886>>01044000
      LOGBUFF(BSPACE):=LOGBUFF(BSPACE)-LOGICAL(J);             <<01380>>01048000
      LOGBUFF(BUFUSED) := LOGBUFF(BUFUSED) + LOGICAL(J);       <<04820>>01050000
      DO                                                       <<01380>>01052000
      BEGIN                                                    <<01380>>01054000
         DBUF(RNUM):=DLOGBUFF(TRECS):=DLOGBUFF(TRECS)+1D;      <<01380>>01056000
         BUF(DATE):=CALENDAR;                                  <<01380>>01058000
         DBUF(TIME):=CLOCK;                                    <<01380>>01060000
         X := RECSIZEM1;                                       <<03568>>01062000
         TOS:=-1;                                              <<01380>>01064000
         DO                                                    <<01380>>01066000
         BEGIN                                                 <<01380>>01068000
            IF X <> CKSUM THEN                                 <<01380>>01070000
            TOS:=TOS XOR BUF(X);                               <<01380>>01072000
         END UNTIL (X:=X-1) < 0;                               <<01380>>01074000
         BUF(CKSUM):=TOS;                                      <<01380>>01076000
         @BUF := @DBUF := @BUF + RECSIZE;                      <<03568>>01078000
      END UNTIL (J:=J-1) <= 0;                                 <<00793>>01080000
                                                               <<04820>>01082000
   END;                                                        <<01380>>01084000
                                                               <<01380>>01086000
                                                               <<01380>>01088000
                                                               <<01380>>01090000
                                                                        01092000
SUBROUTINE CHECKRECORD;                                                 01094000
                                                                        01096000
                                                                        01098000
<< Validates the individual record format (passed by       >>  <<03568>>01100000
<< CHECKBLOCK) to see if it's in the format of a User      >>  <<03568>>01102000
<< Logging record.                                         >>  <<03568>>01104000
                                                                        01106000
BEGIN                                                                   01108000
   VALID:=TRUE;                                                         01110000
   TOS:=-1;                                                             01112000
   X := RECSIZEM1;                                             <<03568>>01114000
   DO                                                                   01116000
   BEGIN                                                                01118000
      IF X<>CKSUM THEN                                                  01120000
      TOS:=TOS XOR RECPTR(X);                                           01122000
   END UNTIL(X:=X-1)<0;                                                 01124000
   CURRREC:=CURRREC+1D;                                                 01126000
   IF ((TOS <> RECPTR(CKSUM)) OR (DRECPTR(RNUM) <> CURRREC))            01128000
   THEN VALID:=FALSE ELSE                                      <<00746>>01130000
   BEGIN                                                       <<00746>>01132000
      IF (RECPTR(CODE)=1) THEN                                 <<00746>>01134000
      IF LOGBUFF(USERNO)<=RECPTR(LNUM) THEN                    <<00746>>01136000
      LOGBUFF(USERNO):=RECPTR(LNUM)+1;                         <<00746>>01138000
      LAST'REC'CODE:=RECPTR(CODE);                             <<01380>>01140000
   END;                                                        <<00746>>01142000
END;                                                                    01144000
                                                                        01146000
                                                                        01148000
                                                                        01150000
                                                                        01152000
                                                                        01154000
SUBROUTINE CHECKBLOCK;                                                  01156000
                                                                        01158000
                                                                        01160000
<< Validates the block of Log records read while Restarting. >><<03568>>01162000
                                                                        01164000
                                                                        01166000
BEGIN                                                                   01168000
   VALID:=TRUE;                                                         01170000
   I:=0;                                                                01172000
   DO                                                                   01174000
   BEGIN                                                                01176000
      CHECKRECORD;                                                      01178000
      IF VALID THEN                                                     01180000
      BEGIN                                                             01182000
         @RECPTR := @RECPTR + RECSIZE;                         <<03568>>01184000
         @DRECPTR:=@RECPTR;                                             01186000
      END;                                                              01188000
   END UNTIL NOT VALID OR (I:=I+1)>=BLKFACTOR;                          01190000
END;                                                                    01192000
                                                                        01194000
                                                                        01196000
   SUBROUTINE WAKEUP';                                                  01198000
                                                                        01200000
                                                                        01202000
      <<WAKES UP ANY SLEEPING USERS PROCESSES AFTER A>>                 01204000
      <<REQUEST FOR SERVICE HAS BEEN COMPLETED       >>                 01206000
                                                                        01208000
                                                                        01210000
      BEGIN                                                             01212000
      <<ANYONE WAITING ?>>                                              01214000
                                                                        01216000
      INDEX:=LOGBUFF(UHEAD);                                            01218000
      WHILE LOGBUFF(SLPCT) > 0 DO                                       01220000
      BEGIN                                                             01222000
         <<WAKE UP EVERYBODY, IT'S A NEW DAY>>                          01224000
         IF LOGBUFF(WSTATE)=INACT THEN                                  01226000
         BEGIN                                                          01228000
            AWAKE(LOGBUFF(UPIN),%20,0);                                 01230000
            LOGBUFF(WSTATE):=ACT;                                       01232000
            LOGBUFF(SLPCT):=LOGBUFF(SLPCT)-1;                           01234000
         END;                                                           01236000
         INDEX:=LOGBUFF(NENTRY);                                        01238000
         IF INDEX = NULL THEN INDEX:=LOGBUFF(UHEAD);                    01240000
      END;                                                              01242000
      END;                                                              01244000
                                                                        01246000
                                                                        01248000
                                                                        01250000
                                                                        01252000
                                                                        01254000
SUBROUTINE FORMATRESTART;                                               01256000
                                                                        01258000
                                                                        01260000
   <<FORMATS A RESTART RECORD AND PLACES>>                              01262000
   <<IT IN THE OUTPUT BUFFER            >>                              01264000
                                                                        01266000
                                                                        01268000
BEGIN                                                                   01270000
                                                               <<04886>>01272000
   @BRECPTR := @RECPTR * 2;                                    <<04886>>01274000
   RECPTR := "  ";                                             <<04886>>01276000
   MOVE RECPTR(1) := RECPTR, ((BLKFACTOR-I)*RECSIZE-1);        <<03568>>01278000
   DRECPTR(RNUM):=CURRREC;                                              01280000
   RECPTR(CODE):=RSTART;                                                01282000
   MOVE BRECPTR(LID') := BLOGBUFF(LOGID), (8);                 <<04886>>01284000
   RECPTR(DATE):=CALENDAR;                                              01288000
   DRECPTR(TIME):=CLOCK;                                                01290000
   X:=RECSIZEM1;                                               <<03568>>01292000
   TOS:=-1;                                                             01294000
   DO                                                                   01296000
   BEGIN                                                                01298000
      IF X <> CKSUM THEN                                                01300000
      TOS:=TOS XOR RECPTR(X);                                           01302000
   END UNTIL (X:=X-1) < 0;                                              01304000
   RECPTR(CKSUM):=TOS;                                                  01306000
                                                               <<04820>>01308000
END;                                                                    01310000
                                                               <<03568>>01312000
                                                               <<03568>>01314000
                                                               <<03568>>01316000
SUBROUTINE GETFNAME;                                           <<03566>>01318000
                                                               <<03566>>01320000
<< Gets logging file name from the tables.  >>                 <<03566>>01322000
                                                               <<03566>>01324000
BEGIN                                                          <<03566>>01326000
                                                               <<03566>>01328000
   FNAME := 0;                                                 <<03566>>01330000
   MOVE FNAME(1) := FNAME, (35);                               <<04886>>01332000
                                                               <<03566>>01334000
   FENTRY(BENTRY'(LGNAME),,FNAME);                             <<03566>>01336000
                                                               <<03566>>01338000
   IF ENTRY'(LGTYPE) <> DISC  THEN FNAME(8) := 0;              <<03572>>01340000
                                                               <<03566>>01342000
                                                               <<03566>>01344000
END;                                                           <<03566>>01346000
                                                                        01348000
                                                                        01350000
SUBROUTINE ABEND(MSG',TYPE);                                   <<04886>>01352000
   VALUE MSG',TYPE;                                            <<04886>>01354000
   INTEGER MSG',TYPE;                                          <<04886>>01356000
                                                               <<03568>>01358000
<< Called if the User Logging Process cannot complete the   >> <<03568>>01360000
<< initialization of the Logging Buffer and must terminate. >> <<03568>>01362000
                                                               <<03568>>01364000
BEGIN                                                          <<03568>>01366000
   RELENTRY(TABINDEX',0);    <<Release LOGTAB entry>>          <<03568>>01368000
   FCLOSE(FILENO,0,0);       <<Save log file>>                 <<03568>>01370000
   IF TYPE <> DISC THEN FCLOSE(BUFFILENO,4,0); <<Delete buff>> <<03572>>01372000
   RELSIR(LOGSIR,A);                                           <<03568>>01374000
   GENMSG(SETNO,MSG',0,@PROCNAME,,,,,0);                       <<04888>>01376000
   IF RESTART' THEN                                            <<03569>>01378000
       MSGNO := CANTRESTART                                    <<03569>>01380000
   ELSE MSGNO := CANTSTART;                                    <<03569>>01382000
   GO OUT;                                                     <<03568>>01384000
END;                                                           <<03568>>01386000
                                                               <<03568>>01388000
                                                               <<03568>>01390000
SUBROUTINE ABEND'(MSG',FNUM,TYPE);                             <<04888>>01392000
   VALUE MSG',FNUM,TYPE;                                       <<04888>>01394000
   INTEGER MSG',FNUM,TYPE;                                     <<04888>>01396000
                                                               <<03568>>01400000
<< Called if the User Logging Process cannot complete the   >> <<03568>>01402000
<< initialization of the Logging Buffer and must terminate. >> <<03568>>01404000
<< Will also print out the F.S. error encountered.           >><<04888>>01406000
<< DB is at the stack.                                       >><<04888>>01408000
                                                               <<04888>>01410000
BEGIN                                                          <<03568>>01412000
   RELENTRY(TABINDEX',0);    <<Release LOGTAB entry>>          <<03568>>01414000
   FCHECK(FNUM,ERRCODE);                                       <<04888>>01416000
                                                               <<04888>>01418000
   FCLOSE(FILENO,0,0);       <<Save log file>>                 <<03568>>01420000
   IF TYPE <> DISC THEN FCLOSE(BUFFILENO,4,0); <<Delete buff>> <<03572>>01422000
   RELSIR(LOGSIR,A);                                           <<03568>>01424000
   GENMSG(FSSETNO,ERRCODE,,,,,,,0);                            <<04888>>01426000
   GENMSG(SETNO,MSG',0,@PROCNAME,,,,,0);                       <<04888>>01428000
   IF RESTART' THEN                                            <<03569>>01430000
       MSGNO := CANTRESTART                                    <<03569>>01432000
   ELSE MSGNO := CANTSTART;                                    <<03569>>01434000
   GO OUT;                                                     <<03568>>01436000
END;                                                           <<03568>>01438000
                                                                        01440000
                                                                        01442000
RESTART':=FALSE;                                                        05000000
GO OVER;                                                                05002000
                                                               <<03568>>05004000
RESTART:                                                                05006000
RESTART':=TRUE;                                                         05008000
DONE:=FALSE;                                                            05010000
                                                               <<03568>>05012000
OVER:                                                                   05014000
                                                               <<04886>>05016000
<< Turn traps off  >>                                          <<04886>>05018000
                                                               <<04886>>05020000
ASSEMBLE(PSHR %10);                                                     05022000
TOS.(2:1):=0;                                                           05024000
ASSEMBLE(SETR %10);                                                     05026000
                                                               <<04886>>05028000
                                                               <<04886>>05030000
DB:=-1;                                                                 05032000
NOTIFIED:=FALSE;                                                        05034000
ABNORMAL'EXIT:=FALSE;                                          <<01432>>05036000
FORMATTED'TRAILER := FALSE;                                    <<04820>>05038000
FREE'LAST'EXTENT := FALSE;                                     <<04820>>05040000
INDEX:=0;                                                               05042000
A:=GETSIR(LOGSIR);                                                      05044000
MOVE'FROM'DSEG(@ENTRY',LOGDST,TABINDEX',TENTRYSIZE);           <<03567>>05046000
TABINDEX:=0;         <<SET TABINDEX FOR TEMP ENTRY JUST READ>>          05048000
MOVE PROCNAME:=BENTRY'(LOGID),(8);                                      05050000
PROCNAME(8):=0;                                                         05052000
                                                               <<03566>>05054000
IF ENTRY'(LGTYPE) <> DISC  THEN                                <<03572>>05056000
BEGIN                        << Serial log file - file opens >><<03572>>05058000
   CASE ENTRY'(LGTYPE)  OF                                     <<03572>>05060000
   BEGIN                                                       <<03572>>05062000
      <<0>>  ;         << Disc - never get here >>             <<03572>>05064000
      <<1>>  MOVE DEV := "TAPE ";                              <<03572>>05066000
      <<2>>  MOVE DEV := "SDISC ";                             <<03572>>05068000
      <<3>>  MOVE DEV := "CTAPE ";                             <<03572>>05070000
   END;                                                        <<03572>>05072000
                                                               <<03572>>05074000
   GETFNAME;                                                   <<03566>>05076000
   MOVE FORMS:=".,,,,; ";                                               05078000
                                                               <<04886>>05080000
   << Log file is ascii,fixed labeled tape (no :FILE),default>><<04886>>05082000
   << access, read/write, no multi-rec, no buf.              >><<04886>>05084000
                                                               <<04886>>05086000
   FILENO := FOPEN(FNAME,%3004,%404,RECSIZE,DEV,FORMS,,        <<04886>>05088000
                   BLKFACTOR);                                 <<03568>>05090000
   IF <> THEN                               <<OPEN FAILURE ?>>          05092000
   BEGIN                                                                05094000
      RELENTRY(TABINDEX',0);                                   <<00720>>05096000
      RELSIR(LOGSIR,A);                                        <<04164>>05098000
      FCHECK(FILENO,ERRCODE);                                  <<04888>>05100000
      GENMSG(FSSETNO,ERRCODE,,,,,,,0);                         <<04888>>05102000
      GENMSG(SETNO,TOPENFAILED,0,@PROCNAME,,,,,0);             <<04888>>05104000
                                                               <<00720>>05106000
      IF RESTART' THEN                                         <<03569>>05108000
         MSGNO := CANTRESTART                                  <<03569>>05110000
      ELSE MSGNO := CANTSTART;                                 <<03569>>05112000
      GO OUT;                                                           05114000
   END;                                                                 05116000
   FFILEINFO(FILENO, 6,TAPEDEV);                               <<04163>>05118000
   IF < THEN                                                   <<04163>>05120000
   BEGIN                                                       <<04163>>05122000
      RELENTRY(TABINDEX',0);                                   <<04163>>05124000
      RELSIR(LOGSIR,A);                                        <<04163>>05126000
      IF RESTART'                                              <<04163>>05128000
         THEN  MSGNO := CANTRESTART  ELSE MSGNO := CANTRESTART;<<04163>>05130000
      FCHECK(FILENO,ERRCODE);                                  <<04888>>05132000
      GENMSG(FSSETNO,ERRCODE,,,,,,,0);                         <<04888>>05134000
      GENMSG(SETNO,TOPENFAILED,0,@PROCNAME,,,,,0);             <<04888>>05136000
      GO OUT;                                                  <<04888>>05138000
   END;                                                        <<04163>>05140000
                                                               <<04163>>05142000
   << If we're doing a log start to tape, then we want to do >><<04163>>05144000
   << a dummy write to force the HDR labels to be written    >><<04163>>05146000
   << now. This must be done to protect ourselves from a     >><<04163>>05148000
   << powerfail before the HDRs get to tape. The labeled tape>><<04163>>05150000
   << interface will never tell the F.S. if it got powerfail,>><<04163>>05152000
   << therefore if we wait until we start flushing buffers to>><<04163>>05154000
   << tape we will never know if there was a powerfail, and  >><<04163>>05156000
   << would never be able to recover. By performing an FWRITE>><<04163>>05158000
   << now, if we get any error at all, we will not let the   >><<04163>>05160000
   << process start.                                         >><<04163>>05162000
                                                               <<04163>>05164000
   IF ENTRY'(LGTYPE) = TAPE  AND  (NOT RESTART')  THEN         <<04163>>05166000
   BEGIN                                                       <<04163>>05168000
      COUNT := 0;                                              <<04163>>05170000
      FWRITE(FILENO,BUFFAREA,COUNT,NORMAL'WRITE);              <<04163>>05172000
      IF <> THEN                                               <<04163>>05174000
      BEGIN                                                    <<04163>>05176000
         RELENTRY(TABINDEX',0);                                <<04164>>05178000
         RELSIR(LOGSIR,A);                                     <<04164>>05180000
         MSGNO := CANTSTART;                                   <<04163>>05182000
         FCLOSE(FILENO,0,0);                                   <<04163>>05184000
         FCHECK(FILENO,ERRCODE);                               <<04888>>05186000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>05188000
         GENMSG(SETNO,TOPENFAILED,0,@PROCNAME,,,,,0);          <<04888>>05190000
         GO OUT;                                               <<04888>>05192000
      END;                                                     <<04163>>05194000
   END;                                                        <<04163>>05196000
                                                               <<04163>>05198000
                                                                        05200000
   <<OPEN DISC BUFFER>>                                                 05202000
                                                                        05204000
   MOVE BFNAME:="  ";                                                   05206000
   MOVE BFNAME(1):=BFNAME,(14);                                         05208000
   MOVE DEV:="DISC ";                                          <<03572>>05210000
                                                               <<04886>>05212000
   << Format the disc buffer name -- ULOGxxxx.PUB.SYS >>       <<04886>>05214000
                                                               <<04886>>05216000
   MOVE BFNAME:=BENTRY'(BNAME),(8);            <<BUFFER NAME>>          05218000
   MOVE'FROM'DSEG(@TEMP,LOGDST,BUFNUM,1);                      <<03567>>05220000
   TEMP:=TEMP+1;                                               <<00793>>05222000
   IF TEMP > 9999 THEN TEMP := 0;   << Max of 4 chars >>       <<03568>>05224000
   MOVE'TO'DSEG(LOGDST,BUFNUM,@TEMP,1);                        <<03567>>05226000
                                                               <<04886>>05228000
   <<FORMAT BUFFER FILE NAME>>                                          05230000
   MOVE BFNAME(4):=ZEROS,(4);                                  <<00793>>05232000
   NUMCHAR:=ASCII(TEMP,-10,BFNAME(7));                         <<00793>>05234000
                                                               <<00793>>05236000
   MOVE BFNAME(8):=".PUB.SYS ";                                         05238000
   MOVE BENTRY'(BNAME):=BFNAME,(8);                                     05240000
                                                                        05242000
   <<OPEN BUFFER FILE>>                                                 05244000
                                                                        05246000
                                                               <<04886>>05248000
   << Buffer file: ascii, new, fixed, no :FILE, read/write, >> <<04886>>05250000
   << multi-rec, no buf, exc.                               >> <<04886>>05252000
                                                               <<04886>>05254000
   BUFFILENO := FOPEN(BFNAME,%2004,%524,RECSIZE,DEV,,,,,       <<04886>>05256000
                      640D,1,1);                               <<04886>>05258000
   IF <> THEN ABEND'(BOPENFAILED,BUFFILENO,TAPE);              <<04888>>05260000
                                                                        05262000
   FCLOSE(BUFFILENO,1,0);              <<MAKE BUFFER FILE PERM>>        05264000
   IF <> THEN ABEND'(BOPENFAILED,BUFFILENO,TAPE);              <<04888>>05266000
                                                               <<04886>>05268000
   BUFFILENO := FOPEN(BFNAME,%2005,%524,RECSIZE,DEV);          <<04886>>05270000
   IF <> THEN ABEND'(BOPENFAILED,BUFFILENO,TAPE);              <<04888>>05272000
                                                               <<04886>>05274000
   FWRITEDIR(BUFFILENO,BUFFAREA,RECSIZE,639D);                 <<03568>>05276000
   IF <> THEN ABEND'(BWRITEERROR,BUFFILENO,TAPE);              <<04888>>05278000
                                                               <<04886>>05280000
   FCONTROL(BUFFILENO,6,A);                <<WRITE END OF FILE>>        05282000
   IF <> THEN ABEND'(BWRITEERROR,BUFFILENO,TAPE);              <<04888>>05284000
                                                               <<04886>>05286000
   FGETINFO(BUFFILENO,,,,,,ENTRY'(LGDEV),,,,,LIMIT,,,,,,,,ADDR);        05288000
   IF <> THEN ABEND'(BWRITEERROR,BUFFILENO,TAPE);              <<04888>>05290000
                                                               <<04886>>05292000
   DTEMP:=LIMIT;                                               <<01432>>05294000
                                                                        05296000
   <<GET SECTOR OFFSET>>                                                05298000
                                                                        05300000
   <<READ FILE LABEL>>                                                  05302000
                                                                        05304000
   ATT'STAT:=ATTACHIO(ENTRY'(LGDEV),QMISC,0,@BUFFAREA,READ,    <<04888>>05306000
                   RECSIZE,ADDR1.(8:8),ADDR2,FLAGS);           <<03568>>05308000
   IF ATT'STAT0.(13:3) <> SUCCESS THEN ABEND(BWRITEERROR,TAPE);<<04888>>05310000
                                                               <<04886>>05312000
   ADDR1:=ADDR1.(8:8);                                                  05314000
    ADDR:=ADDR+DOUBLE(BUFFAREA(39).(0:8));                              05316000
   DENTRY'(LGADDR):=ADDR;                                               05318000
   NUMEXT := 1;                                                <<04820>>05320000
END                                                                     05322000
ELSE                                                                    05324000
BEGIN                                      <<LOGGING TO DISC>>          05326000
   MOVE DEV:="DISC ";                                                   05328000
   GETFNAME;                                                   <<03566>>05330000
                                                                        05332000
   <<OPEN USERS DISC LOGGING FILE>>                                     05334000
                                                                        05336000
   FILENO := FOPEN(FNAME,%5,%624,RECSIZE,DEV,,,BLKFACTOR);     <<03568>>05338000
   IF <> THEN                                                           05340000
   BEGIN                                                                05342000
      RELSIR(LOGSIR,A);                                                 05344000
      RELENTRY(TABINDEX',0);                                            05346000
      FCHECK(FILENO,ERRCODE);                                  <<04888>>05348000
      GENMSG(FSSETNO,ERRCODE,,,,,,,0);                         <<04888>>05350000
      GENMSG(SETNO,UOPENFAILED,0,@PROCNAME,,,,,0);             <<04888>>05352000
      IF RESTART' THEN                                         <<03569>>05354000
          MSGNO := CANTRESTART                                 <<03569>>05356000
        ELSE MSGNO := CANTSTART;                               <<03569>>05358000
      GO OUT;                                                           05360000
   END;                                                                 05362000
                                                                        05364000
   <<PICK UP FILE ADDRESS INFO>>                                        05366000
                                                                        05368000
   FGETINFO(FILENO,,,,,,ENTRY'(LGDEV),,,,,                     <<03568>>05370000
         LIMIT,,,,EXTSIZE,NUMEXT,,,ADDR);                               05372000
   IF <> THEN ABEND'(FWRITEERROR,FILENO,DISC);                 <<04888>>05374000
                                                               <<04886>>05376000
   ADDR1:=ADDR1.(8:8);                                                  05378000
   TOS:=FLABIO(ENTRY'(LGDEV),ADDR,0,FLAB);                              05380000
   IF TOS <> 0 THEN ABEND(FLABELERR,DISC);                     <<04888>>05382000
                                                               <<04886>>05384000
   IF (DFLAB(EOF) <> 0D) AND (NOT RESTART')                    <<03568>>05386000
     THEN ABEND(NOTEMPTY,DISC);      << Can't start >>         <<04888>>05388000
                                                               <<04886>>05390000
   IF RESTART' AND (DFLAB(EOF) >= DFLAB(FLIMIT) - 1D)          <<04820>>05392000
     THEN ABEND(LOGFILEEOF,DISC);                              <<04888>>05394000
                                                               <<04886>>05396000
      RELSIR(LOGSIR,A);                                                 05398000
                                                               <<04886>>05400000
   IF FLAB(FCODE) <> LOG THEN ABEND'(INVALIDFILE,FNAME,DISC);  <<03568>>05402000
                                                               <<04886>>05404000
   IF FLAB(FBLKSIZE) <> BLKSIZE                                <<03568>>05406000
     THEN ABEND(INVALIDFILE,DISC);                             <<04888>>05408000
                                                               <<04886>>05410000
   IF DFLAB(FLIMIT) <= DOUBLE(BLKFACTOR)                       <<03568>>05412000
     THEN ABEND(TOOSMALL,DISC);     <<File too small>>         <<04888>>05414000
                                                               <<03568>>05416000
   << Calculate the useable # records in the first extent.  >> <<03568>>05418000
   << The first block will be used up by the file label.    >> <<03568>>05420000
                                                               <<03568>>05422000
   DTEMP := DOUBLE(EXTSIZE - BLKFACTOR);                       <<03568>>05424000
                                                               <<03568>>05426000
   << Want to leave the last record of the last extent free,>> <<04820>>05428000
   << for now, to insure there will be room in the file so  >> <<03568>>05430000
   << proper close information can get posted.              >> <<03568>>05432000
                                                               <<03568>>05434000
   IF NUMEXT = 1 THEN                                          <<03568>>05436000
   BEGIN           << Last extent >>                           <<03568>>05438000
      DTEMP := DTEMP - 1D;                                     <<04820>>05440000
                                                               <<03568>>05442000
      << Check to see if there's room to do this.           >> <<03568>>05444000
      IF DTEMP <= 0D  THEN ABEND(TOOSMALL,DISC);               <<04888>>05446000
   END;                                                        <<03568>>05448000
                                                               <<03568>>05450000
                                                               <<03568>>05452000
   IF NOT RESTART' THEN                                                 05454000
   BEGIN                                                                05456000
      << Allocate the first extent to be used for data.      >><<03568>>05458000
      << Calculate the last block number in the extent -     >><<03568>>05460000
      << move the EOF ptr. here.  (FWRITEDIR, FCONTROL)      >><<03568>>05462000
                                                               <<03568>>05464000
      BLOCKNUM := DOUBLE((EXTSIZE-BLKFACTOR)/BLKFACTOR) -1D;   <<03568>>05466000
      IF BLOCKNUM < 0D  THEN BLOCKNUM := 0D;                   <<03568>>05468000
                                                               <<03568>>05470000
      FWRITEDIR(FILENO,BUFFAREA,RECSIZE,BLOCKNUM);             <<03568>>05472000
      IF <> THEN ABEND'(FWRITEERROR,FILENO,DISC);              <<04888>>05474000
      FCONTROL(FILENO,6,A);                                             05476000
      IF <> THEN ABEND'(FWRITEERROR,FILENO,DISC);              <<04888>>05478000
   END;                                                                 05480000
                                                               <<03568>>05482000
   EXTNUM:=1;                                                           05484000
   <<Get ldev #, sector number for this extent>>               <<03568>>05486000
   ADDR:=DFLAB(21+EXTNUM);                                              05488000
   <<Erase ldev #>>                                            <<03568>>05490000
   ADDR1:=ADDR1.(8:8);                                                  05492000
   DENTRY'(LGADDR):=ADDR;                                               05494000
                   <<Calculate sector offset to data>>         <<03568>>05496000
   IF NOT RESTART' THEN ADDR:=ADDR+DOUBLE(FLAB(39).(0:8));              05498000
 <<Done preparing log file for disc logging>>                  <<03568>>05500000
END;                                                                    05502000
                                                                        05504000
<<CREATE LOGGING DATA SEGMENT>>                                         05506000
                                                                        05508000
MOVE'FROM'DSEG(@MAXUSERS,LOGDST,MAX'USR'PROC,1);               <<04886>>05510000
<< If max users is zero, then can't let anyone start the Proc>><<03568>>05512000
                                                               <<03568>>05514000
IF MAXUSERS <= 0 THEN  ABEND(BAD'USER'COUNT,ENTRY'(LGTYPE));   <<04888>>05516000
                                                               <<03568>>05518000
LEN:=BLKSIZE+MAXUSERS*BENTRYSIZE+BENTRYBASE;                            05520000
ENTRY'(DST):=BUFDST:=GETDATASEG(LEN,LEN);                               05522000
   IF ENTRY'(DST) = 0                                          <<03568>>05524000
     THEN ABEND(NODSEG,ENTRY'(LGTYPE));    <<No seg.>>         <<04888>>05526000
                                                                        05528000
ENTRY'(PIN) := MYPIN;       << Pin number of logging process >><<04162>>05530000
                                                                        05532000
<<NOW WRITE ENTRY BACK TO MASTER LOGGING DATA SEGMENT>>                 05534000
                                                                        05536000
MOVE'TO'DSEG(LOGDST,TABINDEX',@ENTRY',TENTRYSIZE-2);           <<03567>>05538000
                                                                        05540000
<<INITIALIZE LOGGING DATA SEGMENT>>                                     05542000
                                                                        05544000
<<SET UP GLOBAL AND COMMUNICATIONS AREA>>                               05546000
                                                               <<04886>>05548000
DB:=EXCHANGEDB(ENTRY'(DST));                                            05550000
                                                               <<04886>>05552000
LOGBUFF := 0;                                                  <<04886>>05554000
MOVE LOGBUFF(1):=LOGBUFF, (BENTRYBASE+MAXUSERS*BENTRYSIZE-1);  <<04886>>05556000
                                                               <<04886>>05558000
<< First get the logid >>                                      <<04886>>05560000
                                                               <<04886>>05562000
MOVE LOGBUFF:="  ";                                            <<01432>>05564000
TOS := BUFDST;        << Dst of LOGBUFF >>                     <<04886>>05566000
TOS := LOGID/2;       << Word offset into LOGBUFF >>           <<04886>>05568000
TOS := LOGDST;        << Source DST - LOGTAB >>                <<04886>>05570000
TOS := LGNAME/2 + TABINDEX';    << Word offset in LOGTAB >>    <<04886>>05572000
TOS := 4;             << Count >>                              <<04886>>05574000
ASSEMBLE (MDS 5);                                              <<04886>>05576000
                                                               <<04886>>05578000
                                                               <<04886>>05580000
DLOGBUFF(RESOURCE):=0D;                                                 05582000
DLOGBUFF(INBUFREC):=0D;                                                 05584000
DLOGBUFF(LOGADDR):=ADDR;                                                05586000
LOGBUFF(AUTO) := ENTRY'(LGAUTO);                               <<04886>>05588000
LOGBUFF(LOGTYPE):=ENTRY'(LGTYPE);                                       05590000
LOGBUFF(NEWAUTO) := ENTRY'(LGNEWAUTO);                         <<04886>>05592000
LOGBUFF(NEWTYPE) := ENTRY'(LGNEWTYPE);                         <<04886>>05594000
LOGBUFF(SWITCH') := ENTRY'(LGSWITCH);                          <<04886>>05596000
LOGBUFF(STATE):=INACT;                                                  05598000
LOGBUFF(NUMUSER):=0;                                                    05600000
LOGBUFF(LOGDEV):=ENTRY'(LGDEV);                                         05602000
DLOGBUFF(FSIZE):=DTEMP;                                        <<01432>>05604000
DLOGBUFF(MAXFSPACE) := LIMIT - 1D;                             <<04820>>05606000
DLOGBUFF(FSPACE'):=DENTRY'(BSIZE):=DTEMP;                      <<01432>>05608000
LOGBUFF(BSPACE):=BLKFACTOR;                                             05610000
LOGBUFF(SLPCT):=0;                                                      05612000
LOGBUFF(USERNO):=0;                                                     05614000
LOGBUFF(LOGPIN) := ENTRY'(PIN) := MYPIN;                       <<04162>>05616000
DLOGBUFF(TRECS):=0D;                                                    05618000
LOGBUFF(UHEAD):=NULL;                                                   05620000
LOGBUFF(FHEAD):=BENTRYBASE;                                             05622000
LOGBUFF(LOGERR):=0;                                                     05624000
LOGBUFF(MSG):=0;                                                        05626000
LOGBUFF(USERMSG):=CONTINUE;                                    <<04886>>05628000
LOGBUFF(LOGMSG):=CONTINUE;                                     <<04886>>05630000
LOGBUFF(MAXUSER') := MAXUSERS;                                 <<04886>>05632000
LOGBUFF(LASTEXT'):=NUMEXT;                                     <<01380>>05634000
LOGBUFF(BDST):=ENTRY'(DST);                                    <<01380>>05636000
OUTBUFREC:=0D;                                                          05638000
LOGBUFF(EXTENT):=1;                                            <<01432>>05640000
LOGBUFF(BUFUSED) := 0;                                         <<04820>>05642000
LOGBUFF(VSETNO) := 0;                                          <<04886>>05644000
                                                                        05646000
<<NOW SET UP ENTRIES>>                                                  05648000
                                                               <<04886>>05650000
LOGBUFF(BENTRYBASE) := "  ";                                   <<04886>>05652000
MOVE LOGBUFF(BENTRYBASE+1) := LOGBUFF(BENTRYBASE),             <<04886>>05654000
                              (MAXUSERS*BENTRYSIZE-1);         <<04886>>05656000
                                                               <<04886>>05658000
TEMP:=NULL;                                                             05660000
                                                                        05662000
I:=0;                                                                   05664000
DO                                                                      05666000
BEGIN                                                                   05668000
   INDEX:=BENTRYBASE+I*BENTRYSIZE;                                      05670000
   LOGBUFF(PENTRY):=TEMP;                                               05672000
   LOGBUFF(NENTRY):=INDEX+BENTRYSIZE;                                   05674000
   TEMP:=INDEX;                                                         05676000
END UNTIL LOGICAL(I:=I+1) = MAXUSERS;                                   05678000
                                                               <<03568>>05680000
LOGBUFF(NENTRY):=NULL;                                                  05682000
INDEX:=0;                                                               05684000
TOS:=OBTAIN(DLOGBUFF(RESOURCE),NULL);                                   05686000
DEL;                                                                    05688000
RESFLAG:=TRUE;                                                 <<00728>>05690000
RELSIR(LOGSIR,A);                                                       05692000
@BUF:=BUFBASE;                                                          05694000
@BBUF:=2*@BUF;                                                          05696000
                                                               <<04886>>05698000
<< Clear the buffer area >>                                    <<04886>>05700000
                                                               <<04886>>05702000
BUF := "  ";                                                   <<04886>>05704000
MOVE BUF(1):=BUF,(BLKSIZE-1);                                           05706000
                                                               <<04886>>05708000
<< Now set up pointer to area to format the header record >>   <<04886>>05710000
                                                               <<04886>>05712000
@BUF:=BUFBASE+(BLKFACTOR-LOGBUFF(BSPACE))*RECSIZE;             <<03568>>05714000
@DBUF:=@BUF;                                                            05716000
                                                               <<04886>>05718000
IF NOT RESTART' THEN                                                    05720000
BEGIN                                                                   05722000
   << Format a log start (header) record.          >>          <<04886>>05724000
                                                               <<04886>>05726000
   BUF(CODE):=HEADER;                                                   05728000
   DBUF(RNUM):=DLOGBUFF(TRECS):=DLOGBUFF(TRECS)+1D;                     05730000
   BUF(DATE):=CALENDAR;                                                 05732000
   DBUF(TIME):=CLOCK;                                                   05734000
   MOVE BBUF(LID') := BLOGBUFF(LOGID), (8);                    <<04886>>05736000
                                                               <<03567>>05738000
   X:=RECSIZEM1;                                               <<03568>>05740000
   TOS:=-1;                                                             05742000
   DO                                                                   05744000
   BEGIN                                                                05746000
      IF X <> CKSUM THEN                                                05748000
      TOS:=TOS XOR BUF(X);                                              05750000
   END UNTIL (X:=X-1) < 0;                                              05752000
   BUF(CKSUM):=TOS;                                                     05754000
   LOGBUFF(BSPACE):=LOGBUFF(BSPACE)-1;                                  05756000
   LOGBUFF(BUFUSED) := LOGBUFF(BUFUSED) + 1;                   <<04820>>05758000
END;                                                                    05760000
                                                               <<04886>>05762000
IF RESTART' THEN                                                        05764000
BEGIN                                                                   05766000
   << Re-read file to see where we left off, format a log    >><<04886>>05768000
   << restart record, and then we're ready to go again.      >><<04886>>05770000
                                                               <<04886>>05772000
   EOFORERR:=FALSE;                                                     05774000
   CURRREC:=0D;                                                         05776000
   LASTREC:=0D;                                                         05778000
   DO                                                                   05780000
   BEGIN                                                                05782000
   <<READ AND CHECK OLD INFO IN FILE>>                                  05784000
      @RECPTR:=@BUF;                                                    05786000
      @DRECPTR:=@BUF;                                                   05788000
      COUNT:=FREAD(FILENO,BUF,BLKSIZE);                                 05790000
      IF <> THEN                                                        05792000
      BEGIN                                                             05794000
         IF < THEN  <<ERROR READING>>                                   05796000
         BEGIN                                                          05798000
            FCHECK(FILENO,ERRCODE);                                     05800000
            FSPACE(FILENO,-1);                                          05802000
            DB:=EXCHANGEDB(0);                                          05804000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>05806000
            GENMSG(SETNO,READERR,0,@PROCNAME,,,,,0);           <<04888>>05808000
            DB:=EXCHANGEDB(DB);                                         05810000
         END;                                                           05812000
      EOFORERR:=TRUE;                                                   05814000
      END;                                                              05816000
      CHECKBLOCK;                                                       05818000
      IF VALID THEN                                                     05820000
      BEGIN                                                             05822000
         @RECPTR:=@RECPTR-RECSIZE;                             <<03568>>05824000
         @DRECPTR:=@RECPTR;                                             05826000
         LASTREC:=DRECPTR(RNUM);                                        05828000
      END                                                               05830000
                                                               <<04886>>05832000
      ELSE                                                              05834000
      IF (NOT EOFORERR) AND (LAST'REC'CODE <> TRAILER) THEN    <<01380>>05836000
      BEGIN                                                             05838000
         DB:=EXCHANGEDB(DB);                                            05840000
         FSPACE(FILENO,-1);                                    <<00793>>05842000
         GENMSG(SETNO,READERR,0,@PROCNAME,,,,,0);              <<04888>>05844000
         DB:=EXCHANGEDB(DB);                                            05846000
      END;                                                              05848000
   END UNTIL EOFORERR OR NOT VALID;                                     05850000
                                                               <<04886>>05852000
   FORMATRESTART;                                                       05854000
   IF ENTRY'(LGTYPE) = DISC THEN                                        05856000
   BEGIN                                                                05858000
      << For disc we must now allocate the next extent and   >><<04886>>05860000
      << set EOF there to protect ourselves from system      >><<04886>>05862000
      << crash.                                              >><<04886>>05864000
                                                               <<04886>>05866000
      EXTNUM:=INTEGER((((LASTREC/DOUBLE(BLKFACTOR)+1D)/                 05868000
              DOUBLE(EXTSIZE/BLKFACTOR))))+1;                           05870000
                                                               <<04820>>05872000
      << Remember when calculating INBUFREC (offset into the >><<04820>>05874000
      << current extent for the next writes), to add 1 extra >><<04820>>05876000
      << block (for the FLAB).                               >><<04820>>05878000
                                                               <<04820>>05880000
      DLOGBUFF(INBUFREC) := (LASTREC+DOUBLE(EXTSIZE+BLKFACTOR))<<04820>>05882000
                            -DOUBLE(EXTNUM)*DOUBLE(EXTSIZE);   <<04820>>05884000
      DLOGBUFF(FSPACE') := DOUBLE(EXTNUM)*DOUBLE(EXTSIZE)      <<04820>>05886000
                           -DOUBLE(BLKFACTOR)-LASTREC;         <<04820>>05888000
      IF EXTNUM = NUMEXT THEN                                  <<04820>>05890000
      BEGIN                                                    <<04820>>05892000
         << We must reserve the last record of this extent so>><<04820>>05894000
         << the proper close info can be posted to the file. >><<04820>>05896000
                                                               <<04820>>05898000
         DLOGBUFF(FSPACE') := DLOGBUFF(FSPACE') - 1D;          <<04820>>05900000
         DLOGBUFF(FSIZE) := DOUBLE(FLAB(LASTEXT)) - 1D;        <<04820>>05902000
      END                                                      <<04820>>05904000
      ELSE DLOGBUFF(FSIZE) := DOUBLE(EXTSIZE);                 <<04820>>05906000
                                                               <<04820>>05908000
      DTEMP:=CURRREC/DOUBLE(BLKFACTOR);                        <<01380>>05910000
      LOGBUFF(BUFUSED) := INTEGER(CURRREC - (DTEMP *           <<04820>>05912000
                                  DOUBLE(BLKFACTOR)));         <<04820>>05914000
      LOGBUFF(BSPACE) := BLKFACTOR - LOGBUFF(BUFUSED);         <<04820>>05916000
                                                               <<04820>>05918000
      << If this is the last block of the last extent, then  >><<04820>>05920000
      << save the last record for proper close information.  >><<04820>>05922000
                                                               <<04820>>05924000
      IF EXTNUM = NUMEXT AND                                   <<04820>>05926000
         DLOGBUFF(FSPACE') <= DOUBLE(BLKFACTOR)                <<04820>>05928000
        THEN LOGBUFF(BSPACE) := LOGBUFF(BSPACE) - 1;           <<04820>>05930000
                                                               <<04820>>05932000
                                                               <<03568>>05934000
      << Allocate the extent, and set EOF to end of extent. >> <<03568>>05936000
                                                               <<03568>>05938000
      BLOCKNUM := DOUBLE(EXTNUM * (EXTSIZE/BLKFACTOR)) - 2D;   <<03568>>05940000
      IF EXTNUM = NUMEXT    << Last extent may be different >> <<03568>>05942000
         THEN BLOCKNUM := BLOCKNUM + (DOUBLE(FLAB(LASTEXT)) -  <<04820>>05944000
                          DOUBLE(EXTSIZE))/DOUBLE(BLKFACTOR);  <<03568>>05946000
                                                               <<03568>>05948000
      DLOGBUFF(TRECS):=CURRREC;                                <<04286>>05950000
      DB:=EXCHANGEDB(0);   << Back to stack >>                 <<04286>>05952000
                                                               <<04286>>05954000
      FWRITEDIR(FILENO,BUFFAREA,BLKSIZE,BLOCKNUM);             <<03568>>05956000
      IF <> THEN                                               <<04888>>05958000
      BEGIN        <<Error writing to disc>>                   <<03568>>05960000
         IF RESFLAG  THEN                                      <<04286>>05962000
         BEGIN                                                 <<04286>>05964000
            DB := EXCHANGEDB(DB);   << Back to LOGBUFF >>      <<04286>>05966000
            RELEASE(DLOGBUFF(RESOURCE),NULL,1);                <<04286>>05968000
            DB := EXCHANGEDB(DB);   << Back to stack >>        <<04286>>05970000
         END;                                                  <<04286>>05972000
                                                               <<04286>>05974000
         RELENTRY(TABINDEX',0);                                <<03568>>05976000
         FCHECK(FILENO,ERRCODE);                               <<04888>>05978000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>05980000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>05982000
         MSGNO := CANTRESTART;                                 <<04164>>05984000
         RELDATASEG(BUFDST);                                   <<03568>>05986000
         GO OUT;                                               <<03568>>05988000
      END;         <<Error writing to disc>>                   <<03568>>05990000
                                                               <<00781>>05992000
         FCONTROL(FILENO,6,A); <<WRITE END OF FILE>>           <<00781>>05994000
      IF < THEN         <<Failed to write EOF>>                <<03568>>05996000
      BEGIN                                                    <<03568>>05998000
         IF RESFLAG THEN                                       <<04164>>06000000
         BEGIN                                                 <<04164>>06002000
            DB := EXCHANGEDB(DB);   << Back to LOGBUFF >>      <<04164>>06004000
            RELEASE(DLOGBUFF(RESOURCE),NULL,1);                <<04164>>06006000
            DB := EXCHANGEDB(DB);   << Back to stack   >>      <<04164>>06008000
         END;                                                  <<04164>>06010000
         RELENTRY(TABINDEX',0);                                <<03568>>06012000
         FCHECK(FILENO,ERRCODE);                               <<04888>>06014000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>06016000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>06018000
         MSGNO := CANTRESTART;                                 <<04164>>06020000
         RELDATASEG(BUFDST);                                   <<03568>>06022000
         GO OUT;                                               <<03568>>06024000
      END;                                                     <<03568>>06026000
      TOS:=FLABIO(ENTRY'(LGDEV),ADDR,0,FLAB);                           06028000
      IF TOS <> 0 THEN                                         <<03568>>06030000
      BEGIN                                                    <<03568>>06032000
         IF RESFLAG  THEN                                      <<04164>>06034000
         BEGIN                                                 <<04164>>06036000
            DB := EXCHANGEDB(DB);   << To LOGBUFF   >>         <<04164>>06038000
            RELEASE(DLOGBUFF(RESOURCE),NULL,1);                <<04164>>06040000
            DB := EXCHANGEDB(DB);   << To stack     >>         <<04164>>06042000
         END;                                                  <<04164>>06044000
         RELENTRY(TABINDEX',0);                                <<03568>>06046000
         GENMSG(SETNO,FLABELERR,0,@PROCNAME,,,,,0);            <<04888>>06048000
         MSGNO := CANTRESTART;                                 <<04164>>06050000
         RELDATASEG(BUFDST);                                   <<03568>>06052000
         GO OUT;                                               <<03568>>06054000
      END;                                                     <<03568>>06056000
      DB:=EXCHANGEDB(DB);     << Back to LOGBUFF >>            <<04164>>06058000
      <<Get ldev #, and sector # for this extent>>             <<03568>>06060000
      ADDR:=DFLAB(21+EXTNUM);                                           06062000
      ADDR1.(0:8):=LUN(ADDR1.(0:8),FGETPVINFO(FILENO).(4:4));  <<00728>>06064000
      LOGBUFF(LOGDEV):=ADDR1.(0:8);                                     06066000
      ADDR1.(0:8):=0;                                                   06068000
      DLOGBUFF(LOGADDR) := ADDR;                               <<04820>>06070000
      LOGBUFF(EXTENT):=EXTNUM;                                 <<00793>>06072000
    <<Disc logging system>>                                    <<03568>>06074000
   END                                                                  06076000
   ELSE                                                                 06078000
   BEGIN                                                                06080000
    << Serial logging system >>                                <<03732>>06082000
      DLOGBUFF(INBUFREC):=0D;                                           06084000
      DLOGBUFF(TRECS):=CURRREC;                                         06086000
      DLOGBUFF(LOGADDR):=ADDR;                                          06088000
      DTEMP:=CURRREC/DOUBLE(BLKFACTOR);                        <<01380>>06090000
      LOGBUFF(BUFUSED) := INTEGER(CURRREC - (DTEMP *           <<04820>>06092000
                                  DOUBLE(BLKFACTOR)));         <<04820>>06094000
      LOGBUFF(BSPACE) := BLKFACTOR - LOGBUFF(BUFUSED);         <<04820>>06096000
   END;                                                                 06098000
END;                                            <<IF RESTART>>          06100000
IF DB = 0 THEN DB:=EXCHANGEDB(0);                                       06102000
                                                               <<03732>>06104000
    IF ENTRY'(LGTYPE) = SDISC  OR  ENTRY'(LGTYPE) = CTAPE  THEN<<03732>>06106000
    BEGIN                                                      <<03732>>06108000
      << We need to issue a special write request for the   >> <<03732>>06110000
      << first write to a SDISC or CTAPE log file. This will>> <<03732>>06112000
      << post an eod marker to the gap table of the serial  >> <<03732>>06114000
      << disc interface so that recovery will be possible   >> <<03732>>06116000
      << in the event that the system goes down.            >> <<03732>>06118000
                                                               <<03732>>06120000
      COUNT := 0;                                              <<03732>>06122000
      FWRITE(FILENO,BUFFAREA,COUNT,SPECIAL'WRITE);             <<03732>>06124000
      IF <> THEN                                               <<03732>>06126000
      BEGIN                                                    <<03732>>06128000
         IF RESFLAG  THEN                                      <<04164>>06130000
         BEGIN                                                 <<04164>>06132000
            DB := EXCHANGEDB(DB);   << Back to LOGBUFF >>      <<04164>>06134000
            RELEASE(DLOGBUFF(RESOURCE),NULL,1);                <<04164>>06136000
            DB := EXCHANGEDB(DB);   << Return to stack >>      <<04164>>06138000
         END;                                                  <<04164>>06140000
         RELENTRY(TABINDEX',0);                                <<03732>>06142000
         FCHECK(FILENO,ERRCODE);                               <<04888>>06144000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>06146000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>06148000
         IF RESTART' THEN  MSGNO := CANTRESTART                <<04164>>06150000
            ELSE MSGNO := CANTSTART;                           <<04164>>06152000
         RELDATASEG(BUFDST);                                   <<03732>>06154000
         GO OUT;                                               <<03732>>06156000
      END;                                                     <<03732>>06158000
                                                               <<03732>>06160000
    END;                                                       <<03732>>06162000
                                                               <<03732>>06164000
<< At this point we've finished the initialization for the   >><<04164>>06166000
<< process. Now need to set the status field in the LOGTAB to>><<04164>>06168000
<< INACT so users can use the process.                       >><<04164>>06170000
                                                               <<04164>>06172000
DB := EXCHANGEDB(BUFDST);       << to LOGBUFF  >>              <<04164>>06174000
RELEASE(DLOGBUFF(RESOURCE),NULL,1);                            <<04164>>06176000
RESFLAG := FALSE;                                              <<04164>>06178000
                                                               <<04164>>06180000
<< Now we can get the LOGSIR (preserving the locking order). >><<04164>>06182000
                                                               <<04164>>06184000
EXCHANGEDB(LOGDST);       << to LOGTAB   >>                    <<04164>>06186000
A := GETSIR(LOGSIR);                                           <<04164>>06188000
LOGTAB(TABINDEX' + STATUS) := INACT;                           <<04164>>06190000
RELSIR(LOGSIR,A);                                              <<04164>>06192000
                                                               <<04164>>06194000
EXCHANGEDB(BUFDST);       << Return to LOGBUFF >>              <<04164>>06196000
OBTAIN(DLOGBUFF(RESOURCE),NULL);                               <<04164>>06198000
RESFLAG := TRUE;                                               <<04164>>06200000
                                                               <<04164>>06202000
DB := EXCHANGEDB(DB);      << Back to stack >>                 <<04164>>06204000
MSGNO:=LOGPROCRUNS;                                                     06206000
GENMSG(SETNO,MSGNO,%0,@PROCNAME,,,,,0);                                 06208000
<<DB-reg = buffer dst #; DB = DB-reg entry cond.>>             <<03568>>06210000
DB:=EXCHANGEDB(DB);    << Back to LOGBUFF >>                   <<04820>>06212000
                                                               <<03568>>06214000
GETIT:                                                                  06216000
                                                               <<03568>>06218000
     << DB at LOGBUFF >>                                       <<03568>>06220000
                                                               <<03568>>06222000
IF LOGBUFF(LOGTYPE) <> DISC  THEN                              <<03572>>06224000
BEGIN            << Serial logging system >>                   <<03572>>06226000
   IF DLOGBUFF(FSIZE)-DLOGBUFF(FSPACE')>=                               06228000
   DOUBLE(BLKFACTOR) THEN   <<GOT SOMETHING, GO FORIT>>                 06230000
   BEGIN                                                                06232000
      IF RESFLAG THEN                                          <<03568>>06234000
      BEGIN                                                    <<03568>>06236000
         RELEASE(DLOGBUFF(RESOURCE),NULL,1);                   <<03568>>06238000
         RESFLAG := FALSE;                                     <<03568>>06240000
      END;                                                     <<03568>>06242000
                                                               <<03732>>06244000
      DB:=EXCHANGEDB(DB);            <<BACK TO PROCESS STACK>>          06246000
      COUNT:=BLKSIZE;                                                   06248000
      FREADDIR(BUFFILENO,BUFFAREA,COUNT,OUTBUFREC);                     06250000
      IF <> THEN                               <<GO AN ERROR>>          06252000
      BEGIN                                  <<TRY ONCE MORE>>          06254000
         FREADDIR(BUFFILENO,BUFFAREA,COUNT,OUTBUFREC);                  06256000
         IF <> THEN                    <<GIVE UP AND SUSPEND>>          06258000
         BEGIN                                                          06260000
                                                                        06262000
            DB:=EXCHANGEDB(BUFDST);                                     06264000
            LOGBUFF(MSG) := SUSPEND;                           <<03568>>06266000
            WAKEUP';                                                    06268000
            DB:=EXCHANGEDB(DB);       << Back to stack >>      <<03568>>06270000
            FCHECK(BUFFILENO,ERRCODE);                         <<04888>>06272000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>06274000
            GENMSG(SETNO,BWRITEERROR,0,@PROCNAME,,,,,0);       <<03568>>06276000
            DB := EXCHANGEDB(DB);   << Back to LOGBUFF >>      <<03568>>06278000
            WAIT(%20,0);                                                06280000
            IF LOGBUFF(MSG) = STOP  AND  LOGBUFF(NUMUSER) = 0  <<03568>>06282000
              THEN GO STOP1                                    <<03568>>06284000
            ELSE GO WAIT1;                                     <<03568>>06286000
         END;                                                           06288000
      END;                                                              06290000
                                                                        06292000
      <<Now write to the serial file.  DB is at stack.  >>     <<03732>>06294000
                                                                        06296000
      FWRITE(FILENO,BUFFAREA,COUNT,NORMAL'WRITE);              <<03732>>06298000
      IF <> THEN                                                        06300000
      BEGIN                           <<GOT AN ERROR ON TAPE>>          06302000
         FCHECK(FILENO,ERRCODE);                                        06304000
         IF ERRCODE=SYSPOWERFAIL OR ERRCODE=TAPEPOWERFAIL      <<04454>>06306000
           THEN                                                <<04454>>06308000
         BEGIN                                                          06310000
            VALID := RECPFAIL(FILENO,DBUFFAREA,TAPEDEV);       <<04163>>06312000
            IF VALID THEN GO COMPLETE;                                  06314000
            GENMSG(SETNO,PFAILERROR,0,@PROCNAME,,,,,0);        <<04888>>06316000
         END                                                   <<04888>>06318000
         ELSE  GENMSG(FSSETNO,ERRCODE,,,,,,,0);                <<04888>>06320000
                                                               <<03732>>06322000
         DB:=EXCHANGEDB(BUFDST);                                        06324000
         LOGBUFF(LOGMSG):=WRITEERR;                            <<04886>>06326000
         LOGBUFF(MSG):=SUSPEND;                                         06328000
         WAKEUP';                                                       06330000
         <<DB-reg = entry cond.; DB = buffer dst #>>           <<03568>>06332000
         DB:=EXCHANGEDB(DB);                                            06334000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>06336000
         DB := EXCHANGEDB(DB);   << Back to LOGBUFF >>         <<03568>>06338000
         WAIT(%20,0);                                                   06340000
         IF LOGBUFF(MSG) = STOP  AND  LOGBUFF(NUMUSER) = 0     <<03568>>06342000
            THEN GO STOP1;                                     <<03568>>06344000
         DB := EXCHANGEDB(DB);     << Back to stack >>         <<03568>>06346000
      END;                                                              06348000
                                                               <<03568>>06350000
COMPLETE:                                                               06352000
      <<DB-reg = buffer dst #; DB = DB-reg entry cond.>>       <<03568>>06354000
      DB:=EXCHANGEDB(BUFDST);                                           06356000
      IF NOT RESFLAG THEN                                      <<03568>>06358000
      BEGIN                                                    <<03568>>06360000
         TOS := OBTAIN(DLOGBUFF(RESOURCE),NULL);               <<03568>>06362000
         RESFLAG := TRUE;                                      <<03568>>06364000
      END;                                                     <<03568>>06366000
      DEL;                                                              06368000
                                                                        06370000
                                                                        06372000
      <<NOW UPDATE GLOBAL INFORMATION>>                                 06374000
                                                                        06376000
      OUTBUFREC:=OUTBUFREC+DOUBLE(BLKFACTOR);                           06378000
      IF OUTBUFREC >= DLOGBUFF(FSIZE) THEN                              06380000
      OUTBUFREC:=0D;                                                    06382000
      DLOGBUFF(FSPACE'):=(DLOGBUFF(FSPACE')+(DOUBLE(BLKFACTOR)));       06384000
                                                                        06386000
      LOGBUFF(LOGMSG):=CONTINUE;                               <<04886>>06388000
      WAKEUP';                                                          06390000
   END;                                                                 06392000
   IF DLOGBUFF(FSIZE) - DLOGBUFF(FSPACE') <                             06394000
   DOUBLE(BLKFACTOR) THEN                                               06396000
   BEGIN                                                                06398000
   <<NO MORE RECORDS, WAIT>>                                            06400000
WAIT1:                                                                  06402000
                                                               <<03568>>06404000
     << DB is at LOGBUFF >>                                    <<03568>>06406000
                                                               <<03568>>06408000
      LOGBUFF(STATE):=INACT;                                            06410000
      WAKEUP';                                                          06412000
      IF RESFLAG THEN                                          <<00728>>06414000
      BEGIN                                                    <<00728>>06416000
         RESFLAG:=FALSE;                                       <<00728>>06418000
         RELEASE(DLOGBUFF(RESOURCE),NULL,1);                   <<00728>>06420000
      END;                                                     <<00728>>06422000
      IF LOGBUFF(MSG)=STOP AND LOGBUFF(NUMUSER) = 0 THEN                06424000
      GO STOP1;                                                         06426000
      WAIT(%20,0);                                                      06428000
      IF LOGBUFF(USERMSG) <> DISCSPACE THEN                    <<04886>>06430000
      BEGIN                                                    <<00728>>06432000
         RESFLAG:=TRUE;                                        <<00728>>06434000
         TOS:=OBTAIN(DLOGBUFF(RESOURCE),NULL);                 <<00728>>06436000
         DEL;                                                  <<00728>>06438000
      END;                                                     <<00728>>06440000
      IF LOGBUFF(MSG) = STOP THEN                                       06442000
      BEGIN                                                             06444000
         IF LOGBUFF(NUMUSER) = 0 THEN GO STOP1;                         06446000
         <<WAIT UNTIL ALL USERS STOP LOGGING>>                          06448000
         DB:=EXCHANGEDB(DB);                                            06450000
         <<TELL THE OPERATOR STOP PENDING>>                             06452000
         IF NOT NOTIFIED THEN GENMSG(SETNO,LOGINUSE,0,@PROCNAME,,,,,0); 06454000
         <<DB-reg = buffer dst #; DB = DB-reg entry cond.>>    <<03568>>06456000
         DB:=EXCHANGEDB(DB);                                            06458000
         NOTIFIED:=TRUE;                                                06460000
      END;                                                              06462000
      LOGBUFF(STATE):=ACT;                                              06464000
      GO GETIT;                                                         06466000
   END                                                                  06468000
   ELSE                                                                 06470000
   GO GETIT;                                                            06472000
 <<Tape logging system>>                                       <<03568>>06474000
END                                                                     06476000
                                                               <<04820>>06478000
ELSE                                                                    06480000
IF LOGBUFF(LOGTYPE) = DISC THEN    <<Disc logging>>            <<03568>>06482000
BEGIN                                                                   06484000
   IF LOGBUFF(USERMSG) = DISCSPACE THEN    <<OUT OF DISC SPACE><<04886>>06486000
   <<USER WANTS MORE DISC>>                                             06488000
   BEGIN                                                                06490000
      LOGBUFF(USERMSG):=CONTINUE;                              <<04886>>06492000
                                                               <<04820>>06494000
                                                               <<04820>>06496000
      IF EXTNUM+1 > NUMEXT  THEN                               <<04820>>06498000
      BEGIN                                                             06500000
         <<OUT OF FILE SPACE>>                                          06502000
                                                               <<04820>>06504000
                                                               <<04820>>06506000
         IF NOT NOTIFIED THEN                                  <<00720>>06508000
         BEGIN                                                 <<04820>>06510000
            DB := EXCHANGEDB(DB);    << Back to stack >>       <<04820>>06512000
            GENMSG(SETNO,LOGFILEEOF,0,@PROCNAME,,,,,0);        <<04888>>06514000
            DB := EXCHANGEDB(DB);    << Back to LOGBUFF >>     <<04820>>06516000
         END;                                                  <<04820>>06518000
                                                               <<04820>>06520000
         NOTIFIED:=TRUE;                                       <<00720>>06522000
         LOGBUFF(MSG):=STOP;                                            06524000
         LOGBUFF(LOGMSG):=EOFONLOGFILE;                        <<04886>>06526000
         DLOGBUFF(INBUFREC):=DLOGBUFF(FSIZE);                           06528000
         WAKEUP';                                                       06530000
         IF LOGBUFF(NUMUSER) = 0  THEN                         <<03567>>06532000
         BEGIN                                                          06534000
            RELEASE(DLOGBUFF(RESOURCE),NULL,1);                         06536000
            RESFLAG := FALSE;                                  <<03568>>06538000
            GO STOP1;                                                   06540000
         END                                                            06542000
         ELSE GO WAIT1;                                                 06544000
       <<Out of file space>>                                   <<03568>>06546000
      END;                                                              06548000
                                                                        06550000
                                                               <<04820>>06552000
      DB := EXCHANGEDB(DB);      << Back to stack >>           <<04820>>06554000
                                                               <<04820>>06556000
      EXTNUM := EXTNUM + 1;                                    <<04820>>06558000
                                                               <<04820>>06560000
      << Need to allocate the next extent. Will also blank  >> <<03568>>06562000
      << out the entire extent.                             >> <<03568>>06564000
      << DB is at stack.                                    >> <<03568>>06566000
                                                               <<03568>>06568000
      BUFFAREA :="  ";                                         <<04886>>06570000
      MOVE BUFFAREA(1):=BUFFAREA,(BLKSIZE-1);                           06572000
                                                               <<03568>>06574000
      << Calculate the number of blocks per extent.         >> <<03568>>06576000
                                                               <<03568>>06578000
      SIZE := EXTSIZE/BLKFACTOR;                               <<03568>>06580000
                                                               <<03568>>06582000
      << If this is the last extent, then the total # blocks>> <<03568>>06584000
      << in this extent may be different.                   >> <<03568>>06586000
                                                               <<03568>>06588000
      IF EXTNUM = NUMEXT                                       <<03568>>06590000
          THEN  MAX := FLAB(LASTEXT)/BLKFACTOR                 <<03568>>06592000
       ELSE MAX := SIZE;                                       <<03568>>06594000
                                                               <<03568>>06596000
                                                               <<03568>>06598000
      << Now blank out the extent (1 block at a time).       >><<03568>>06600000
                                                               <<03568>>06602000
                                                               <<03568>>06604000
      LI:=1;                                                   <<01432>>06606000
      DO                                                                06608000
      BEGIN                                                             06610000
         FWRITEDIR(FILENO,BUFFAREA,BLKSIZE,                    <<03568>>06612000
                   DOUBLE((LEXTNUM-2)*SIZE+SIZE-2 + LI) );     <<03568>>06614000
         IF <> THEN                                                     06616000
         BEGIN                                                          06618000
            << Error - may be out of group or account disc >>  <<04888>>06620000
            <<         space.                              >>  <<04888>>06622000
                                                               <<04888>>06624000
            FCHECK(FILENO,ERRCODE);                            <<04888>>06626000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>06628000
            IF ERRCODE = OUT'OF'GROUP'SPACE OR                 <<04888>>06630000
               ERRCODE = OUT'OF'ACCOUNT'SPACE                  <<04888>>06632000
              THEN GENMSG(SETNO,OUTOFDISCSPACE,0,@PROCNAME,    <<04888>>06634000
                          ,,,,0)                               <<04888>>06636000
            ELSE GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);  <<04888>>06638000
                                                               <<04888>>06640000
            DB:=EXCHANGEDB(DB);                                         06642000
            LOGBUFF(MSG):=STOP;                                         06644000
            IF ERRCODE = OUT'OF'GROUP'SPACE OR                          06646000
               ERRCODE = OUT'OF'ACCOUNT'SPACE                  <<04888>>06648000
              THEN LOGBUFF(LOGMSG) := DISCSPACE                <<04888>>06650000
            ELSE LOGBUFF(LOGMSG) := WRITEERR;                  <<04888>>06652000
                                                               <<04888>>06654000
            ABNORMAL'EXIT:=TRUE;                               <<04820>>06656000
            GO WAIT1;                                                   06658000
          END;                                                 <<03568>>06660000
       END                                                     <<03568>>06662000
       UNTIL (LI := LI+1) > MAX;                               <<03568>>06664000
                                                               <<03568>>06666000
      FCONTROL(FILENO,6,A);   <<UPDATE FILE LABEL>>                     06668000
      IF < THEN                                                <<03568>>06670000
       BEGIN                                                   <<03568>>06672000
          FCHECK(FILENO,ERRCODE);                              <<04888>>06674000
          GENMSG(FSSETNO,ERRCODE,,,,,,,0);                     <<04888>>06676000
          GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);         <<04888>>06678000
          <<DB-reg = buffer dst #>>                            <<03568>>06680000
          DB := EXCHANGEDB(DB);                                <<03568>>06682000
          LOGBUFF(LOGMSG) := WRITEERR;                         <<04886>>06684000
          ABNORMAL'EXIT := TRUE;                               <<04820>>06686000
          GO WAIT1;                                            <<03568>>06688000
       END;                                                    <<03568>>06690000
      FGETINFO(FILENO,,,,,,,,,,,,,,,,,,,ADDR);                          06692000
      IF < THEN                                                <<03568>>06694000
       BEGIN                                                   <<03568>>06696000
          FCHECK(FILENO,ERRCODE);                              <<04888>>06698000
          GENMSG(FSSETNO,ERRCODE,,,,,,,0);                     <<04888>>06700000
          GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);         <<04888>>06702000
          <<DB-reg = buffer dst #>>                            <<03568>>06704000
          DB := EXCHANGEDB(DB);                                <<03568>>06706000
          LOGBUFF(LOGMSG) := WRITEERR;                         <<04886>>06708000
          ABNORMAL'EXIT := TRUE;                               <<04820>>06710000
          GO WAIT1;                                            <<03568>>06712000
       END;                                                    <<03568>>06714000
      ADDR1:=ADDR1.(8:8);                                               06716000
      TOS:=FLABIO(ENTRY'(LGDEV),ADDR,0,FLAB);                           06718000
      IF TOS <> 0 THEN                                         <<03568>>06720000
      BEGIN                                                    <<03568>>06722000
         GENMSG(SETNO,FLABELERR,0,@PROCNAME,,,,,0);            <<04888>>06724000
         DB := EXCHANGEDB(DB);                                 <<03568>>06726000
         LOGBUFF(LOGMSG) := WRITEERR;                          <<04886>>06728000
         ABNORMAL'EXIT := TRUE;                                <<04820>>06730000
         GO WAIT1;                                             <<03568>>06732000
      END;                                                     <<03568>>06734000
      ADDR:=DFLAB(21+EXTNUM);                                           06736000
      ADDR1.(0:8):=LUN(ADDR1.(0:8),FGETPVINFO(FILENO).(4:4));  <<00720>>06738000
                                                               <<04820>>06740000
      << We need to leave room in the last extent so that the>><<04820>>06742000
      << proper close information can get posted to the file.>><<04820>>06744000
      << I.e. save one record for the trailer record.        >><<04820>>06746000
                                                               <<04820>>06748000
      IF EXTNUM = NUMEXT                                       <<03568>>06750000
          THEN TOS := DOUBLE(FLAB(LASTEXT) - 1)                <<04820>>06752000
       ELSE TOS := DOUBLE(FLAB(FEXTSIZE));                     <<03568>>06754000
                                                               <<04820>>06756000
      DB:=EXCHANGEDB(DB);       << Back to LOGBUFF >>          <<04820>>06758000
                                                               <<04820>>06760000
      <<UPDATE GLOBAL AREA>>                                            06762000
                                                               <<04820>>06764000
      LOGBUFF(EXTENT) := EXTNUM;                               <<04820>>06766000
                                                               <<04820>>06768000
      DLOGBUFF(FSPACE'):=DLOGBUFF(FSIZE):=TOS;                          06770000
      LOGBUFF(LOGDEV):=ADDR1.(0:8);                                     06772000
      ADDR1.(0:8):=0;                                                   06774000
      DLOGBUFF(LOGADDR):=ADDR;                                          06776000
      LOGBUFF(LOGMSG):=CONTINUE;                               <<04886>>06778000
      DLOGBUFF(INBUFREC):=0D;                                           06780000
                                                               <<04820>>06782000
      WAKEUP';                                                          06784000
      GO WAIT1;                                                         06786000
     <<Wants more disc space>>                                 <<03568>>06788000
   END                                                                  06790000
   ELSE GO WAIT1;                                                       06792000
   <<Disc logging>>                                            <<03568>>06794000
END;                                                                    06796000
                                                                        06798000
STOP1:    <<STOP THE LOGGING PROCESS>>                                  06800000
                                                               <<03568>>06802000
IF NOT RESFLAG THEN                                            <<04820>>06804000
BEGIN                                                          <<04820>>06806000
   RESFLAG := TRUE;                                            <<04820>>06808000
   OBTAIN(DLOGBUFF(RESOURCE),NULL);                            <<04820>>06810000
END;                                                           <<04820>>06812000
                                                               <<04820>>06814000
MSGNO:=LOGPROCSTOP;                                                     06816000
                                                                        06818000
IF LOGBUFF(LOGTYPE) <> DISC  THEN                              <<03572>>06820000
BEGIN                                                                   06822000
   <<FORMAT THE LAST BLOCK>>                                            06824000
                                                               <<04820>>06826000
   IF NOT FORMATTED'TRAILER THEN                               <<04820>>06828000
   BEGIN                                                       <<04820>>06830000
      FORMAT'TRAILER;                                          <<04820>>06832000
      FORMATTED'TRAILER := TRUE;                               <<04820>>06834000
   END;                                                        <<04820>>06836000
                                                               <<04820>>06838000
                                                               <<04820>>06840000
   FLUSH(NULL);                                                <<04820>>06842000
   CHECKMSG;       << Make sure all okay >>                    <<04820>>06844000
                                                               <<04820>>06846000
   COUNT:=INTEGER(DLOGBUFF(FSIZE)-DLOGBUFF(FSPACE'))*RECSIZE;  <<01380>>06848000
   <<DB-reg = entry cond.; DB = buffer dst #>>                 <<03568>>06850000
   DB:=EXCHANGEDB(DB);                                         <<01380>>06852000
   DO                                                          <<03568>>06854000
   BEGIN                                                       <<03568>>06856000
     << May need more than one read/write to empty the disc>>  <<03568>>06858000
     << buffer file.                                       >>  <<03568>>06860000
                                                               <<03568>>06862000
   IF COUNT > BLKSIZE  THEN                                    <<03568>>06864000
   BEGIN                                                       <<03568>>06866000
      TEMPCNT := COUNT - BLKSIZE;                              <<03568>>06868000
      COUNT := BLKSIZE;                                        <<03568>>06870000
   END                                                         <<03568>>06872000
   ELSE  TEMPCNT := 0;                                         <<03568>>06874000
                                                               <<03568>>06876000
   FREADDIR(BUFFILENO,BUFFAREA,COUNT,OUTBUFREC);                        06878000
   IF < THEN                                                   <<03568>>06880000
    BEGIN                                                      <<03568>>06882000
       FCHECK(BUFFILENO,ERRCODE);                              <<04888>>06884000
       GENMSG(FSSETNO,ERRCODE,,,,,,,0);                        <<04888>>06886000
       GENMSG(SETNO,BREADERROR,0,@PROCNAME,,,,,0);             <<03568>>06888000
       GO ABEXIT';                                             <<03568>>06890000
    END;                                                       <<03568>>06892000
   FWRITE(FILENO,BUFFAREA,COUNT,0);  <<WRITE BLOCK TO FILE>>            06894000
   IF < THEN                                                   <<03568>>06896000
   BEGIN                                                       <<03568>>06898000
      FCHECK(FILENO,ERRCODE);                                  <<03568>>06900000
      IF ERRCODE=SYSPOWERFAIL  OR  ERRCODE=TAPEPOWERFAIL THEN  <<03570>>06902000
      BEGIN                                                    <<03568>>06904000
         IF NOT RECPFAIL(FILENO,DBUFFAREA,TAPEDEV)             <<04163>>06906000
            THEN GENMSG(SETNO,PFAILERROR,0,@PROCNAME,,,,,0);   <<04888>>06908000
      END                                                      <<03568>>06910000
      ELSE                                                     <<04888>>06912000
      BEGIN                                                    <<04888>>06914000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>06916000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>06918000
      END;                                                     <<04888>>06920000
   END;                                                        <<03568>>06922000
                                                               <<03568>>06924000
   COUNT := TEMPCNT;     << # words left in disc buffer >>     <<03568>>06926000
   OUTBUFREC := OUTBUFREC + DOUBLE(BLKFACTOR);                 <<03568>>06928000
   IF OUTBUFREC >= DLOGBUFF(FSIZE)  THEN OUTBUFREC := 0D;      <<03568>>06930000
                                                               <<03568>>06932000
   END                                                         <<03568>>06934000
   UNTIL    COUNT <= 0;                                        <<03568>>06936000
                                                               <<03568>>06938000
                                                               <<03568>>06940000
                                                               <<03568>>06942000
ABEXIT':                                                       <<03568>>06944000
   << Close files for tape logging - DB is at stack >>         <<04888>>06946000
                                                                        06948000
   FCLOSE(BUFFILENO,4,0);                             <<DELETE>>        06950000
   FCLOSE(FILENO,0,0);                                                  06952000
   IF <> THEN                                                  <<04888>>06954000
   BEGIN                                                       <<04888>>06956000
      FCHECK(FILENO,ERRCODE);                                  <<04888>>06958000
      GENMSG(FSSETNO,ERRCODE,,,,,,,0);                         <<04888>>06960000
      GENMSG(SETNO,FCLOSEERROR,0,@PROCNAME);                   <<04888>>06962000
   END;                                                        <<04888>>06964000
   DB:=EXCHANGEDB(BUFDST);                                              06966000
   RELEASE(DLOGBUFF(RESOURCE),NULL,1);                         <<03568>>06968000
   <<DB-reg = entry cond.; DB = buffer dst #>>                 <<03568>>06970000
   DB:=EXCHANGEDB(DB);                                                  06972000
   RELENTRY(TABINDEX',0);                                      <<00783>>06974000
   RELDATASEG(BUFDST);                                         <<00783>>06976000
   <<Tape logging - stop>>                                     <<03568>>06978000
END                                                                     06980000
ELSE                                                                    06982000
BEGIN                                                                   06984000
                                                               <<04820>>06986000
   << Stop the disc logging process. >>                        <<04820>>06988000
                                                               <<04820>>06990000
   IF LOGBUFF(LOGTYPE) = DISC  THEN                            <<03568>>06992000
   BEGIN                                                                06994000
      IF ABNORMAL'EXIT AND (EXTNUM<=NUMEXT) THEN GO ABEXIT;    <<01432>>06996000
                                                               <<04820>>06998000
      << If we're on the last extent, then we can free up the>><<04820>>07000000
      << file space we've been saving.                       >><<04820>>07002000
                                                               <<04820>>07004000
      IF NOT FREE'LAST'EXTENT THEN                             <<04820>>07006000
      BEGIN                                                    <<04820>>07008000
         IF LOGBUFF(EXTENT) = LOGBUFF(LASTEXT')  AND           <<04820>>07010000
            DLOGBUFF(FSPACE') < DOUBLE(BLKFACTOR)  THEN        <<04820>>07012000
         BEGIN                                                 <<04820>>07014000
            << If this is the last block of the last extent, >><<04820>>07016000
            << then it's time to make the last record        >><<04820>>07018000
            << available.                                    >><<04820>>07020000
                                                               <<04820>>07022000
            DLOGBUFF(FSIZE) := DLOGBUFF(FSIZE) + 1D;           <<04820>>07024000
            DLOGBUFF(FSPACE') := DLOGBUFF(FSPACE') + 1D;       <<04820>>07026000
            LOGBUFF(BSPACE) := LOGBUFF(BSPACE) + 1;            <<04820>>07028000
                                                               <<04820>>07030000
            FREE'LAST'EXTENT := TRUE;                          <<04820>>07032000
         END;                                                  <<04820>>07034000
      END;                                                     <<04820>>07036000
                                                               <<04820>>07038000
      << Now we can format the trailer record. >>              <<04820>>07040000
                                                               <<04820>>07042000
      IF NOT FORMATTED'TRAILER THEN                            <<04820>>07044000
      BEGIN                                                    <<04820>>07046000
         FORMAT'TRAILER;                                       <<04820>>07048000
         FORMATTED'TRAILER := TRUE;                            <<04820>>07050000
      END;                                                     <<04820>>07052000
                                                               <<04820>>07054000
      << Now flush the buffer (with the trailer record). >>    <<04820>>07056000
                                                               <<04820>>07058000
      FLUSH(NULL);                                             <<04820>>07060000
      CHECKMSG;                                                <<04820>>07062000
                                                               <<04820>>07064000
      FPOINT(FILENO,DLOGBUFF(TRECS)/DOUBLE(BLKFACTOR));        <<00793>>07066000
      IF < THEN                                                <<03568>>07068000
      BEGIN                                                    <<03568>>07070000
         DB := EXCHANGEDB(DB);       << Back to stack >>       <<03568>>07072000
         FCHECK(FILENO,ERRCODE);                               <<04888>>07074000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>07076000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>07078000
         DB := EXCHANGEDB(DB);       << Back to LOGBUFF >>     <<03568>>07080000
      END;                                                     <<03568>>07082000
                                                               <<03568>>07084000
                                                               <<00781>>07086000
ABEXIT:                                                        <<01432>>07088000
      RELEASE(DLOGBUFF(RESOURCE),NULL,1);                      <<03568>>07090000
      <<DB-reg = entry cond.; DB = buffer dst # >>             <<03568>>07092000
      DB:=EXCHANGEDB(DB);                                               07094000
         FCONTROL(FILENO,6,A); <<WRITE END OF FILE>>           <<00781>>07096000
         IF <> THEN                                            <<03568>>07098000
         BEGIN                                                 <<03568>>07100000
            FCHECK(FILENO,ERRCODE);                            <<04888>>07102000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>07104000
            GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);       <<04888>>07106000
         END;                                                  <<03568>>07108000
                                                               <<03568>>07110000
      FCLOSE(FILENO,0,0);                                               07112000
      IF <> THEN                                               <<03568>>07114000
      BEGIN                                                    <<03568>>07116000
         FCHECK(FILENO,ERRCODE);                               <<04888>>07118000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>07120000
         GENMSG(SETNO,FWRITEERROR,0,@PROCNAME,,,,,0);          <<04888>>07122000
      END;                                                     <<03568>>07124000
                                                               <<03568>>07126000
      RELENTRY(TABINDEX',0);                                            07128000
      RELDATASEG(BUFDST);                                      <<00753>>07130000
   END;     <<Disc logging - stop>>                            <<03568>>07132000
END;                                                                    07134000
                                                               <<03568>>07136000
OUT:                                                                    07138000
                                                               <<04886>>07140000
IF DB = 0 THEN DB:=EXCHANGEDB(DB);                                      07142000
GENMSG(SETNO,MSGNO,%0,@PROCNAME,,,,,0); <<TELL OPERATOR FINI>>          07144000
END; <<ULOGPROC>>                                                       07146000
$PAGE "POWER FAIL RECOVERY"                                    <<04162>>07148000
LOGICAL PROCEDURE RECPFAIL(FILENO,RECNUM,TLDEV);               <<04163>>07150000
   VALUE FILENO,RECNUM,TLDEV;                                  <<04163>>07152000
   INTEGER FILENO,TLDEV;                                       <<04163>>07154000
   DOUBLE RECNUM;                                              <<03570>>07156000
   OPTION INTERNAL;                                            <<04163>>07158000
                                                               <<03570>>07160000
BEGIN                                                          <<03570>>07162000
                                                               <<03570>>07164000
<< Called from ULOGPROC when writting to the tape logging    >><<03570>>07166000
<< file and a powerfail error occurred. We want to rewind to >><<03570>>07168000
<< Load Point (LP) and then read each block until we find the>><<03570>>07170000
<< last good block before the power failed.  At that point   >><<03570>>07172000
<< we can try to re-write the block.                         >><<03570>>07174000
<<                                                           >><<03570>>07176000
<< Since the Logging file is a Labeled Tape and contains only>><<03570>>07178000
<< one file (the Log file) we must rewind the tape back to   >><<03570>>07180000
<< LP, then forward space over the label stuff to the        >><<03570>>07182000
<< Tape Mark (TM).                                           >><<03570>>07184000
<<                                                           >><<03570>>07186000
<< Format of a Labeled Tape:                                 >><<03570>>07188000
<<    [LP] [vol1] [hdr1] [hd2]  [TM] [...data......]         >><<03570>>07190000
<<                                                           >><<03570>>07192000
<<  DB is at the stack.                                      >><<03570>>07194000
<<                                                           >><<03570>>07196000
<< RETURNS:                                                  >><<03570>>07198000
<<    TRUE - Block successfully rewritten to log file.       >><<03570>>07200000
<<    FALSE- Some other error occurred. Log file may not     >><<03570>>07202000
<<           completely be recovered.                        >><<03570>>07204000
                                                               <<03570>>07206000
                                                               <<03570>>07208000
                                                               <<03570>>07210000
DOUBLE                                                         <<04888>>07212000
   STAT,           << Status return from ATTACHIO >>           <<04888>>07214000
   RECORD;         << Rec # before the one to write >>         <<04888>>07216000
                                                               <<04888>>07218000
INTEGER                                                        <<03570>>07220000
   STAT0 = STAT + 0,                                           <<04888>>07222000
   ERRCODE;        << Return from FCHECK >>                    <<03570>>07224000
                                                               <<03570>>07226000
LOGICAL ARRAY TAPEREC(0:RECSIZEM1) = Q;                        <<03570>>07228000
DOUBLE ARRAY DTAPEREC(*) = TAPEREC;                            <<03570>>07230000
                                                               <<03570>>07232000
EQUATE                                                         <<03570>>07234000
   SYSPFAIL = %63,   << Sys powerfail code - from ATTACHIO >>  <<03570>>07236000
   TAPEPFAIL= %213,  << Device powerfail   - from ATTACHIO >>  <<03570>>07238000
   SUCCESS  = 1,     << General status     - from ATTACHIO >>  <<03570>>07240000
   BLOCKEDIO= 1;     << Want blocked I/O (wait) in ATTACHIO >> <<03570>>07242000
                                                               <<03570>>07244000
                                                               <<03570>>07246000
                                                               <<03570>>07248000
                                                               <<03570>>07250000
RECPFAIL := FALSE;                                             <<03570>>07252000
                                                               <<03570>>07254000
<< If this was the 2nd write (RECNUM=32D), then need to stop>> <<03570>>07256000
<< re-reading the file when we've found the 1st block.      >> <<03570>>07258000
                                                               <<03570>>07260000
IF RECNUM - DOUBLE(BLKFACTOR) < 1D                             <<03570>>07262000
   THEN RECORD := 1D                                           <<03570>>07264000
 ELSE RECORD := RECNUM - DOUBLE(BLKFACTOR);                    <<03570>>07266000
                                                               <<03570>>07268000
                                                               <<03570>>07270000
POWERFAIL:                                                     <<03570>>07272000
                                                               <<03570>>07274000
   << Tell the operator to reset the tape drive and place    >><<04454>>07276000
   << it back on-line.                                       >><<04163>>07278000
                                                               <<04163>>07280000
   GENMSG(SETNO,TPOWERFAIL,%10000,TLDEV,,,,,0);                <<04163>>07282000
                                                               <<04163>>07284000
   << Rewind to LP. (FCONTROL won't do this o labeled tape). >><<04163>>07286000
                                                               <<03570>>07288000
    STAT:=ATTACHIO(TLDEV,0,0,0,REWIND,0,0,0,BLOCKEDIO);        <<04888>>07290000
    IF STAT0.(13:3) <> SUCCESS THEN                            <<04888>>07292000
    BEGIN                                                      <<03570>>07294000
       IF STAT0.(8:8) = SYSPFAIL OR STAT0.(8:8) = TAPEPFAIL    <<04888>>07296000
           THEN GO POWERFAIL                                   <<03570>>07298000
       ELSE                                                    <<04888>>07300000
       BEGIN                                                   <<04888>>07302000
          ERRCODE := IOSTAT(STAT0);                            <<04888>>07304000
          GENMSG(FSSETNO,ERRCODE,,,,,,,0);                     <<04888>>07306000
          RETURN;                                              <<04888>>07308000
       END;                                                    <<04888>>07310000
                                                               <<04888>>07312000
    END;                                                       <<03570>>07314000
                                                               <<03570>>07316000
    << Skip over Label stuff to TM >>                          <<03570>>07318000
                                                               <<03570>>07320000
    STAT:=ATTACHIO(TLDEV,0,0,0,FORWARDSPACE,0,0,0,BLOCKEDIO);  <<04888>>07322000
    IF STAT0.(13:3) <> SUCCESS THEN                            <<04888>>07324000
    BEGIN                                                      <<03570>>07326000
       IF STAT0.(8:8) = SYSPFAIL OR STAT0.(8:8) = TAPEPFAIL    <<04888>>07328000
           THEN GO POWERFAIL                                   <<03570>>07330000
       ELSE                                                    <<04888>>07332000
       BEGIN                                                   <<04888>>07334000
          ERRCODE := IOSTAT(STAT0);                            <<04888>>07336000
          GENMSG(FSSETNO,ERRCODE,,,,,,,0);                     <<04888>>07338000
          RETURN;                                              <<04888>>07340000
       END;                                                    <<04888>>07342000
                                                               <<04888>>07344000
    END;                                                       <<03570>>07346000
                                                               <<03570>>07348000
                                                               <<03570>>07350000
    << If RECNUM is 1, then we powerfailed on the first write>><<03570>>07352000
    << so we need to skip over the re-reading of the file.   >><<03570>>07354000
                                                               <<03570>>07356000
    IF RECNUM > 1D  THEN                                       <<03570>>07358000
    BEGIN                                                      <<03570>>07360000
                                                               <<03570>>07362000
    << Now we're positioned to start reading the data from  >> <<03570>>07364000
    << the file to find the last good block.  Will read the >> <<03570>>07366000
    << first record of each block to find the record number >> <<03570>>07368000
    << of that block.  (The 1st double word of the record   >> <<03570>>07370000
    << contains the record number).                         >> <<03570>>07372000
                                                               <<03570>>07374000
       DO                                                      <<03570>>07376000
       BEGIN                                                   <<03570>>07378000
          FREAD(FILENO,TAPEREC,RECSIZE);                       <<03570>>07380000
          IF <> THEN                                           <<03570>>07382000
          BEGIN                                                <<03570>>07384000
             FCHECK(FILENO,ERRCODE);                           <<03570>>07386000
             IF ERRCODE=SYSPOWERFAIL  OR  ERRCODE=TAPEPOWERFAIL<<03570>>07388000
                 THEN GO POWERFAIL                             <<03570>>07390000
             ELSE                                              <<04888>>07392000
             BEGIN                                             <<04888>>07394000
                GENMSG(FSSETNO,ERRCODE,,,,,,,0);               <<04888>>07396000
                RETURN;                                        <<04888>>07398000
             END;                                              <<04888>>07400000
                                                               <<04888>>07402000
          END;                                                 <<03570>>07404000
       END                                                     <<03570>>07406000
       UNTIL DTAPEREC = RECORD;                                <<03570>>07408000
    END;                                                       <<03570>>07410000
                                                               <<03570>>07412000
    << At this point we've found the last complete block    >> <<03570>>07414000
    << before the Power fail. Try to write the block again. >> <<03570>>07416000
                                                               <<03570>>07418000
    FWRITE(FILENO,BUFFAREA,BLKSIZE,0);                         <<03570>>07420000
    IF <> THEN                                                 <<03570>>07422000
    BEGIN                                                      <<03570>>07424000
       FCHECK(FILENO,ERRCODE);                                 <<03570>>07426000
       IF ERRCODE = SYSPOWERFAIL  OR  ERRCODE = TAPEPOWERFAIL  <<03570>>07428000
           THEN GO POWERFAIL                                   <<03570>>07430000
       ELSE                                                    <<04888>>07432000
       BEGIN                                                   <<04888>>07434000
          GENMSG(FSSETNO,ERRCODE,,,,,,,0);                     <<04888>>07436000
          RETURN;                                              <<04888>>07438000
       END;                                                    <<04888>>07440000
                                                               <<04888>>07442000
    END;                                                       <<03570>>07444000
                                                               <<03570>>07446000
    << If we finally make it here, recovery is successful.  >> <<03570>>07448000
                                                               <<03570>>07450000
    RECPFAIL := TRUE;                                          <<03570>>07452000
                                                               <<03570>>07454000
END;                                                           <<03570>>07456000
$TITLE      "USER LOGGING PROCESS WARM-START RECOVERY"                  07458000
$PAGE                                                                   07460000
                                                                        07462000
                                                                        07464000
                                                                        07466000
PROCEDURE RECLOG;                                                       07468000
OPTION PRIVILEGED,UNCALLABLE;                                           07470000
BEGIN                                                                   07472000
                                                                        07474000
COMMENT                                                        <<03571>>07476000
                                                               <<03571>>07478000
Called during a Warmstart to recover any active User Loggging  <<03571>>07480000
files. Will search the LOGTAB for an entry, open the file      <<03571>>07482000
associated with this entry, re-read the file until the last    <<03571>>07484000
good record is found, then will write a log crash record to the<<03571>>07486000
file, print a message to the console telling how many records  <<03571>>07488000
were recovered, update the EOF marker in the file label to     <<03571>>07490000
the corrert setting, and close the file.                       <<03571>>07492000
This will be repeated until all active files are recovered.    <<03571>>07494000
                                                               <<03571>>07496000
It is important to realize that any information in the Buffer  <<03571>>07498000
area of the Logging Buffer will be lost if the system crashes. <<03571>>07500000
;                                                              <<03571>>07502000
                                                                        07504000
   <<RECOVERS USER LOGGING FILE DURING WARMSTART>>                      07506000
                                                                        07508000
EQUATE                                                         <<03571>>07510000
  FEOF      =  %12,        << ATTACHIO found EOF >>            <<04888>>07512000
  FORWRD    =  FORWARDSPACE;  << Forward space file >>         <<04162>>07514000
   DOUBLE                                                      <<04888>>07516000
      STAT;          << Status return from ATTACHIO >>         <<04888>>07518000
                                                               <<04888>>07520000
   INTEGER                                                     <<04888>>07522000
      I,                                                       <<04888>>07524000
      ERRCODE,                                                 <<04888>>07526000
      STAT0  =  STAT + 0;                                      <<04888>>07528000
                                                               <<04888>>07530000
   INTEGER TABINDEX;                                                    07532000
                                                                        07534000
   DOUBLE CURRREC,LASTREC,RECNUM,EOF;                                   07536000
DOUBLE STOPPER;                                                <<03571>>07538000
   INTEGER BUFFILENO,LOGFILENO,DB;                                      07540000
   LOGICAL VALID,PARM,EOFORERR;                                         07542000
DOUBLE NUMRECOVERED;                                           <<04162>>07544000
   LOGICAL B;                                                           07546000
   INTEGER NUMOPEN,NUMCLOSE,LEN,SAVE;                                   07548000
   BYTE POINTER BINREC;                                        <<04162>>07550000
   LOGICAL POINTER INREC,OUTREC;                                        07552000
   DOUBLE POINTER DINREC;                                      <<04162>>07554000
   INTEGER TAPEDEV;                                            <<00793>>07556000
   LOGICAL NOTIFIED;                                           <<03732>>07558000
   BYTE ARRAY FNAME(0:36) = Q;                                          07560000
   BYTE ARRAY BUFNAME(0:16) = Q;                                        07562000
   BYTE ARRAY DEV(0:8) = Q;                                             07564000
   BYTE ARRAY FORMS(0:8) = Q;                                           07566000
   BYTE ARRAY IDENTIFIER(0:8) = Q;                                      07568000
   BYTE ARRAY OUTPUT1(0:12) = Q;                                        07570000
   BYTE ARRAY OUTPUT2(0:6) = Q;                                <<04496>>07572000
   BYTE ARRAY OUTPUT3(0:6) = Q;                                <<04496>>07574000
                                                                        07576000
                                                                        07578000
                                                                        07580000
                                                                        07582000
                                                                        07584000
SUBROUTINE CHECKRECORD;                                                 07586000
BEGIN                                                                   07588000
                                                                        07590000
<<CHECKS RECORDS PASSED BY CHECKBLOCK>>                                 07592000
                                                                        07594000
                                                                        07596000
   VALID:=TRUE;                                                         07598000
   TOS:=-1;                                                             07600000
   X:=RECSIZEM1;                                               <<03571>>07602000
   DO                                                                   07604000
   BEGIN                                                                07606000
      IF X<>CKSUM THEN                                                  07608000
      TOS:=TOS XOR INREC(X);                                            07610000
   END UNTIL(X:=X-1)<0;                                                 07612000
   IF INREC(CODE).(8:8) = OPEN THEN NUMOPEN:=NUMOPEN+1;                 07614000
   IF INREC(CODE).(8:8) = CLOSE THEN NUMCLOSE:=NUMCLOSE+1;              07616000
   CURRREC:=CURRREC+1D;                                                 07618000
   IF (TOS <> INREC(CKSUM)) OR DINREC(RNUM) <> CURRREC                  07620000
   THEN VALID:=FALSE;                                                   07622000
END;                                                                    07624000
                                                                        07626000
                                                                        07628000
                                                                        07630000
                                                                        07632000
                                                                        07634000
SUBROUTINE CHECKBLOCK;                                                  07636000
BEGIN                                                                   07638000
                                                                        07640000
                                                                        07642000
<<CHECKS A BLOCK READ FROM THE LOGFILE OR BUFFER>>                      07644000
                                                                        07646000
                                                                        07648000
   VALID:=TRUE;                                                         07650000
   I:=0;                                                                07652000
   DO                                                                   07654000
   BEGIN                                                                07656000
      CHECKRECORD;                                                      07658000
      IF VALID THEN                                                     07660000
      BEGIN                                                             07662000
         @INREC:=@INREC+RECSIZE;                               <<03571>>07664000
         @DINREC:=@INREC;                                               07666000
      END;                                                              07668000
   END UNTIL NOT VALID OR (I:=I+1)>=BLKFACTOR;                          07670000
END;                                                                    07672000
                                                                        07674000
                                                                        07676000
                                                                        07678000
                                                                        07680000
                                                                        07682000
SUBROUTINE FORMATCRASH;                                                 07684000
BEGIN                                                                   07686000
                                                                        07688000
<<FORMATS A CRASH RECORD>>                                              07690000
                                                                        07692000
<< Output one crach record, then fill remainder of the     >>  <<03571>>07694000
<< block with null records.                                >>  <<03571>>07696000
<< I = last valid record # found by CHECKBLOCK >>              <<03571>>07698000
                                                                        07700000
   @INREC:=@BUFFAREA+I*RECSIZE;                                <<03571>>07702000
   @DINREC:=@INREC;                                                     07704000
   INREC:="  ";                                                <<04886>>07706000
   MOVE INREC(1):=INREC, ((BLKFACTOR-I)*RECSIZE-1);            <<03571>>07708000
   INREC(CODE):=CRASH;                                                  07710000
   DO                                                                   07712000
   BEGIN                                                                07714000
   INREC(DATE) := CALENDAR;                                    <<03571>>07716000
   DINREC(TIME):=CLOCK;                                                 07718000
   DINREC(RNUM):=CURRREC:=CURRREC+1D;                                   07720000
      X:=RECSIZEM1;                                            <<03571>>07722000
      TOS:=-1;                                                          07724000
      DO                                                                07726000
      BEGIN                                                             07728000
         IF X<>CKSUM THEN                                               07730000
         TOS:=TOS XOR INREC(X);                                         07732000
      END UNTIL (X:=X-1) < 0;                                           07734000
      INREC(CKSUM):=TOS;                                                07736000
      @INREC:=@INREC+RECSIZE;                                  <<03571>>07738000
      @DINREC:=@INREC;                                                  07740000
                                                                        07742000
   END UNTIL(I:=I+1) >= BLKFACTOR;                                      07744000
END;                                                                    07746000
                                                                        07748000
                                                                        07750000
                                                                        07752000
                                                                        07754000
SUBROUTINE GETFNAME;                                           <<03566>>07756000
                                                               <<03566>>07758000
<< Gets logging file name from the tables.  >>                 <<03566>>07760000
<< ENTRY,EXIT - DB is at LOGDST.            >>                 <<03566>>07762000
                                                               <<03566>>07764000
BEGIN                                                          <<03566>>07766000
                                                               <<03566>>07768000
   DB := EXCHANGEDB(DB);      << Back to stack >>              <<03566>>07770000
                                                               <<03566>>07772000
   FNAME := 0;                                                 <<03566>>07774000
   MOVE FNAME(1) := FNAME, (36);                               <<03566>>07776000
                                                               <<03566>>07778000
   FENTRY(IDENTIFIER,,FNAME);                                  <<03566>>07780000
                                                               <<03566>>07782000
   DB := EXCHANGEDB(DB);      << Back to LOGDST >>             <<03566>>07784000
                                                               <<03566>>07786000
   IF LOGTAB(LGTYPE) <> DISC  THEN FNAME(8) := 0;              <<03572>>07788000
                                                               <<03566>>07790000
                                                               <<03566>>07792000
END;                                                           <<03566>>07794000
                                                               <<03566>>07796000
                                                               <<03566>>07798000
                                                               <<03566>>07800000
                                                               <<04886>>07802000
   << Turn traps off >>                                        <<04886>>07804000
                                                               <<04886>>07806000
   ASSEMBLE(PSHR %10);                                                  07808000
   TOS.(2:1):=0;                                                        07810000
   ASSEMBLE(SETR %10);                                                  07812000
                                                               <<04886>>07814000
   MOVE DEV:="DISC ";                                                   07816000
   MOVE OUTPUT1:="  ";                                                  07818000
   MOVE OUTPUT1(1):=OUTPUT1,(18);                                       07820000
   NOTIFIED := FALSE;                                          <<03732>>07822000
   DB:=EXCHANGEDB(LOGDST);                                              07824000
   B:=GETSIR(LOGSIR);                                                   07826000
   IF LOGTAB(NUMENTRIES) = 0 THEN                                       07828000
   BEGIN                                                                07830000
      <<LOGGING NOT IN USE, GO EXIT>>                                   07832000
      RELSIR(LOGSIR,B);                                                 07834000
      GO OUT;                                                           07836000
   END;                                                                 07838000
                                                                        07840000
   IF (TABINDEX:=LOGTAB(INUSE)) = NULL  THEN                   <<03571>>07842000
   BEGIN                                                                07844000
      RELSIR(LOGSIR,B);                                                 07846000
      GO OUT;                                                           07848000
   END;                                                                 07850000
   DO LOGTAB(STATUS):=RECOVERING                               <<03571>>07852000
    UNTIL (TABINDEX:=LOGTAB(NEXT)) = NULL;                     <<03571>>07854000
                                                               <<03571>>07856000
   TABINDEX:=LOGTAB(INUSE);                                             07858000
   RELSIR(LOGSIR,B);                                                    07860000
   DO                                                                   07862000
   BEGIN           <<Recover loop>>                            <<03571>>07864000
      IF LOGTAB(LGTYPE) = DISC THEN                                     07866000
      BEGIN                                   <<DISC LOGGING>>          07868000
         NUMOPEN:=NUMCLOSE:=0;                                          07870000
         VALID:=TRUE;                                                   07872000
         EOFORERR:=FALSE;                                               07874000
         I:=0;                                                          07876000
         DO IDENTIFIER(I):=BLOGTAB(LGNAME+I) UNTIL (I:=I+1)             07878000
         >=8;                                                           07880000
         IDENTIFIER(8):=0;                                              07882000
         GETFNAME;                                             <<03566>>07884000
         SAVE:=LOGTAB(NEXT);                                            07886000
         DB:=EXCHANGEDB(DB);                 <<BACK TO STACK>>          07888000
         @INREC:=@DINREC:=@BUFFAREA;                                    07890000
         @OUTREC:=@BUFFAREA;                                            07892000
         TOS:=GENMSG(SETNO,LOGRECOV,0,@IDENTIFIER,,,,,0);      <<03571>>07894000
         MOVE DEV:="DISC ";                                             07896000
                                                               <<04886>>07898000
         << Log file: old perm, fixed, ascii, read/write,    >><<04886>>07900000
         << multi-rec, no buf, exc, no :FILE.                >><<04886>>07902000
                                                               <<04886>>07904000
         LOGFILENO:=FOPEN(FNAME,%2005,%524,DEV);               <<04886>>07906000
         IF <> THEN                                                     07908000
         BEGIN                                                          07910000
            <<UNABLE TO OPEN LOGGING FILE>>                             07912000
            FCHECK(LOGFILENO,ERRCODE);                         <<04888>>07914000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>07916000
            GENMSG(SETNO,UOPENFAILED,0,@IDENTIFIER,,,,,0);     <<04888>>07918000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>07920000
            NOTIFIED := TRUE;                                  <<03732>>07922000
            GO NEXTONE;                                        <<03732>>07924000
         END;                                                           07926000
         FGETINFO(LOGFILENO,,,,,,,,,,EOF);                              07928000
         IF <> THEN                                            <<03571>>07930000
         BEGIN                                                 <<03571>>07932000
            FCHECK(LOGFILENO,ERRCODE);                         <<04888>>07934000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>07936000
            GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,,,,,0);       <<04888>>07938000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>07940000
            NOTIFIED := TRUE;                                  <<03732>>07942000
            GO NEXTONE;                                        <<03571>>07944000
         END;                                                  <<03571>>07946000
         RECNUM:=0D;                                                    07948000
         CURRREC:=0D;                                                   07950000
         DO                                                             07952000
         BEGIN                                                          07954000
            FREAD(LOGFILENO,BUFFAREA,BLKSIZE);                          07956000
            IF <> THEN EOFORERR:=TRUE;                                  07958000
            @INREC:=@BUFFAREA;                                          07960000
            @DINREC:=@BUFFAREA;                                         07962000
            CHECKBLOCK;                                                 07964000
            IF NOT VALID THEN                                           07966000
            BEGIN                                                       07968000
               IF CURRREC = 1D  THEN                           <<03732>>07970000
               BEGIN                                           <<03732>>07972000
                  GENMSG(SETNO,LOGEMPTY,0,@IDENTIFIER,,,,,0);  <<03732>>07974000
                  NOTIFIED := TRUE;                            <<03732>>07976000
                  GO NEXTONE;                                  <<03732>>07978000
               END;                                            <<03732>>07980000
                                                               <<03732>>07982000
               IF NOT EOFORERR THEN FSPACE(LOGFILENO,-1);               07984000
               CURRREC:=CURRREC-1D;                                     07986000
               NUMRECOVERED:=CURRREC;                                   07988000
               FORMATCRASH;                                             07990000
               FWRITE(LOGFILENO,BUFFAREA,BLKSIZE,0);                    07992000
               IF < THEN                                       <<03571>>07994000
               BEGIN                                           <<03571>>07996000
                  FCHECK(LOGFILENO,ERRCODE);                   <<04888>>07998000
                  GENMSG(FSSETNO,ERRCODE,,,,,,,0);             <<04888>>08000000
                 GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,,,,,0);<<04888>>08002000
                  GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);  <<03571>>08004000
                  NOTIFIED := TRUE;                            <<03732>>08006000
                  GO NEXTONE;                                  <<03571>>08008000
               END;                                            <<03571>>08010000
               IF > THEN                                       <<03571>>08012000
               BEGIN                                           <<03571>>08014000
                  FCHECK(LOGFILENO,ERRCODE);                   <<04888>>08016000
                  GENMSG(FSSETNO,ERRCODE,,,,,,,0);             <<04888>>08018000
                  GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,      <<04888>>08020000
                         ,,,,0);                               <<04888>>08022000
                  GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);  <<03571>>08024000
                  NOTIFIED := TRUE;                            <<03732>>08026000
                  GO NEXTONE;                                  <<03571>>08028000
               END;                                            <<03571>>08030000
            END;                                                        08032000
         END UNTIL EOFORERR OR NOT VALID;                               08034000
                                                               <<03571>>08036000
         FCONTROL(LOGFILENO,6,PARM);                                    08038000
         IF <> THEN                                            <<03571>>08040000
         BEGIN                                                 <<03571>>08042000
            FCHECK(LOGFILENO,ERRCODE);                         <<04888>>08044000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>08046000
            GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,,,,,0);     <<04888>>08048000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>08050000
            NOTIFIED := TRUE;                                  <<03732>>08052000
            GO NEXTONE;                                        <<03571>>08054000
         END;                                                  <<03571>>08056000
                                                               <<03571>>08058000
         LEN:=DASCII(NUMRECOVERED,10,OUTPUT1);                          08060000
         OUTPUT1(LEN):=0;                                               08062000
         LEN:=ASCII(NUMOPEN,10,OUTPUT2);                                08064000
         OUTPUT2(LEN):=0;                                               08066000
         LEN:=ASCII(NUMCLOSE,10,OUTPUT3);                               08068000
         OUTPUT3(LEN):=0;                                               08070000
         GENMSG(SETNO,LOGREC,0,@OUTPUT1,@IDENTIFIER,@OUTPUT2,  <<03571>>08072000
                @OUTPUT3);                                     <<03571>>08074000
      END          << DISC LOGGING >>                          <<03571>>08076000
      ELSE                                                              08078000
      BEGIN                                                             08080000
         <<TAPE LOGGING>>                                               08082000
         NUMOPEN:=NUMCLOSE:=0;                                          08084000
         I := 0;                                               <<03571>>08086000
         VALID:=TRUE;                                                   08088000
         EOFORERR:=FALSE;                                               08090000
         I := 0;                                               <<03571>>08092000
         DO  BUFNAME(I) := " " UNTIL (I:=I+1) >= 16;           <<03571>>08094000
         I:=0;                                                          08096000
         DO BUFNAME(I):=BLOGTAB(BNAME+I) UNTIL (I:=I+1) >= 8;           08098000
         I:=0;                                                          08100000
         DO IDENTIFIER(I):=BLOGTAB(LGNAME+I) UNTIL (I:=I+1) >=8;        08102000
         IDENTIFIER(8):=0;                                              08104000
         GETFNAME;                                             <<03566>>08106000
         SAVE:=LOGTAB(NEXT);                                            08108000
         I := LOGTAB(LGTYPE);   << Save the type >>            <<03572>>08110000
         DB:=EXCHANGEDB(DB);                 <<BACK TO STACK>>          08112000
         TOS:=GENMSG(SETNO,LOGRECOV,0,@IDENTIFIER,,,,,0);      <<03571>>08114000
         @INREC:=@BUFFAREA;                                             08116000
         @DINREC:=@BUFFAREA;                                            08118000
         @BINREC:=2*@BUFFAREA;                                          08120000
         CASE I OF                                             <<03572>>08122000
         BEGIN                                                 <<03572>>08124000
            <<0>>  ;         << Disc - never get here >>       <<03572>>08126000
            <<1>>  MOVE DEV := "TAPE ";                        <<03572>>08128000
            <<2>>  MOVE DEV := "SDISC ";                       <<03572>>08130000
            <<3>>  MOVE DEV := "CTAPE ";                       <<03572>>08132000
         END;                                                  <<03572>>08134000
                                                               <<03572>>08136000
         MOVE FORMS:=".,,,,; ";                                         08138000
                                                               <<04886>>08140000
         << Log file: old perm or temp, fixed, ascii, exc,  >> <<04886>>08142000
         << read/write, multi-rec, no buf, labeled tape.    >> <<04886>>08144000
                                                               <<04886>>08146000
         LOGFILENO:=FOPEN(FNAME,%3007,%524,RECSIZE,DEV,FORMS,, <<04886>>08148000
                    BLKFACTOR);                                <<03571>>08150000
         IF <> THEN                                                     08152000
         BEGIN                                                          08154000
            FCHECK(LOGFILENO,ERRCODE);                         <<04888>>08156000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>08158000
            GENMSG(SETNO,TOPENFAILED,0,@IDENTIFIER,,,,,0);     <<04888>>08160000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>08162000
            NOTIFIED := TRUE;                                  <<03732>>08164000
            GO NEXTONE;                                        <<03732>>08166000
         END;                                                           08168000
                                                               <<04886>>08170000
         MOVE DEV:="DISC ";                                             08172000
                                                               <<04886>>08174000
         << Buffer file: old perm, fixed, ascii, no :FILE,   >><<04886>>08176000
         << read/write, multi-rec, no buf, exc.              >><<04886>>08178000
                                                               <<04886>>08180000
         BUFFILENO:=FOPEN(BUFNAME,%2005,%524,RECSIZE,DEV);     <<04886>>08182000
         IF <> THEN                                                     08184000
         BEGIN                                                          08186000
            FCHECK(BUFFILENO,ERRCODE);                         <<04888>>08188000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>08190000
            GENMSG(SETNO,BOPENFAILED,0,@IDENTIFIER,,,,,0);     <<04888>>08192000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<04888>>08194000
                                                                        08196000
            <<ERROR OPENING BUFFER>>                                    08198000
                                                                        08200000
            NOTIFIED := TRUE;                                  <<03732>>08202000
            GO NEXTONE;                                        <<03732>>08204000
         END;                                                           08206000
         FGETINFO(BUFFILENO,,,,,,,,,,EOF);                              08208000
         IF <> THEN                                            <<03571>>08210000
         BEGIN                                                 <<03571>>08212000
            FCHECK(BUFFILENO,ERRCODE);                         <<04888>>08214000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>08216000
            GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,,,,,0);       <<04888>>08218000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>08220000
            NOTIFIED := TRUE;                                  <<03732>>08222000
            GO NEXTONE;                                        <<03571>>08224000
         END;                                                  <<03571>>08226000
         FGETINFO(LOGFILENO,,,,,,TAPEDEV);                     <<03571>>08228000
         IF <> THEN                                            <<03571>>08230000
         BEGIN                                                 <<03571>>08232000
            FCHECK(LOGFILENO,ERRCODE);                         <<04888>>08234000
            GENMSG(FSSETNO,ERRCODE,,,,,,,0);                   <<04888>>08236000
            GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,,,,,0);       <<04888>>08238000
            GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        <<03571>>08240000
            NOTIFIED := TRUE;                                  <<03732>>08242000
            GO NEXTONE;                                        <<03571>>08244000
         END;                                                  <<03571>>08246000
                                                               <<03571>>08248000
         CURRREC:=0D;                                                   08250000
         LASTREC:=0D;                                                   08252000
         DO                                                             08254000
         BEGIN                                                          08256000
           <<Main loop - tape logging>>                        <<03571>>08258000
            FREAD(LOGFILENO,BUFFAREA,BLKSIZE);                          08260000
            IF <> THEN EOFORERR:=TRUE;                                  08262000
            @INREC:=@BUFFAREA;                                          08264000
            @DINREC:=@BUFFAREA;                                         08266000
            CHECKBLOCK;                                                 08268000
            IF VALID THEN                                               08270000
            BEGIN                                                       08272000
               @INREC:=@INREC-RECSIZE;                         <<03571>>08274000
               @DINREC:=@INREC;                                         08276000
               LASTREC:=DINREC(RNUM);                                   08278000
            END                                                         08280000
            ELSE                                                        08282000
            BEGIN                                                       08284000
              <<Bad block from tape>>                          <<03571>>08286000
               IF CURRREC = 1D OR LASTREC = 0D THEN                     08288000
               BEGIN                                                    08290000
                  << Tape file empty -- set flag to get out >> <<03571>>08292000
                  EOFORERR := TRUE;                            <<03571>>08294000
                                                               <<03571>>08296000
                  << Backspace to start of data >>             <<03571>>08298000
                                                               <<03571>>08300000
                  STAT:=ATTACHIO(TAPEDEV,QMISC,0,@BUFFAREA,    <<04888>>08302000
                                 BKSPACE,0,0,0,FLAGS);         <<04888>>08304000
                  IF STAT0.(13:3) <> SUCCESS  AND              <<04888>>08306000
                     STAT0.(8:8) <> FEOF           THEN        <<04888>>08308000
                  BEGIN    << Error, but not EOF >>            <<03571>>08310000
                     ERRCODE := IOSTAT(STAT0);                 <<04888>>08312000
                     GENMSG(FSSETNO,ERRCODE,,,,,,,0);          <<04888>>08314000
                     GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,   <<04888>>08316000
                            ,,,,0);                            <<04888>>08318000
                     GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);        08320000
                     NOTIFIED := TRUE;                         <<03732>>08322000
                     GO NEXTONE;                               <<00793>>08324000
                  END;                                         <<00793>>08326000
               END    <<Empty file>>                           <<03571>>08328000
               ELSE                                                     08330000
               BEGIN                                                    08332000
                  << Found the bad block.  Rewind to beginning><<03571>>08334000
                  << of data.                                 ><<03571>>08336000
                                                               <<03571>>08338000
                  << Rewind back to Load Point.           >>   <<03571>>08340000
                                                               <<03571>>08342000
                  STAT:=ATTACHIO(TAPEDEV,0,0,0,REWIND,0,0,0,1);<<04888>>08344000
                  IF STAT0.(13:3) <> SUCCESS THEN              <<04888>>08346000
                  BEGIN                                        <<03571>>08348000
                     ERRCODE := IOSTAT(STAT0);                 <<04888>>08350000
                     GENMSG(FSSETNO,ERRCODE,,,,,,,0);          <<04888>>08352000
                     GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,     <<04888>>08354000
                            ,,,,0);                            <<04888>>08356000
                    GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);<<04888>>08358000
                     NOTIFIED := TRUE;                         <<03732>>08360000
                     GO NEXTONE;                               <<03571>>08362000
                  END;                                         <<03571>>08364000
                                                               <<03571>>08366000
                  << Now skip over label stuff to the data >>  <<03571>>08368000
                                                               <<03571>>08370000
                  STAT:=ATTACHIO(TAPEDEV,0,0,0,FORWRD,0,0,0,1);<<04888>>08372000
                  IF STAT0.(13:3) <> SUCCESS  AND              <<04888>>08374000
                     STAT0.(8:8) <> FEOF       THEN            <<04888>>08376000
                  BEGIN                                        <<03571>>08378000
                     ERRCODE := IOSTAT(STAT0);                 <<04888>>08380000
                     GENMSG(FSSETNO,ERRCODE,,,,,,,0);          <<04888>>08382000
                     GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,     <<04888>>08384000
                            ,,,,0);                            <<04888>>08386000
                    GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);<<04888>>08388000
                     NOTIFIED := TRUE;                         <<03732>>08390000
                     GO NEXTONE;                               <<03571>>08392000
                  END;                                         <<03571>>08394000
                                                               <<03571>>08396000
                  << Now find the last good block >>           <<03571>>08398000
                                                               <<03571>>08400000
                  STOPPER := (LASTREC+1D) - DOUBLE(BLKFACTOR); <<03732>>08402000
                  IF STOPPER < 1D  THEN STOPPER := 1D;         <<03571>>08404000
                                                               <<03571>>08406000
                  DO                                           <<03571>>08408000
                   BEGIN                                       <<03571>>08410000
                      LEN := FREAD(LOGFILENO,BUFFAREA,BLKSIZE);<<03571>>08412000
                      IF  <>  OR  LEN = 0  THEN                <<03571>>08414000
                      BEGIN                                    <<03571>>08416000
                        FCHECK(LOGFILENO,ERRCODE);             <<04888>>08418000
                        GENMSG(FSSETNO,ERRCODE,,,,,,,0);       <<04888>>08420000
                        GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,  <<04888>>08422000
                               ,,,,0);                         <<04888>>08424000
                        GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,   <<04888>>08426000
                               ,,,,0);                         <<04888>>08428000
                        NOTIFIED := TRUE;                      <<03732>>08430000
                        GO NEXTONE;                            <<03571>>08432000
                      END;                                     <<03571>>08434000
                   END                                         <<03571>>08436000
                  UNTIL  DBUFFAREA(RNUM) = STOPPER;            <<03732>>08438000
                                                               <<03571>>08440000
                  << Set flag to get out >>                    <<03571>>08442000
                                                               <<03571>>08444000
                  EOFORERR := TRUE;                            <<03571>>08446000
               END;     << Bad block from tape >>              <<03571>>08448000
           END;         << Main loop - tape recovery >>        <<03571>>08450000
         END       << Main loop - tape logging>>               <<03571>>08452000
        UNTIL NOT VALID  OR  EOFORERR;                         <<03571>>08454000
                                                               <<03571>>08456000
         @INREC:=@DISCREC;                                              08458000
         @DINREC:=@INREC;                                               08460000
         RECNUM:=-1D;                                                   08462000
         EOFORERR:=FALSE;                                               08464000
         VALID:=TRUE;                                                   08466000
         DO                                                             08468000
         BEGIN                                                          08470000
            FREADDIR(BUFFILENO,DISCREC,RECSIZE,                <<03571>>08472000
                      (RECNUM:=RECNUM+1D));                    <<03571>>08474000
            IF <> THEN EOFORERR:=TRUE;                                  08476000
         END UNTIL EOFORERR OR (DDISCREC(RNUM)=LASTREC+1D);             08478000
                                                               <<04886>>08480000
         IF EOFORERR THEN                                               08482000
         BEGIN                                                          08484000
            IF LASTREC = 0D AND RECNUM = 0D  THEN              <<03571>>08486000
            BEGIN         << Disc buffer and logfile empty >>  <<03571>>08488000
                          << nothing to recover.           >>  <<03571>>08490000
               GENMSG(SETNO,LOGEMPTY,0,@IDENTIFIER,,,,,0);     <<03571>>08492000
               NOTIFIED := TRUE;                               <<03732>>08494000
               GO NEXTONE;                                     <<03571>>08496000
            END;                                               <<03571>>08498000
                                                               <<03571>>08500000
            NUMRECOVERED := CURRREC := LASTREC;                <<03732>>08502000
            FORMATCRASH;                                                08504000
            FWRITE(LOGFILENO,BUFFAREA,BLKSIZE,0);                       08506000
            IF <> THEN                                         <<03571>>08508000
            BEGIN                                              <<03571>>08510000
               FCHECK(LOGFILENO,ERRCODE);                      <<04888>>08512000
               GENMSG(FSSETNO,ERRCODE,,,,,,,0);                <<04888>>08514000
               GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,,,,,0);  <<04888>>08516000
               GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);     <<03571>>08518000
               NOTIFIED := TRUE;                               <<03732>>08520000
               GO NEXTONE;                                     <<03571>>08522000
            END;                                               <<03571>>08524000
         END                                                            08526000
         ELSE                                                           08528000
         BEGIN                                                          08530000
            << When we get here, we have found the last good >><<03732>>08532000
            << block from the logfile and the first block    >><<03732>>08534000
            << needed from the buffer file. We need to update>><<03732>>08536000
            << CURRREC so that when we get ready to output   >><<03732>>08538000
            << where we left off, the log records will be in >><<03732>>08540000
            << sequence.                                     >><<03732>>08542000
                                                               <<03732>>08544000
            CURRREC := LASTREC;                                <<03732>>08546000
                                                               <<03732>>08548000
            DO                                                          08550000
            BEGIN                                                       08552000
                                                               <<03572>>08554000
               FREADDIR(BUFFILENO,BUFFAREA,BLKSIZE,RECNUM);             08556000
               IF <> THEN                                      <<03571>>08558000
               BEGIN                                           <<03571>>08560000
                  FCHECK(BUFFILENO,ERRCODE);                   <<04888>>08562000
                  GENMSG(FSSETNO,ERRCODE,,,,,,,0);             <<04888>>08564000
                  GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,,,,,0); <<04888>>08566000
                  GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);  <<03571>>08568000
                  NOTIFIED := TRUE;                            <<03732>>08570000
                  GO NEXTONE;                                  <<03571>>08572000
               END;                                            <<03571>>08574000
                                                               <<03732>>08576000
               @INREC:=@BUFFAREA;                                       08578000
               @DINREC:=@BUFFAREA;                                      08580000
               CHECKBLOCK;                                              08582000
               IF VALID THEN                                            08584000
               BEGIN                                                    08586000
                  FWRITE(LOGFILENO,BUFFAREA,BLKSIZE,0);                 08588000
                  IF <> THEN                                   <<03571>>08590000
                  BEGIN                                        <<03571>>08592000
                   FCHECK(LOGFILENO,ERRCODE);                  <<04888>>08594000
                   GENMSG(FSSETNO,ERRCODE,,,,,,,0);            <<04888>>08596000
                   GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,     <<04888>>08598000
                          ,,,,0);                              <<04888>>08600000
                   GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0); <<03571>>08602000
                   NOTIFIED := TRUE;                           <<03732>>08604000
                   GO NEXTONE;                                 <<03571>>08606000
                  END;                                         <<03571>>08608000
                  RECNUM:=RECNUM+DOUBLE(BLKFACTOR);                     08610000
                  IF RECNUM >= EOF THEN RECNUM:=0D;                     08612000
                                                               <<03732>>08614000
                  << Bump LASTREC to remember the last     >>  <<03732>>08616000
                  << record successfully recovered.        >>  <<03732>>08618000
                                                               <<03732>>08620000
                  LASTREC := LASTREC + DOUBLE(BLKFACTOR);      <<03732>>08622000
               END                                                      08624000
               ELSE                                                     08626000
               BEGIN                                                    08628000
                  << Need to bump CURRREC to reflect the     >><<03732>>08630000
                  << current # of good records found. LASTREC>><<03732>>08632000
                  << is the # actuallly written to the       >><<03732>>08634000
                  << logfile, I is the number of good records>><<03732>>08636000
                  << found in the last block from the buffer >><<03732>>08638000
                  << file.                                   >><<03732>>08640000
                                                               <<03732>>08642000
                  CURRREC := LASTREC + DOUBLE(I);              <<03732>>08644000
                  NUMRECOVERED:=CURRREC;                                08646000
                  FORMATCRASH;                                          08648000
                                                               <<04886>>08650000
                  FWRITE(LOGFILENO,BUFFAREA,BLKSIZE,0);                 08652000
                  IF <> THEN                                   <<03571>>08654000
                  BEGIN                                        <<03571>>08656000
                   FCHECK(LOGFILENO,ERRCODE);                  <<04888>>08658000
                   GENMSG(FSSETNO,ERRCODE,,,,,,,0);            <<04888>>08660000
                   GENMSG(SETNO,FWRITEERROR,0,@IDENTIFIER,     <<04888>>08662000
                          ,,,,0);                              <<04888>>08664000
                   GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0); <<03571>>08666000
                   NOTIFIED := TRUE;                           <<03732>>08668000
                   GO NEXTONE;                                 <<03571>>08670000
                  END;                                         <<03571>>08672000
               END;                                                     08674000
            END UNTIL NOT VALID OR EOFORERR;                            08676000
                                                               <<04886>>08678000
         END;                                                           08680000
         LEN:=DASCII(NUMRECOVERED,10,OUTPUT1);                          08682000
         OUTPUT1(LEN):=0;                                               08684000
         LEN:=ASCII(NUMOPEN,10,OUTPUT2);                                08686000
         OUTPUT2(LEN):=0;                                               08688000
         LEN:=ASCII(NUMCLOSE,10,OUTPUT3);                               08690000
         OUTPUT3(LEN):=0;                                               08692000
         GENMSG(SETNO,LOGREC,0,@OUTPUT1,@IDENTIFIER,@OUTPUT2,  <<03571>>08694000
                @OUTPUT3);                                     <<03571>>08696000
      END;         <<Tape logging>>                            <<03571>>08698000
                                                               <<04886>>08700000
      NEXTONE:                                                          08702000
                                                               <<04886>>08704000
      RELENTRY(TABINDEX,0);                                             08706000
      FCLOSE(LOGFILENO,0,0);                                            08708000
      IF <> AND (NOT NOTIFIED) THEN                            <<03732>>08710000
      BEGIN                                                    <<03571>>08712000
         FCHECK(LOGFILENO,ERRCODE);                            <<04888>>08714000
         GENMSG(FSSETNO,ERRCODE,,,,,,,0);                      <<04888>>08716000
         GENMSG(SETNO,LOGRECERR,0,@IDENTIFIER,,,,,0);          <<04888>>08718000
         GENMSG(SETNO,NOLOGREC,0,@IDENTIFIER,,,,,0);           <<03571>>08720000
      END;                                                     <<03571>>08722000
      FCLOSE(BUFFILENO,4,0);                                            08724000
      DB:=EXCHANGEDB(LOGDST);                                           08726000
   END             <<Recover loop>>                            <<03571>>08728000
  UNTIL (TABINDEX:=SAVE) = NULL;                               <<03571>>08730000
   OUT:                                                                 08732000
                                                               <<04886>>08734000
   TOS:=EXCHANGEDB(DB);                                                 08736000
   <<LOGGING PROCESS RECOVERED>>                                        08738000
END;                                                                    08740000
$PAGE " USER LOGGING PROCESS STARTUP"                          <<04162>>20000000
PROCEDURE INITRECLOG;                                                   20002000
OPTION PRIVILEGED,UNCALLABLE;                                           20004000
BEGIN                                                                   20006000
                                                                        20008000
COMMENT                                                        <<03568>>20010000
  Called from Progen to initiate RECLOG (to recover open       <<03568>>20012000
  logging files). The logging files will only be recovered     <<03568>>20014000
  during a WARMSTART since any other start will re-initialize  <<03568>>20016000
  the LOGTAB (DST %33) such that there are no current logging  <<03568>>20018000
  processes.                                                   <<03568>>20020000
;                                                              <<03568>>20022000
                                                               <<03568>>20024000
                                                               <<03568>>20026000
   INTEGER CLEANUPIN:=0,STACK,DB;                                       20028000
   LOGICAL NOSTDIN:=0, NOSTDLIST:=0;     << FOR PROCREATE >>   <<01200>>20030000
   EQUATE NOSTRING=0, NOSTLEN=0;                               <<01200>>20032000
                                                               <<03568>>20034000
   STACK:=GETSTACK(INITSTACK,MAXSTACK);                                 20036000
   TOS:=@CLEANUPIN;                                                     20038000
   IF STACK <> 0 THEN                                                   20040000
   BEGIN                                                                20042000
      TOS:=A'(RECLOGPLABEL);                                            20044000
                                                               <<03568>>20046000
      << The external P-label is in the form:                >><<03568>>20048000
      << STT entry, code segment number. PROCREATE only needs>><<03568>>20050000
      << the code segment number.                            >><<03568>>20052000
                                                               <<03568>>20054000
      TOS.(0:8):=0;                                                     20056000
      TOS.(0:1):=1;                                                     20058000
                                                               <<03568>>20060000
      << Also need the Delta P-label - starting offset within>><<03568>>20062000
      << the code segment for the procedure.                 >><<03568>>20064000
                                                               <<03568>>20066000
      TOS:=A'(RECLOGDELTAP);                                            20068000
      PROCREATE(*,*,*,STACK,GLOBSIZE,0,LOCSIZE,PRI,NOSTRING,   <<01200>>20070000
                NOSTLEN,0,%713,MAXSTACK,NOSTDIN,NOSTDLIST);    <<01200>>20072000
      IF = THEN                                                         20074000
      BEGIN            << Procreate was successfull >>         <<03568>>20076000
      DB:=EXCHANGEDB(STACK);                                            20078000
                                                               <<04162>>20080000
      << Set up the primary DB area of the stack. The only   >><<04162>>20082000
      << global variables used by RECLOG are BUFFAREA and    >><<04162>>20084000
      << DISCREC - need to set up their pointers.            >><<04162>>20086000
                                                               <<04162>>20088000
      PDB(5) := %67;            << Word addr for BUFFAREA    >><<04162>>20090000
      PDB(6) := %10067;         << Word addr for DISCREC     >><<04162>>20092000
                                                               <<04162>>20094000
      TOS:=EXCHANGEDB(DB);                                              20096000
      AWAKE(CLEANUPIN*PCBSIZE,%1,0);                                    20098000
      END;                                                     <<03568>>20100000
                                                               <<03568>>20102000
   END;                                                                 20104000
END;                                                                    20106000
                                                                        20108000
$TITLE     "USER LOGGING PROCESS CLEANUP"                               20110000
$PAGE                                                                   20112000
PROCEDURE CLEANUPLOG;                                                   20114000
OPTION PRIVILEGED,UNCALLABLE;                                           20116000
BEGIN                                                                   20118000
                                                                        20120000
                                                                        20122000
<<USER LOGGING PROCESS TERMINATION CLEANUP>>                            20124000
                                                                        20126000
                                                                        20128000
   LOGICAL POINTER PXFIXED;                                             20130000
   LOGICAL POINTER S0 = S-0;                                            20132000
   INTEGER DB,DB2;                                                      20134000
   INTEGER SAVEINDEX;                                          <<00644>>20136000
   INTEGER INDEX,TABINDEX;                                              20138000
   LOGICAL A;                                                           20140000
                                                               <<03568>>20142000
                                                               <<03568>>20144000
   DB:=EXCHANGEDB(0);                                                   20146000
   PUSH(DL);                                                            20148000
   ASSEMBLE(DUP);                                                       20150000
   TOS:=TOS-2;                                                          20152000
   TOS:=S0;                                                             20154000
   ASSEMBLE(XCH,DEL,SUB);                                               20156000
   @PXFIXED:=TOS;                                                       20158000
   IF PXFIXED(22).(1:1) = 1 THEN                                        20160000
   BEGIN                                                                20162000
      PXFIXED(22).(1:1):=0;                                             20164000
      TOS:=EXCHANGEDB(LOGDST);                                          20166000
      A:=GETSIR(LOGSIR);                                       <<00774>>20168000
      TABINDEX:=LOGTAB(INUSE);                                          20170000
      IF TABINDEX = NULL THEN                                           20172000
      BEGIN                                                             20174000
         RELSIR(LOGSIR,A);                                     <<00774>>20176000
         TOS:=EXCHANGEDB(DB);                                           20178000
         RETURN;                                                        20180000
      END;                                                              20182000
                                                               <<00774>>20184000
      DO                                                                20186000
      BEGIN                                                             20188000
                                                                        20190000
         DB2 := LOGTAB(DST);                                   <<04887>>20192000
         IF LOGTAB(STATUS) = INITIALIZING  OR                  <<04451>>20194000
            LOGTAB(STATUS) = RECOVERING THEN GO AROUND;        <<04451>>20196000
         IF DB2 = NULL THEN GO AROUND;                         <<04887>>20198000
         TOS:=EXCHANGEDB(LOGTAB(DST));                                  20200000
         TOS:=OBTAIN(DLOGBUFF(RESOURCE),NULL);                 <<00644>>20202000
         INDEX:=LOGBUFF(UHEAD);                                         20204000
                                                               <<00752>>20206000
         IF INDEX <> NULL THEN                                          20208000
         DO                                                             20210000
         BEGIN                                                          20212000
            IF LOGBUFF(UPIN) = MYPIN  THEN                     <<04162>>20214000
            BEGIN                                              <<00644>>20216000
               SAVEINDEX:=LOGBUFF(NENTRY);                     <<00644>>20218000
               RELENTRY(INDEX,DB2);                            <<00644>>20220000
               INDEX:=SAVEINDEX;                               <<00644>>20222000
            END                                                <<00644>>20224000
            ELSE INDEX:=LOGBUFF(NENTRY);                       <<00644>>20226000
                                                                        20228000
         END UNTIL INDEX = NULL;                               <<00644>>20230000
         RELEASE(DLOGBUFF(RESOURCE),NULL,1);                   <<00644>>20232000
         IF LOGBUFF(NUMUSER) = 0 THEN                                   20234000
         AWAKE(LOGBUFF(LOGPIN),%20,0);                                  20236000
AROUND:                                                        <<00752>>20238000
                                                                        20240000
                                                               <<00752>>20242000
         TOS:=EXCHANGEDB(LOGDST);                                       20244000
      END UNTIL (TABINDEX:=LOGTAB(NEXT)) = NULL;                        20246000
      RELSIR(LOGSIR,A);                                                 20248000
      TOS:=EXCHANGEDB(DB);                                              20250000
   END;                                                                 20252000
END;                                                                    20254000
$PAGE                                                                   20256000
$PAGE  "TABLE ACCESS UTILITIES"                                <<04162>>20258000
                                                                        20260000
PROCEDURE RELENTRY(INDEX',TYPE);                               <<04162>>20262000
VALUE INDEX',TYPE;                                                      20264000
INTEGER INDEX',TYPE;                                                    20266000
OPTION PRIVILEGED,UNCALLABLE;                                           20268000
BEGIN                                                                   20270000
                                                                        20272000
                                                                        20274000
   <<THIS PROCEDURE RELEASES LOGGING ENTRIES IN THE GLOBAL       >>     20276000
   <<LOGGING TABLE LOGTAB AND IN THE COMMUNICATION AREA OF LOGBUF>>     20278000
   <<TO SPECIFY THE GLOBAL TABLE, TYPE MUST BE ZERO.  TO SPECIFY >>     20280000
   <<AN ENTRY IN LOGBUFF, TYPE MUST BE SET TO THE DST NUMBER OF  >>     20282000
   <<LOGBUFF                                                     >>     20284000
   <<                                                            >>     20286000
   <<THE ADDRESS FOR THE  ENTRY TO BE DELETED SHOULD BE IN THE   >>     20288000
   <<INDEX PARAMETER.                                            >>     20290000
   <<                                                            >>     20292000
   << SPLIT STACK CALLS ARE NOT PERMITTED BY THIS PROCEDURE      >>     20294000
                                                                        20296000
                                                                        20298000
                                                                        20300000
   INTEGER X = X;                                                       20302000
   LOGICAL S0 = S-0;                                           <<00644>>20304000
   LOGICAL LOCK;                                               <<00644>>20306000
   INTEGER PREV',                                                       20308000
   NEXT',                                                               20310000
   FREEENTRY;                                                           20312000
                                                                        20314000
   LOGICAL A;                                                           20316000
   INTEGER TABINDEX,INDEX,DB;                                           20318000
   LOGICAL COND;                                                        20320000
                                                               <<03568>>20322000
                                                               <<03568>>20324000
   IF TYPE = 0 THEN                                                     20326000
   BEGIN                                                                20328000
      TABINDEX:=INDEX';                                                 20330000
      A:=GETSIR(LOGSIR);                                                20332000
      DB:=EXCHANGEDB(LOGDST);                                           20334000
      <<GLOBL LOGTAB>>                                                  20336000
      PREV':=LOGTAB(PREV);                                              20338000
      NEXT':=LOGTAB(NEXT);                                              20340000
      FREEENTRY:=TABINDEX;                                              20342000
      X:=FREEENTRY;                                            <<00789>>20344000
      DO                                                       <<00789>>20346000
      LOGTAB(X) := "  "                                        <<04886>>20348000
      UNTIL (X:=X+1) >= (FREEENTRY+TENTRYSIZE-2);              <<04886>>20350000
      LOGTAB(NEXT):=LOGTAB(FREE);                                       20352000
      LOGTAB(PREV):=NULL;                                               20354000
      LOGTAB(LGSWITCH) := FALSE;                               <<04886>>20356000
      LOGTAB(DST) := NULL;                                     <<04887>>20358000
                                                               <<04887>>20360000
      TABINDEX:=LOGTAB(FREE);                                           20362000
      LOGTAB(PREV):=FREEENTRY;                                          20364000
      LOGTAB(FREE):=FREEENTRY;                                          20366000
                                                                        20368000
      <<NOW REMOVE FROM IN USE>>                                        20370000
                                                                        20372000
      IF PREV' <> NULL THEN                                             20374000
      BEGIN                                                             20376000
         TABINDEX:=PREV';                                               20378000
         LOGTAB(NEXT):=NEXT';                                           20380000
      END;                                                              20382000
      IF NEXT' <> NULL THEN                                             20384000
      BEGIN                                                             20386000
         TABINDEX:=NEXT';                                               20388000
         LOGTAB(PREV):=PREV';                                           20390000
      END;                                                              20392000
      IF PREV' = NULL THEN LOGTAB(INUSE):=NEXT';                        20394000
      RELSIR(LOGSIR,A);                                                 20396000
      DB:=EXCHANGEDB(DB);                                               20398000
   END                                                                  20400000
   ELSE                                                                 20402000
   BEGIN                                                                20404000
      INDEX:=INDEX';                                                    20406000
      COND:=TRUE;                                                       20408000
      DB:=EXCHANGEDB(TYPE);                                             20410000
      TOS:=DLOGBUFF(RESOURCE);                                 <<00644>>20412000
      DEL;                                                     <<00644>>20414000
      IF S0.(0:8) = MYPIN/PCBSIZE  THEN                        <<04162>>20416000
      LOCK:=TRUE ELSE                                          <<00644>>20418000
      BEGIN                                                    <<00644>>20420000
         LOCK:=FALSE;                                          <<00644>>20422000
         TOS:=OBTAIN(DLOGBUFF(RESOURCE),NULL);                 <<00644>>20424000
         DEL;                                                  <<00644>>20426000
      END;                                                     <<00644>>20428000
      DEL;                                                              20430000
      PREV':=LOGBUFF(PENTRY);                                           20432000
      NEXT':=LOGBUFF(NENTRY);                                           20434000
      FREEENTRY:=INDEX;                                                 20436000
      X:=FREEENTRY;                                                     20438000
      DO                                                                20440000
      LOGBUFF(X) := "  "                                       <<04887>>20442000
      UNTIL (X:=X+1) >= (FREEENTRY+BENTRYSIZE-2);              <<04886>>20444000
      LOGBUFF(NENTRY):=LOGBUFF(FHEAD);                                  20446000
      LOGBUFF(PENTRY):=NULL;                                            20448000
      INDEX:=LOGBUFF(FHEAD);                                            20450000
      IF INDEX <> NULL THEN LOGBUFF(PENTRY):=FREEENTRY;                 20452000
      LOGBUFF(FHEAD):=FREEENTRY;                                        20454000
                                                                        20456000
      <<NOW REMOVE FROM IN USE>>                                        20458000
                                                                        20460000
      IF PREV' <> NULL THEN                                             20462000
      BEGIN                                                             20464000
         INDEX:=PREV';                                                  20466000
         LOGBUFF(NENTRY):=NEXT';                                        20468000
      END;                                                              20470000
      IF NEXT' <> NULL THEN                                             20472000
      BEGIN                                                             20474000
         INDEX:=NEXT';                                                  20476000
         LOGBUFF(PENTRY):=PREV';                                        20478000
      END;                                                              20480000
      IF PREV' = NULL THEN LOGBUFF(UHEAD):=NEXT';                       20482000
      LOGBUFF(NUMUSER):=LOGBUFF(NUMUSER)-1;                             20484000
      IF NOT LOCK THEN RELEASE(DLOGBUFF(RESOURCE),NULL,1);     <<00644>>20486000
      DB:=EXCHANGEDB(DB);                                               20488000
   END;                                                                 20490000
   WRITEDSEG(LOGDST);                                                   20492000
END;                                                                    20494000
$PAGE                                                          <<04162>>20496000
LOGICAL PROCEDURE GENTRY(INDEX',TYPE);                                  20498000
VALUE TYPE;                                                             20500000
INTEGER INDEX',TYPE;                                                    20502000
OPTION PRIVILEGED,UNCALLABLE;                                           20504000
BEGIN                                                                   20506000
                                                                        20508000
                                                                        20510000
   <<THIS PROCEDURE GETS A LOGGING ENTRY IN THE SYSTEM GLOBAL LOGGIN>>  20512000
   <<DATASEGMENT LOGTAB OR IN THE LOGGING PROCESS COMM AREA OF LOGBU>>  20514000
   <<IF AN ENTRY IS DESIRED IN THE LOGTAB, TYPE MUST BE SET TO ZERO >>  20516000
   <<IF AN ENTRY IS DESIRED IN LOGBUFF, TYPE MUST BE SET TO THE DST >>  20518000
   <<NUMBER OF LOGBUFF.                                             >>  20520000
   <<                                                               >>  20522000
   <<SPLIT STACK CALLS ARE NOT PERMITTED BY THIS PROCEDURE          >>  20524000
   <<                                                               >>  20526000
   <<THE RELATIVE ADDRESS WHERE THE AQUIRED ENTRY RESIDES IS RETURNE>>  20528000
   <<IN THE INDEX PARAMETER.                                        >>  20530000
   <<                                                        >><<04162>>20532000
   << RETURNS:                                           >>    <<04162>>20534000
   <<     TRUE - Entry obtained from table.              >>    <<04162>>20536000
   <<     FALSE- No more entries available.              >>    <<04162>>20538000
                                                                        20540000
                                                                        20542000
   LOGICAL A;                                                           20544000
   INTEGER DB;                                                          20546000
   LOGICAL LOCK;                                               <<04162>>20548000
   INTEGER                                                              20550000
   NEWENTRY,                                                            20552000
   QINDEX;                                                              20554000
   INTEGER TABINDEX,INDEX;                                              20556000
   LOGICAL S0 = S-0;                                                    20558000
                                                                        20560000
   IF TYPE = 0  THEN   <<Entry in LOGTAB>>                     <<03568>>20562000
   BEGIN                                                                20564000
      << GLOBL LOGGING TABLE >>                                         20566000
      A:=GETSIR(LOGSIR);                                                20568000
      DB:=EXCHANGEDB(LOGDST);                                           20570000
      TABINDEX:=LOGTAB(FREE);                                           20572000
      IF TABINDEX = NULL THEN                                           20574000
      BEGIN                                <<NO MORE ENTRIES>>          20576000
         GENTRY:=FALSE;                                                 20578000
         RELSIR(LOGSIR,A);                                              20580000
         EXCHANGEDB(DB);                                       <<04162>>20582000
         RETURN;                                                        20584000
      END;                                                              20586000
      NEWENTRY:=LOGTAB(FREE);                                           20588000
      <<REMOVE FROM FREE LIST>>                                         20590000
                                                                        20592000
      LOGTAB(FREE):=LOGTAB(NEXT);                                       20594000
      TABINDEX:=LOGTAB(FREE);                                  <<00789>>20596000
      LOGTAB(PREV):=NULL;                                               20598000
                                                               <<04886>>20600000
      <<ADD TO INUSE LIST>>                                             20602000
      TABINDEX:= IF LOGTAB(INUSE) = NULL THEN                           20604000
      NEWENTRY ELSE LOGTAB(INUSE);                                      20606000
      LOGTAB(PREV):= IF LOGTAB(INUSE) =NULL THEN                        20608000
      NULL ELSE NEWENTRY;                                               20610000
      TABINDEX:=NEWENTRY;                                               20612000
      LOGTAB(LGSWITCH) := FALSE;                               <<04886>>20614000
      LOGTAB(NEXT):=LOGTAB(INUSE);                                      20616000
      LOGTAB(INUSE):=NEWENTRY;                                          20618000
                                                               <<04886>>20620000
      <<UPDATE GLOBL ENTRIES>>                                          20622000
      LOGTAB(NUMENTRIES):=LOGTAB(NUMENTRIES)+1;                         20624000
      LOGTAB(DST) := NULL;                                     <<04887>>20626000
      RELSIR(LOGSIR,A);                                                 20628000
      GENTRY:=TRUE;                                                     20630000
      DB:=EXCHANGEDB(DB);                                               20632000
      INDEX':=NEWENTRY;                                                 20634000
   END                                                                  20636000
   ELSE                                                                 20638000
   BEGIN                                                                20640000
      <<Entry in LOGBUFF; TYPE = buffer dst>>                  <<03568>>20642000
      DB:=EXCHANGEDB(TYPE);                                             20644000
      TOS:=DLOGBUFF(RESOURCE);                                          20646000
      DEL;                                                              20648000
      IF S0.(0:8) = MYPIN/PCBSIZE                              <<04162>>20650000
        THEN LOCK := TRUE                                      <<03568>>20652000
      ELSE                                                     <<03568>>20654000
      BEGIN                                                             20656000
         LOCK:=FALSE;                                                   20658000
         TOS:=OBTAIN(DLOGBUFF(RESOURCE),NULL);                          20660000
         DEL;                                                           20662000
      END;                                                              20664000
      INDEX:=LOGBUFF(FHEAD);                                            20666000
      IF INDEX = NULL THEN                                              20668000
      BEGIN                                <<NO MORE ENTRIES>>          20670000
         IF NOT LOCK THEN RELEASE(DLOGBUFF(RESOURCE),NULL,1);           20672000
         DB:=EXCHANGEDB(DB);                                            20674000
         GENTRY:=FALSE;                                                 20676000
         RETURN;                                                        20678000
      END;                                                              20680000
      LOGBUFF(WSTATE):=ACT;  <<TO PREVENT WAKEUP>>                      20682000
      QINDEX:=INDEX;                                                    20684000
      NEWENTRY:=LOGBUFF(FHEAD);                                         20686000
                                                               <<04162>>20688000
      <<REMOVE FROM FREE LIST>>                                         20690000
      LOGBUFF(FHEAD):=LOGBUFF(NENTRY);                                  20692000
      QINDEX:=LOGBUFF(FHEAD);                                           20694000
      LOGBUFF(PENTRY):=NULL;                                            20696000
                                                               <<04162>>20698000
      <<ADD TO INUSE LIST>>                                             20700000
      INDEX:= IF LOGBUFF(UHEAD) = NULL THEN                             20702000
      NEWENTRY ELSE LOGBUFF(UHEAD);                                     20704000
      LOGBUFF(PENTRY):= IF LOGBUFF(UHEAD)=NULL THEN                     20706000
      NULL ELSE NEWENTRY;                                               20708000
      INDEX:=NEWENTRY;                                                  20710000
      LOGBUFF(NENTRY):=LOGBUFF(UHEAD);                                  20712000
      LOGBUFF(UHEAD):=NEWENTRY;                                         20714000
      <<UPDATE GLOBL ENTRIES>>                                          20716000
                                                                        20718000
      LOGBUFF(NUMUSER):=LOGBUFF(NUMUSER)+1;                             20720000
      IF NOT LOCK THEN RELEASE(DLOGBUFF(RESOURCE),NULL,1);              20722000
      DB:=EXCHANGEDB(DB);                                               20724000
      GENTRY:=TRUE;                                                     20726000
      INDEX':=NEWENTRY;                                                 20728000
   END;                                                                 20730000
   WRITEDSEG(LOGDST);                                                   20732000
END;                                                                    20734000
$PAGE                                                          <<04162>>20736000
LOGICAL PROCEDURE FINDLOG(LOGNAME,INDEX');                              20738000
INTEGER INDEX';                                                         20740000
BYTE ARRAY LOGNAME;                                                     20742000
OPTION PRIVILEGED,UNCALLABLE;                                           20744000
BEGIN                                                                   20746000
                                                                        20748000
                                                                        20750000
   <<THIS PROCEDURE FINDS THE ENTRY SPECIFIED BY LOGNAME IN THE  >>     20752000
   <<MASTER LOGGING DST.   THE INDEX INTO THE DST WHERE THE ENTRY>>     20754000
   <<RESIDES IS RETURNED IN THE INDEX PARAMETER.                 >>     20756000
   <<                                                            >>     20758000
   <<                                                            >>     20760000
   <<SPLIT STACK CALLS ARE NOT PERMITTED BY THIS PROCEDURE       >>     20762000
                                                                        20764000
                                                                        20766000
   LOGICAL A;                                                           20768000
   LOGICAL ARRAY ENTRY'(0:TENTRYSIZE-1) = Q;                   <<03568>>20770000
   BYTE ARRAY BENTRY'(*)=ENTRY';                                        20772000
   INTEGER TABINDEX,J,K;                                       <<04162>>20774000
                                                               <<03568>>20776000
                                                               <<03568>>20778000
   TABINDEX:=0;                                                         20780000
   FINDLOG:=TRUE;                                                       20782000
   A:=GETSIR(LOGSIR);                                                   20784000
   MOVE'FROM'DSEG(@ENTRY',LOGDST,INUSE,1);                     <<03567>>20786000
   IF ENTRY' = NULL THEN                                                20788000
   BEGIN                                                                20790000
      <<EMPTY DST>>                                                     20792000
      RELSIR(LOGSIR,A);                                                 20794000
      FINDLOG:=FALSE;                                                   20796000
      RETURN;                                                           20798000
   END;                                                                 20800000
   ENTRY'(NEXT):=ENTRY';                                                20802000
   MOVE LOGNAME:=LOGNAME WHILE AN,0;                                    20804000
   K:=TOS-@LOGNAME;                                                     20806000
   DO                                                                   20808000
   BEGIN                                                                20810000
      IF ENTRY'(NEXT) = NULL THEN                                       20812000
      BEGIN                                                             20814000
         FINDLOG:=FALSE;                                                20816000
         RELSIR(LOGSIR,A);                                              20818000
         RETURN;                                                        20820000
      END;                                                              20822000
      INDEX' := ENTRY'(NEXT);                                  <<03567>>20824000
      MOVE'FROM'DSEG(@ENTRY',LOGDST,ENTRY'(NEXT),TENTRYSIZE);  <<03567>>20826000
      IF BENTRY'(7) <> " " THEN J:=8                                    20828000
      ELSE                                                              20830000
      BEGIN                                                             20832000
         MOVE BENTRY':=BENTRY' WHILE AN,0;                              20834000
         J:=TOS-@BENTRY';                                               20836000
      END;                                                              20838000
   END                                                         <<03568>>20840000
  UNTIL  (BENTRY'=LOGNAME, (J)) AND (J=K);                     <<04162>>20842000
                                                               <<04162>>20844000
  IF ENTRY'(DST) = NULL AND (ENTRY'(STATUS) = ACT  LOR         <<04887>>20846000
                             ENTRY'(STATUS) = INACT)           <<04162>>20848000
    THEN FINDLOG := FALSE;                                     <<04162>>20850000
                                                               <<04162>>20852000
   RELSIR(LOGSIR,A);                                                    20854000
END;                                                                    20856000
$PAGE                                                                   20858000
$PAGE  "STARTLOG"                                              <<04162>>20860000
                                                                        20862000
LOGICAL PROCEDURE INITLOG(LOGNAME,TARGET);                              20864000
VALUE TARGET;                                                           20866000
INTEGER TARGET;                                                         20868000
BYTE ARRAY LOGNAME;                                                     20870000
OPTION PRIVILEGED,UNCALLABLE;                                           20872000
BEGIN                                                                   20874000
                                                                        20876000
COMMENT                                                        <<03568>>20878000
                                                               <<03568>>20880000
  Called from CXLOG (mod. 85) when need to start or restart a  <<03568>>20882000
  logging process. Will create the logging process (named      <<03568>>20884000
  LOGNAME) and have it adopted by PROGEN (this system process  <<03568>>20886000
  will run in the linear queue). TARGET is used to specify     <<03568>>20888000
  the final destination of the logging file (0=DISC, 1=TAPE).  <<03568>>20890000
                                                               <<03568>>20892000
  NOTE:                                                        <<03568>>20894000
    DB must be at stack.                                       <<03568>>20896000
;                                                              <<03568>>20898000
                                                                        20900000
                                                                        20902000
                                                                        20904000
   INTEGER ULOGPIN:= 0,STACK;                                           20906000
   LOGICAL A;                                                  <<04162>>20908000
   INTEGER DB,I;                                                        20910000
   LOGICAL PRI;                                                         20912000
   BYTE ARRAY FNAME(0:36) = Q;                                 <<03566>>20914000
   BYTE POINTER BPS0 = S-0;                                    <<03566>>20916000
   LOGICAL ARRAY ENTRY'(0:TENTRYSIZE-1) = Q;                   <<03568>>20918000
   BYTE ARRAY BENTRY'(*)=ENTRY';                                        20920000
   INTEGER TABINDEX,INDEX;                                              20922000
   LOGICAL NOSTDIN:=0, NOSTDLIST:=0;     << FOR PROCREATE >>   <<01200>>20924000
   EQUATE NOSTRING=0, NOSTLEN=0;                               <<01200>>20926000
                                                               <<03568>>20928000
                                                               <<03568>>20930000
   TABINDEX:=0;                                                         20932000
   A := GETSIR(LOGSIR);                                        <<04164>>20934000
   IF GENTRY(INDEX,0) THEN                                              20936000
   BEGIN                                       <<GOT A SPACE>>          20938000
      FNAME := " ";                                            <<03566>>20940000
      MOVE FNAME(1) := FNAME, (36);                            <<03566>>20942000
                                                               <<03566>>20944000
                                                               <<03566>>20946000
      ENTRY':="  ";                                            <<04886>>20948000
      MOVE ENTRY'(1):=ENTRY',(TENTRYSIZE-3);                   <<01432>>20950000
      MOVE BENTRY':=LOGNAME,(8);                                        20952000
      MOVE BENTRY'(10):="        ";                                     20954000
      ENTRY'(NUMUSERS) := 0;                                   <<03568>>20956000
      FENTRY(BENTRY'(LGNAME),,FNAME,,,I);                      <<04886>>20958000
      IF > THEN                                                         20960000
      BEGIN                                                             20962000
         RELENTRY(INDEX,0);                                             20964000
         RELSIR(LOGSIR,A);                                     <<04164>>20966000
         INITLOG:=FALSE;                                                20968000
         RETURN;                                                        20970000
      END;                                                              20972000
      ENTRY'(LGTYPE) := I.(8:8);                               <<04886>>20974000
      MOVE BENTRY'(LFNAME) := FNAME WHILE AN, 0;               <<03566>>20976000
      IF BPS0 = "/" THEN                                       <<03566>>20978000
      BEGIN                                                    <<03566>>20980000
         @BPS0 := @BPS0 + 1;                                   <<03566>>20982000
         MOVE BENTRY'(LFLOCKW) := BPS0 WHILE AN, 0;            <<04886>>20984000
      END;                                                     <<03566>>20986000
      IF BPS0 = "." THEN                                       <<03566>>20988000
      BEGIN                                                    <<03566>>20990000
         @BPS0 := @BPS0 + 1;                                   <<03566>>20992000
         MOVE BENTRY'(LFGROUP) := BPS0 WHILE AN, 0;            <<03566>>20994000
         IF BPS0 = "."  THEN                                   <<03566>>20996000
         BEGIN                                                 <<03566>>20998000
            @BPS0 := @BPS0 + 1;                                <<03566>>21000000
            MOVE BENTRY'(LFACCT) := BPS0 WHILE AN;             <<03566>>21002000
         END;                                                  <<03566>>21004000
      END;                                                     <<03566>>21006000
                                                               <<03566>>21008000
      PRI:=[5/4,3/0,8/149];                                             21010000
      STACK:=GETSTACK(INITSTACK,MAXSTACK);                              21012000
      TOS:=@ULOGPIN;                                                    21014000
      IF STACK <> 0 THEN                                                21016000
      BEGIN                                                             21018000
         IF TARGET.(0:8) = RESTRT THEN                                  21020000
         TOS := A'(ULOGRSTARTPLABEL)                           <<03568>>21022000
         ELSE TOS:=A'(ULOGPLABEL);                                      21024000
         << Zero out the STT entry of the external P-label >>  <<03568>>21026000
         << Procreate only needs the code segment number.  >>  <<03568>>21028000
                                                               <<03568>>21030000
         TOS.(0:8):=0;                                                  21032000
         TOS.(0:1):=1;                                                  21034000
                                                               <<03568>>21036000
         << Also need the Delta P-label  -  offset within the>><<03568>>21038000
         << code segment where the procedure begins.         >><<03568>>21040000
                                                               <<03568>>21042000
         IF TARGET.(0:8) = RESTRT                              <<03568>>21044000
          THEN TOS:=A'(ULOGRSTARTDELTAP)                       <<03568>>21046000
         ELSE TOS:=A'(ULOGDELTAP);                                      21048000
         PROCREATE(*,*,*,STACK,GLOBSIZE,0,LOCSIZE,PRI,         <<01200>>21050000
                   NOSTRING,NOSTLEN,INDEX,%13,MAXSTACK,        <<01200>>21052000
                   NOSTDIN,NOSTDLIST);                         <<01200>>21054000
         IF = THEN                                                      21056000
         BEGIN                                                          21058000
            <<Make process a system process (son of PROGEN)>>  <<03568>>21060000
            ADOPT(ULOGPIN,3);                        <<00601>> <<03568>>21062000
            DB:=EXCHANGEDB(STACK);                                      21064000
            PDB(0):=0;                                                  21066000
            I:=0;                                                       21068000
            DO BEGIN PDB(I+1):=PDB(I) END UNTIL (I:=I+1) >=255;         21070000
                                                               <<04162>>21072000
            << Set up the stack.  >>                           <<04162>>21074000
                                                               <<04162>>21076000
            << First primary DB >>                             <<04162>>21078000
                                                               <<04162>>21080000
            PDB(0) := %16;      << Byte addr for ZEROS       >><<04162>>21082000
            PDB(1) := %22;      << Byte addr for FORMS       >><<04162>>21084000
            PDB(2) := %34;      << Byte addr for FNAME       >><<04162>>21086000
            PDB(3) := %100;     << Byte addr for BFNAME      >><<04162>>21088000
            PDB(4) := %144;     << Byte addr for PRCNAME     >><<04162>>21090000
            PDB(5) := %67;      << Word addr for BUFFAREA    >><<04162>>21092000
            PDB(6) := %10067;   << Word addr for DISCREC     >><<04162>>21094000
                                                               <<04162>>21096000
            << Now set up secondary DB >>                      <<04162>>21098000
                                                               <<04162>>21100000
            PDB(7) := "00";     << Initialize the ZEROS      >><<04162>>21102000
            PDB(8) := "00";     <<     array for later use   >><<04162>>21104000
            TOS:=EXCHANGEDB(DB);                                        21106000
         END                                                            21108000
         ELSE                                                           21110000
         BEGIN                                                          21112000
            RELENTRY(INDEX,0);                                          21114000
            RELSIR(LOGSIR,A);                                  <<04164>>21116000
            INITLOG:=FALSE;                                             21118000
            RETURN;                                                     21120000
         END;                                                           21122000
         <<NOW ADD ENTRY TO LOGGING TABLE>>                             21124000
                                                               <<04164>>21126000
         IF ENTRY'(LGTYPE) <> DISC                             <<03572>>21128000
            THEN MOVE BENTRY'(BNAME) := "ULOG    "             <<03568>>21130000
         ELSE MOVE BENTRY'(BNAME) := 8(" ");                   <<03568>>21132000
         ENTRY'(PIN) := ULOGPIN * PCBSIZE;                     <<03568>>21134000
         ENTRY'(STATUS) := INITIALIZING;                       <<04164>>21136000
         ENTRY'(LGSWITCH) := FALSE;                            <<04886>>21138000
         ENTRY'(LGNEWTYPE) := NULL;                            <<04886>>21140000
         ENTRY'(LGAUTO) := FALSE;                              <<04886>>21142000
         ENTRY'(LGNEWAUTO) := FALSE;                           <<04886>>21144000
         MOVE'TO'DSEG(LOGDST,INDEX,@ENTRY',TENTRYSIZE-2);      <<03567>>21146000
         WRITEDSEG(LOGDST);                                             21148000
         AWAKE(ULOGPIN*PCBSIZE,%1,0);                                   21150000
         RELSIR(LOGSIR,A);                                     <<04164>>21152000
         INITLOG:=TRUE;                                                 21154000
      END                                                               21156000
      ELSE                                                              21158000
      BEGIN                                                             21160000
         RELSIR(LOGSIR,A);                                     <<04164>>21162000
         INITLOG:=FALSE;                                                21164000
         RETURN;                                                        21166000
      END;                                                              21168000
   END;                                                                 21170000
END;                                                                    21172000
$PAGE "STOPS ALL LOGGING PROCESSES WHEN SYSTEM SHUTDOWN"       <<04165>>21174000
PROCEDURE STOP'ALL'USERLOGS;                                   <<04165>>21176000
   OPTION PRIVILEGED,UNCALLABLE;                               <<04165>>21178000
                                                               <<04165>>21180000
BEGIN                                                          <<04165>>21182000
                                                               <<04165>>21184000
<< Called by PROGEN when performing a =SHUTDOWN or =LOGOFF.  >><<04165>>21186000
<< At this time we need to make sure all user logging        >><<04165>>21188000
<< processes will end gracefully.                            >><<04165>>21190000
<<                                                           >><<04165>>21192000
                                                               <<04165>>21194000
INTEGER                                                        <<04165>>21196000
   STACK,           << Stack upon entry/exit       >>          <<04165>>21198000
   TABINDEX;        << Pointer to LOGTAB entries   >>          <<04165>>21200000
                                                               <<04165>>21202000
                                                               <<04165>>21204000
                                                               <<04165>>21206000
STACK := EXCHANGEDB(LOGDST);                                   <<04165>>21208000
TABINDEX := LOGTAB(INUSE);   << First entry in table.        >><<04165>>21210000
                                                               <<04165>>21212000
<< Now cycle thru the table stopping the processes.          >><<04165>>21214000
                                                               <<04165>>21216000
WHILE (TABINDEX <> NULL)  AND  (TABINDEX <> "  ")  DO          <<04165>>21218000
BEGIN        << Found an active one >>                         <<04165>>21220000
                                                               <<04165>>21222000
   << If the process is recovering or initializing, we do not>><<04165>>21224000
   << want to disturb it. Instead we'll wait.                >><<04165>>21226000
                                                               <<04165>>21228000
   IF LOGTAB(STATUS) = ACT  OR  LOGTAB(STATUS) = INACT  THEN   <<04165>>21230000
   BEGIN                                                       <<04165>>21232000
      IF LOGTAB(DST) <> NULL THEN                              <<04887>>21234000
      BEGIN                                                    <<04165>>21236000
         << Found a live process to stop. >>                   <<04165>>21238000
                                                               <<04165>>21240000
         EXCHANGEDB(LOGTAB(DST));                              <<04165>>21242000
         LOGBUFF(NUMUSER) := 0;                                <<04165>>21244000
         LOGBUFF(MSG) := STOP;                                 <<04165>>21246000
         AWAKE(LOGBUFF(LOGPIN),%20,0);                         <<04165>>21248000
         EXCHANGEDB(LOGDST);                                   <<04165>>21250000
      END;                                                     <<04165>>21252000
   END;                                                        <<04165>>21254000
                                                               <<04165>>21256000
   DELAY(2000D);                                               <<04165>>21258000
   TABINDEX := LOGTAB(INUSE);   << Back to the top          >> <<04165>>21260000
END;         << Found an active process  >>                    <<04165>>21262000
                                                               <<04165>>21264000
EXCHANGEDB(STACK);                                             <<04165>>21266000
                                                               <<04165>>21268000
END;         << Stop'all'userlogs >>                           <<04165>>21270000
$PAGE                                                                   21272000
$PAGE  "STOPLOG"                                               <<04162>>21274000
LOGICAL PROCEDURE STOPLOG(LOGNAME);                                     21276000
BYTE ARRAY LOGNAME;                                                     21278000
                                                                        21280000
OPTION PRIVILEGED,UNCALLABLE;                                           21282000
                                                                        21284000
                                                                        21286000
   <<THIS PROCEDURE STOPS USER LOGGING PROCESSES>>                      21288000
                                                                        21290000
                                                                        21292000
                                                                        21294000
BEGIN                                                                   21296000
   LOGICAL ARRAY ENTRY'(0:TENTRYSIZE-1) = Q;                   <<03568>>21298000
   INTEGER TABINDEX,DB;                                        <<04162>>21300000
   LOGICAL A;                                                  <<04162>>21302000
                                                               <<03568>>21304000
                                                               <<03568>>21306000
   A := GETSIR(LOGSIR);                                        <<02057>>21308000
   IF FINDLOG(LOGNAME,TABINDEX) THEN                                    21310000
   BEGIN                                                                21312000
      MOVE'FROM'DSEG(@ENTRY',LOGDST,TABINDEX,TENTRYSIZE);      <<03567>>21314000
                                                               <<00752>>21316000
      TABINDEX:=0;                                                      21318000
      IF (ENTRY'(STATUS)=RECOVERING) OR (ENTRY'(STATUS)=STOP)  <<04164>>21320000
         OR (ENTRY'(STATUS)=INITIALIZING)  THEN                <<04164>>21322000
      BEGIN                                                    <<00936>>21324000
         STOPLOG:=FALSE;                                       <<00936>>21326000
         RELSIR(LOGSIR,A);                                     <<00936>>21328000
         RETURN;                                               <<00936>>21330000
      END;                                                     <<00936>>21332000
      DB:=EXCHANGEDB(ENTRY'(DST));    << to LOGBUFF >>         <<04164>>21334000
                                                               <<04164>>21336000
      << Need to tell the process to stop. The process will  >><<04164>>21338000
      << stop as soon as the user count goes to zero.        >><<04164>>21340000
                                                               <<04164>>21342000
      OBTAIN(DLOGBUFF(RESOURCE),NULL);                         <<04164>>21344000
      LOGBUFF(MSG):= STOP;                                              21346000
      RELEASE(DLOGBUFF(RESOURCE),NULL,1);                      <<04164>>21348000
                                                               <<04164>>21350000
      AWAKE(LOGBUFF(LOGPIN),%20,0);                                     21352000
      STOPLOG:=TRUE;                                                    21354000
      DB:=EXCHANGEDB(DB);                                               21356000
      RELSIR(LOGSIR,A);                                        <<00752>>21358000
      RETURN;                                                           21360000
   END                                                                  21362000
   ELSE                                                                 21364000
   BEGIN                                                                21366000
      RELSIR(LOGSIR,A);                                        <<02057>>21368000
      STOPLOG:=FALSE;                                                   21370000
      RETURN;                                                           21372000
   END;                                                                 21374000
END;                                                                    21376000
$PAGE  "UTILITIES"                                             <<04162>>21378000
PROCEDURE MOVE'FROM'DSEG(TARGET,SEGMENT,OFFSET,COUNT);         <<03567>>21380000
   VALUE TARGET,SEGMENT,OFFSET,COUNT;                          <<03567>>21382000
   INTEGER TARGET,SEGMENT,OFFSET,COUNT;                        <<03567>>21384000
   OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                      <<03567>>21386000
                                                               <<03567>>21388000
                                                               <<03567>>21390000
                                                               <<03567>>21392000
                                                               <<03567>>21394000
BEGIN                                                          <<03567>>21396000
                                                               <<03567>>21398000
   TOS := TARGET;                                              <<03567>>21400000
   TOS := SEGMENT;                                             <<03567>>21402000
   TOS := OFFSET;                                              <<03567>>21404000
   TOS := COUNT;                                               <<03567>>21406000
   ASSEMBLE (MFDS 4);                                          <<03567>>21408000
                                                               <<03567>>21410000
                                                               <<03567>>21412000
                                                               <<03567>>21414000
END;                                                           <<03567>>21416000
                                                               <<03567>>21418000
                                                               <<03567>>21420000
                                                               <<03567>>21422000
PROCEDURE MOVE'TO'DSEG(SEGMENT,OFFSET,SOURCE,COUNT);           <<03567>>21424000
   VALUE SEGMENT,OFFSET,SOURCE,COUNT;                          <<03567>>21426000
   INTEGER SEGMENT,OFFSET,SOURCE,COUNT;                        <<03567>>21428000
   OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                      <<03567>>21430000
                                                               <<03567>>21432000
                                                               <<03567>>21434000
                                                               <<03567>>21436000
BEGIN                                                          <<03567>>21438000
                                                               <<03567>>21440000
   TOS := SEGMENT;                                             <<03567>>21442000
   TOS := OFFSET;                                              <<03567>>21444000
   TOS := SOURCE;                                              <<03567>>21446000
   TOS := COUNT;                                               <<03567>>21448000
   ASSEMBLE (MTDS 4);                                          <<03567>>21450000
                                                               <<03567>>21452000
                                                               <<03567>>21454000
END;                                                           <<03567>>21456000
                                                               <<03567>>21458000
                                                               <<03567>>21460000
                                                               <<03567>>21462000
$CONTROL SEGMENT=MAIN                                          <<03567>>21464000
END.                                                           <<03567>>21466000
