User Tools

Site Tools


cdc:nos2.source:opl.opl871:deck:smfex

Deck SMFEX

Library Member Format: MODIFY

Listing Sections

Source

Seq #  *Modification Id* Act 
----------------------------+
00001  M00S00001.smfex   +++|PRGM SMFEX;
00002  M00S00002.smfex   +++|BEGIN
00003  M00S00003.smfex   +++|#
00004  M00S00004.smfex   +++|**        SMFEX - SCREEN MANAGEMENT FACILITY EXECUTIVE.
00005  M00S00005.smfex   +++|*
Line S00006 Modification History
M01 (Removed by) 281l803
Seq #  *Modification Id* Act 
----------------------------+
00006  M01S00006.281l803 ---|*         COPYRIGHT CONTROL DATA CORPORATION, 1983.
Line S00001 Modification History
M01 (Added by) 281l803
Seq #  *Modification Id* Act 
----------------------------+
00007  M01S00001.281l803 +++|*         COPYRIGHT CONTROL DATA SYSTEMS INC.  1992.
00008  M00S00007.smfex   +++|*
00009  M00S00008.smfex   +++|*         THE SMFEX PROGRAM IS THE EXECUTIVE OR MONITOR FOR THE SMFEX
00010  M00S00009.smfex   +++|*         SUBSYSTEM.  THE FUNCTION PROVIDED BY THE SMFEX SUBSYSTEM IS
00011  M00S00010.smfex   +++|*         AN ALTERNATE IMPLEMENTATION OF THE FULL SCREEN EDITOR (FSE)
00012  M00S00011.smfex   +++|*         TO BE MEMORY RESIDENT, SERVICING LARGE USER COMMUNITIES
00013  M00S00012.smfex   +++|*         WITH A REDUCTION IN SYSTEM SCHEDULING OVERHEAD COMPARED TO
00014  M00S00013.smfex   +++|*         THE CONVENTIONAL EXECUTION OF A UNIQUE JOB FOR EACH USER.
00015  M00S00014.smfex   +++|*
00016  M00S00015.smfex   +++|*         THE SMFEX PROGRAM IS RESPONSIBLE TO MANAGE THE
00017  M00S00016.smfex   +++|*         MULTI-TASKING TECHNIQUE WHICH ALLOWS THE EDITOR CODE TO BE
00018  M00S00017.smfex   +++|*         SHARED BY MULTIPLE USERS.  THE EDITOR CODE RESIDES IN
00019  M00S00018.smfex   +++|*         SEVERAL SOURCE MODULES OUTSIDE OF THIS PROGRAM.  SMFEX AND
00020  M00S00019.smfex   +++|*         THE EDITING MODULES ARE COMBINED BY THE LOADER.  EDITING
00021  M00S00020.smfex   +++|*         MODULES REQUIRE SEPARATE COMPILATION WITH CERTAIN
00022  M00S00021.smfex   +++|*         MODIFY-TIME DEFINITIONS CHANGED TO YIELD TWO SETS OF
00023  M00S00022.smfex   +++|*         RELOCATABLE MODULES, ONE SUITABLE FOR LOADER PROCESSING TO
00024  M00S00023.smfex   +++|*         YIELD FSE AND THE OTHER SUITABLE FOR LOADER PROCESSING TO
00025  M00S00024.smfex   +++|*         YIELD SMFEX.
00026  M00S00025.smfex   +++|*
00027  M00S00026.smfex   +++|#
00028  M00S00027.smfex   +++|
00029  M00S00028.smfex   +++|  DEF LISTCON #1#;
00030  M00S00029.smfex   +++|
00031  M00S00030.smfex   +++|CONTROL PRESET;         # UNIVERSAL DEFINITIONS     #
00032  M00S00031.smfex   +++|
00033  M00S00032.smfex   +++|
00034  M00S00033.smfex   +++|*CALL COMFMLT
00035  M00S00034.smfex   +++|*CALL COMFFSE
00036  M00S00035.smfex   +++|
00037  M00S00036.smfex   +++|                        # SMFEX'S OWN DEFS          #
00038  M00S00037.smfex   +++|
00039  M00S00038.smfex   +++|*CALL COMFSMF
00040  M00S00039.smfex   +++|
00041  M00S00040.smfex   +++|#   SIC CODES.  IAFEX TALKS TO OUR BUFFER 0, SINGLE-USER FSE TALKS #
00042  M00S00041.smfex   +++|#   TO OUR BUFFER 1 WITH A DIFFERENT SET OF CODES.   #
00043  M00S00042.smfex   +++|
00044  M00S00043.smfex   +++|STATUS IAF2SMF
00045  M00S00044.smfex   +++|  INIT,
00046  M00S00045.smfex   +++|  MSGIN,
00047  M00S00046.smfex   +++|  OUTDONE,
00048  M00S00047.smfex   +++|  BREAK,
00049  M00S00048.smfex   +++|  HUNGUP,
00050  M00S00049.smfex   +++|  CONNECT;
00051  M00S00050.smfex   +++|
00052  M00S00051.smfex   +++|STATUS SMF2IAF
00053  M00S00052.smfex   +++|  INIT,
00054  M00S00053.smfex   +++|  MSGOUT,
00055  M00S00054.smfex   +++|  PROMPT,
00056  M00S00055.smfex   +++|  LOGOUT;
00057  M00S00056.smfex   +++|
00058  M00S00057.smfex   +++|STATUS TASKST
00059  M00S00058.smfex   +++|  EMPTY,
00060  M00S00059.smfex   +++|  DELAY,
00061  M00S00060.smfex   +++|  RECALLFET,
00062  M00S00061.smfex   +++|  START,
00063  M00S00062.smfex   +++|  SWAP,
00064  M00S00063.smfex   +++|  RUN,
00065  M00S00064.smfex   +++|  PRELIM;
00066  M00S00065.smfex   +++|
00067  M00S00066.smfex   +++|#   TYPES OF STATISTICS COLLECTED   #
00068  M00S00067.smfex   +++|STATUS INSTST
00069  M00S00068.smfex   +++|  THNK,
00070  M00S00069.smfex   +++|  RSPNS,
00071  M00S00070.smfex   +++|  NOTTI,
00072  M00S00071.smfex   +++|  NOTASK,
00073  M00S00072.smfex   +++|  SWPE,
00074  M00S00073.smfex   +++|  SWPD,
00075  M00S00074.smfex   +++|  CLOCKTICK,
00076  M00S00075.smfex   +++|  PREEMPT,
00077  M00S00076.smfex   +++|  SWPTIM,
00078  M00S00077.smfex   +++|  EDTCIO,
00079  M00S00078.smfex   +++|  SESSION,
00080  M00S00079.smfex   +++|  TRANS,
00081  M00S00080.smfex   +++|  XSTTO,
00082  M00S00081.smfex   +++|  BREAKS,
00083  M00S00082.smfex   +++|  HANGUPS,
00084  M00S00083.smfex   +++|  BGNEDT,
00085  M00S00084.smfex   +++|  ENDEDT,
00086  M00S00085.smfex   +++|  INPUT,
00087  M00S00086.smfex   +++|  XMIT,
00088  M00S00087.smfex   +++|  KWIKTOC,
00089  M00S00088.smfex   +++|  TASKUTIL,
00090  M00S00089.smfex   +++|  WORKIO,
00091  M00S00090.smfex   +++|  DROPCPU;
00092  M00S00091.smfex   +++|
00093  M00S00092.smfex   +++|DEF MOD4(ZZ) #((ZZ) LAN 3)#;
00094  M00S00093.smfex   +++|DEF MOD8(ZZ) #((ZZ) LAN 7)#;
00095  M00S00094.smfex   +++|DEF MOD32(ZZ) #((ZZ) LAN 31)#;
00096  M00S00095.smfex   +++|PAGE                         # EXTERNAL REF'S AND DEF'S    #
00097  M00S00096.smfex   +++|
00098  M00S00097.smfex   +++|XDEF
00099  M00S00098.smfex   +++|  BEGIN
00100  M00S00099.smfex   +++|  PROC SMFRCL;              PROC SMFDLY;
00101  M00S00100.smfex   +++|  PROC CLEARINT;             PROC VOLUNTEER;
00102  M00S00101.smfex   +++|  PROC TTITRAP;              PROC TTOTRAP;
00103  M00S00102.smfex   +++|  PROC FATALTRAP;            PROC CLEARQUE;
00104  M00S00103.smfex   +++|  CONTROL IFEQ METERING,1;
00105  M00S00104.smfex   +++|    PROC BGNMETER;
00106  M00S00105.smfex   +++|    PROC WIOSTAT;
00107  M00S00106.smfex   +++|  CONTROL FI;
00108  M00S00107.smfex   +++|  ARRAY RENTSTK [1:MAXREENT];          # SUBROUTINE STACK  #
00109  M00S00108.smfex   +++|   BEGIN
00110  M00S00109.smfex   +++|    ITEM RSTK;
00111  M00S00110.smfex   +++|   END
00112  M00S00111.smfex   +++|  ITEM RSTKPTR;
00113  M00S00112.smfex   +++|  END
00114  M00S00113.smfex   +++|
00115  M00S00114.smfex   +++|XREF PROC MOVEWD;
00116  M00S00115.smfex   +++|
00117  M00S00116.smfex   +++|XREF
00118  M00S00117.smfex   +++|  BEGIN
00119  M00S00118.smfex   +++|  # FIRST COME COMPASS ROUTINES, FOR SPECIAL/OPTIMAL TRICKS #
00120  M00S00119.smfex   +++|  FUNC FINDBIT;              FUNC NOSWDSZ;
00121  M00S00120.smfex   +++|  PROC SPREAD;               PROC GATHER;
00122  M00S00121.smfex   +++|  PROC FLDLEN;               PROC FLDLENE;
00123  M00S00122.smfex   +++|  PROC SFMSSTF;  PROC SFMCSTF;  PROC TESTECS;
00124  M00S00123.smfex   +++|  PROC READECS;              PROC WRITECS;
00125  M00S00124.smfex   +++|  PROC GETUTAB;              PROC SAVUTAB;
00126  M00S00125.smfex   +++|  # NOW COME THE STANDARD UOI SYMPLIB ROUTINES WE NEED #
00127  M00S00126.smfex   +++|                 PROC WRITEO;    PROC READO;
00128  M00S00127.smfex   +++|  PROC RECALL;               PROC SYSREQ;
00129  M00S00128.smfex   +++|  PROC READ;                 PROC READC;
00130  M00S00129.smfex   +++|  PROC REWIND;               PROC STATUSP;
00131  M00S00130.smfex   +++|  PROC WRITER;               PROC REWRITR;
00132  M00S00131.smfex   +++|  PROC WRITEC;              PROC WRITEW;
00133  M00S00132.smfex   +++|  PROC MESSAGE;              PROC DISTCON;
00134  M00S00133.smfex   +++|  PROC RETERN;              PROC GETFLCE;
00135  M00S00134.smfex   +++|  PROC ONSW;                 PROC RTIME;
00136  M00S00135.smfex   +++|  PROC SETRFLE;              PROC PROTEON;
00137  M00S00136.smfex   +++|  PROC EVICT;
00138  M00S00137.smfex   +++|  PROC FILINFO;  PROC REQUEST;  PROC EESET;
00139  M00S00138.smfex   +++|  PROC ENDRUN;              PROC ABORT;
00140  M00S00139.smfex   +++|  # NOW COME ENTRIES TO FSE EDITOR #
00141  M00S00140.smfex   +++|  FUNC MIN;                  FUNC MAX;
00142  M00S00141.smfex   +++|  PROC PROCESS; PROC EDTINIT; PROC MAKEFET; PROC EDTTERM;
00143  M00S00142.smfex   +++|  PROC PAUSEIO;  PROC RESUMIO;  PROC CHECKIO;
00144  M00S00143.smfex   +++|  PROC TTSYNC;               PROC FATAL;
00145  M00S00144.smfex   +++|  PROC VDSYNCH;
00146  M00S00145.smfex   +++|  END
00147  M00S00146.smfex   +++|PAGE                         # COMMON DATA AREAS #
00148  M00S00147.smfex   +++|*CALL COMFDS1
00149  M00S00148.smfex   +++|*CALL COMFVD2
00150  M00S00149.smfex   +++|*CALL COMFDS2
00151  M00S00150.smfex   +++|PAGE                         # EDITOR TABLES     #
00152  M00S00151.smfex   +++|                   # COMPILED HERE ONLY FOR CONTROL PRESET #
00153  M00S00152.smfex   +++|
00154  M00S00153.smfex   +++|*CALL COMFTAB
00155  M00S00154.smfex   +++|PAGE                         # SMFEX'S OWN DATA            #
00156  M00S00155.smfex   +++|
00157  M00S00156.smfex   +++|
00158  M00S00157.smfex   +++|ITEM TIMEOFDAY=0;
00159  M00S00158.smfex   +++|ITEM SLICECOUNT=0;
00160  M00S00159.smfex   +++|ITEM OLDTIMEDAY=0;
00161  M00S00160.smfex   +++|ITEM NEWTIMEDAY=0;
00162  M00S00161.smfex   +++|ITEM IDLEDOWN B=FALSE;
00163  M00S00162.smfex   +++|ITEM STOPNOW B=FALSE;
00164  M00S00163.smfex   +++|ITEM ACCEPTNONE B=FALSE;
00165  M00S00164.smfex   +++|ITEM ECSDOWN B=FALSE;
00166  M00S00165.smfex   +++|ITEM SHUTDOWN=0;             # CONTROLS OPERATOR SHUTDON   #
00167  M00S00166.smfex   +++|ITEM COMPLETE B=FALSE;       # USED TO SHUT WHOLE THING DOWN         #
00168  M00S00167.smfex   +++|ITEM CURUSER;                # UTILITY VARIABLE  #
00169  M00S00168.smfex   +++|ITEM CURTASK;                # CURRENT TASK REFERENCE      #
00170  M00S00169.smfex   +++|ITEM LASTTASK=0;             # PREVIOUS TASK TO RUN        #
Line S00170 Modification History
M01 (Removed by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
00171  M01S00170.v23l617 ---|ITEM TASKSAVAIL=2;           # TASKS CURRENTLY AVAILABLE/IN USE      #
Line S00001 Modification History
M01 (Added by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
00172  M01S00001.v23l617 +++|ITEM TASKSAVAIL=3;           # TASKS CURRENTLY AVAILABLE/IN USE      #
00173  M00S00171.smfex   +++|ITEM TASKSBUSY=0;            # NUMBER OF TASKS IN USE NOW  #
00174  M00S00172.smfex   +++|ITEM CHNGSTATUS;             # CURRENT TASKS CHANGE OF STATUS        #
00175  M00S00173.smfex   +++|ITEM REMAINTTI=NUMTTIBUF;    # HOW MANY BUFFERS AVAIL      #
00176  M00S00174.smfex   +++|ITEM DISPATLEN;              # LENGTH OF DISPATCHED DATA SEGMENT     #
00177  M00S00175.smfex   +++|ITEM SWAPLEN;                # LENGTH OF SWAPPED SEGMENT   #
00178  M00S00176.smfex   +++|ITEM SWAPPRUS;               # LENGTH SWAPPED IN PRU COUNT #
00179  M00S00177.smfex   +++|ITEM SWAPBUFLEN;             # LENGTH SWAP CIRCULAR BUFFS  #
00180  M00S00178.smfex   +++|ITEM MAXSWPPAG=0;            # HIGHEST (DISK ONLY) SWAP PAGE USED    #
00181  M00S00179.smfex   +++|ITEM MODELPTR;               # POINTS TO COPY OF VIRGIN DATA         #
00182  M00S00180.smfex   +++|ITEM MODELLEN;               # LENGTH OF VIRGIN COMMON COPY          #
00183  M00S00181.smfex   +++|ITEM FIELDLEN;
00184  M00S00182.smfex   +++|ITEM LOGGEDIN=0;
00185  M00S00183.smfex   +++|ITEM WRKFILLOCK B=FALSE;
00186  M00S00184.smfex   +++|ITEM ENABLEFLAG=0;
00187  M00S00185.smfex   +++|CONTROL IFEQ METERING,1;
00188  M00S00186.smfex   +++|  ITEM MAXLOGGED=0;
00189  M00S00187.smfex   +++|  ITEM STATTIME=0;
00190  M00S00188.smfex   +++|CONTROL FI;
00191  M00S00189.smfex   +++|CONTROL IFEQ ECSCODE,1;
00192  M00S00190.smfex   +++|  ITEM ECSFIELD=0;
00193  M00S00191.smfex   +++|  ITEM ECSERRORS=0;
00194  M00S00192.smfex   +++|CONTROL FI;
00195  M00S00193.smfex   +++|ITEM STATUSMSG C(30)="0000 USERS 00 TASKS";
00196  M00S00194.smfex   +++|BASED ARRAY ANYFET;;
00197  M00S00195.smfex   +++|BASED ARRAY MOVFROM;;
00198  M00S00196.smfex   +++|BASED ARRAY MOVTO;;
00199  M00S00197.smfex   +++|
00200  M00S00198.smfex   +++|ARRAY TTICONTROL [1:NUMTTIBUF];
00201  M00S00199.smfex   +++|  BEGIN
00202  M00S00200.smfex   +++|  ITEM TTICTLWORD  = [NUMTTIBUF(0)];
00203  M00S00201.smfex   +++|  ITEM TTIBUFLEN   U(0,0,12);
00204  M00S00202.smfex   +++|  ITEM TTIBUFLNK   U(0,12,12);
00205  M00S00203.smfex   +++|  ITEM TTIBUFADDR  U(0,42,18);
00206  M00S00204.smfex   +++|  END
00207  M00S00205.smfex   +++|
00208  M00S00206.smfex   +++|ARRAY SWAPBITS (NUMSWPBIT);;
00209  M00S00207.smfex   +++|ARRAY TTIBITS (NUMTTIBIT);;
00210  M00S00208.smfex   +++|ARRAY SWAPGOOD (NUMSWPBIT);;
00211  M00S00209.smfex   +++|ARRAY SWAPBAD (NUMSWPBIT);;
00212  M00S00210.smfex   +++|ARRAY TTIGOOD (NUMTTIBIT);;
00213  M00S00211.smfex   +++|BASED ARRAY SWAPMASK;;
00214  M00S00212.smfex   +++|
00215  M00S00213.smfex   +++|
00216  M00S00214.smfex   +++|# NOTE THAT CURUSERTAB MUST MATCH USERTAB, WORD BY FIELD.  #
00217  M00S00215.smfex   +++|# NOTE ALSO THAT THE FORMATS OF THESE ARRAYS ARE HARDCODED #
00218  M00S00216.smfex   +++|# IN THE COMPASS SUBROUTINES GETUTAB AND SAVUTAB.          #
00219  M00S00217.smfex   +++|
00220  M00S00218.smfex   +++|ARRAY CURUSERTAB (22);
00221  M00S00219.smfex   +++|  BEGIN
00222  M00S00220.smfex   +++|  ITEM CURUSLOGGED B(0)=[FALSE];
00223  M00S00221.smfex   +++|  ITEM CURUSINQUE  B(1)=[FALSE];
Line S00222 Modification History
M01 (Removed by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
00224  M01S00222.ns2136  ---|  ITEM CURUSLOGIN  B(2)=[FALSE];
Line S00001 Modification History
M01 (Added by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
00225  M01S00001.ns2136  +++|  ITEM CURUSDROP  B(02)=[FALSE];     # CURRENT USER DROP FLAG #
00226  M00S00223.smfex   +++|  ITEM CURUSDONE   B(3)=[FALSE];
00227  M00S00224.smfex   +++|  ITEM CURUSINTASK B(4)=[FALSE];
00228  M00S00225.smfex   +++|  ITEM CURUSSTART  B(5)=[FALSE];
00229  M00S00226.smfex   +++|  ITEM CURUSINTRPT B(6)=[FALSE];
00230  M00S00227.smfex   +++|  ITEM CURUSCRUNCH B(7)=[FALSE];
00231  M00S00228.smfex   +++|  ITEM CURUSLOSTDT B(8)=[FALSE];
00232  M00S00229.smfex   +++|  ITEM CURUSRCVRY  B(9)=[FALSE];
00233  M00S00230.smfex   +++|  ITEM CURUSOLDSND B(10)=[FALSE];
00234  M00S00231.smfex   +++|  ITEM CURUSVICTIM B(11)=[FALSE];
00235  M00S00232.smfex   +++|  ITEM CURUSSTMWRK B(12)=[FALSE];
00236  M00S00233.smfex   +++|  ITEM CURUSOKOUT  B(13)=[FALSE];
00237  M00S00234.smfex   +++|  ITEM CURUSSTKPTR (14)=[0];
00238  M00S00235.smfex   +++|  ITEM CURUSTASK   (15)=[0];
00239  M00S00236.smfex   +++|  ITEM CURUSTTIBUF (16)=[0];
00240  M00S00237.smfex   +++|  ITEM CURUSQUELNK (17)=[0];
00241  M00S00238.smfex   +++|  ITEM CURUSIAFNUM (18)=[0];
00242  M00S00239.smfex   +++|  ITEM CURUSFNTPTR (19)=[0];
00243  M00S00240.smfex   +++|  ITEM CURUSSWPPAG (20)=[0];
00244  M00S00241.smfex   +++|  ITEM CURUSLASTIM (21)=[0];
00245  M00S00242.smfex   +++|  END
00246  M00S00243.smfex   +++|
00247  M00S00244.smfex   +++|
00248  M00S00245.smfex   +++|# NOTE COMMENTS ABOVE ON RESTRICTIONS AGAINST REDEFINITION  #
00249  M00S00246.smfex   +++|# OF EITHER CURUSERTAB OR USERTAB.  #
00250  M00S00247.smfex   +++|
00251  M00S00248.smfex   +++|ARRAY USERTAB [1:NUMSMFUSR] S(3);
00252  M00S00249.smfex   +++|  BEGIN
00253  M00S00250.smfex   +++|  ITEM USERWORD0 (0)=[NUMSMFUSR(0)];
00254  M00S00251.smfex   +++|  ITEM USERWORD1 (1)=[NUMSMFUSR(0)];
00255  M00S00252.smfex   +++|  ITEM USERWORD2 (2)=[NUMSMFUSR(0)];
00256  M00S00253.smfex   +++|  ITEM USERFLAGS  U(0,0,18);
00257  M00S00254.smfex   +++|  ITEM USERLOGGED B(0,0,1);  # IS LOGGED FULLY IN          #
00258  M00S00255.smfex   +++|  ITEM USERINQUE  B(0,1,1);  # ALREADY IN SWAPIN QUEUE     #
Line S00256 Modification History
M01 (Removed by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
00259  M01S00256.ns2136  ---|  ITEM USERLOGIN  B(0,2,1);  # BETWEEN HALVES OF LOGIN SEQ #
Line S00002 Modification History
M01 (Added by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
00260  M01S00002.ns2136  +++|  ITEM USERDROP   B(00,02,01);       # USER DROPPED PHONE CONNECT #
00261  M00S00257.smfex   +++|  ITEM USERDONE   B(0,3,1);  # EDIT HAS COMPLETED          #
00262  M00S00258.smfex   +++|  ITEM USERINTASK B(0,4,1);  # ASSIGNED TO SOME TASK       #
00263  M00S00259.smfex   +++|  ITEM USERSTART  B(0,5,1);  # ONLY FOR RIGHT AFTER LOGGED #
00264  M00S00260.smfex   +++|  ITEM USERINTRPT B(0,6,1);  # WE MUST SOON SERVICE BREAK KEY        #
00265  M00S00261.smfex   +++|  ITEM USERCRUNCH B(0,7,1);  # USER IS FILE-CRUNCHING,LOW PRIO       #
00266  M00S00262.smfex   +++|  ITEM USERLOSTDT B(0,8,1);  # USER LOST EXCESS INPUT DATA #
00267  M00S00263.smfex   +++|  ITEM USERRCVRY  B(0,9,1);  # SWAPPING IN ONLY TO CHKPT   #
00268  M00S00264.smfex   +++|  ITEM USEROLDSND B(0,10,1); # MIDDLE OF SERIES OF SENDS   #
00269  M00S00265.smfex   +++|  ITEM USERVICTIM B(0,11,1); # VICTIMIZED BY SMFEX ECS ERROR         #
00270  M00S00266.smfex   +++|  ITEM USERSTMWRK B(0,12,1); # USE STIMULATION WRKFIL NAME #
00271  M00S00267.smfex   +++|  ITEM USEROKOUT  B(0,13,1); # O.K. TO PRODUCE TTY OUTPUT  #
00272  M00S00268.smfex   +++|  ITEM USERSTKPTR U(0,18,6); # REENTRANCY STACK LEVEL      #
00273  M00S00269.smfex   +++|  ITEM USERTASK   U(0,24,6); # WHICH TASK ARE WE IN        #
00274  M00S00270.smfex   +++|  ITEM USERTTIBUF U(0,30,6); # WHICH INPUT BUFFER WE OWN   #
00275  M00S00271.smfex   +++|  ITEM USERQUELNK U(0,36,12); #          LINKAGE IN SWAP QUEUE       #
00276  M00S00272.smfex   +++|  ITEM USERIAFNUM U(0,48,12); #          WHICH IAFEX PORT  #
00277  M00S00273.smfex   +++|  ITEM USERFNTPTR U(1,0,12);  #          TO SPEED UP CIO'S #
00278  M00S00274.smfex   +++|  ITEM USERSWPPAG U(1,12,12); #          WHICH SWAP PAGE   #
00279  M00S00275.smfex   +++|  ITEM USERLASTIM U(1,24,30); # LAST TIME STAMP            #
00280  M00S00276.smfex   +++|  ITEM USERJSN    C(2,0,4);   # JOB SEQUENCE NUMBER        #
00281  M00S00277.smfex   +++|  ITEM USEREJT    U(2,24,12); # JOB EJT ORDINAL            #
00282  M00S00278.smfex   +++|  END
00283  M00S00279.smfex   +++|
00284  M00S00280.smfex   +++|ARRAY TASKTAB [1:NUMTASKS] P(13);
00285  M00S00281.smfex   +++|  BEGIN
00286  M00S00282.smfex   +++|  ITEM TASKSTATUS (0)=[0];   # CURRENT TASK STATUS         #
00287  M00S00283.smfex   +++|  ITEM TASKFLAGS  (1)=[0];   # ALL BITS OFF      #
00288  M00S00284.smfex   +++|  ITEM TASKREQUE  B(1,0,1);  # USER NEEDS REPEATED SERVICE #
00289  M00S00285.smfex   +++|  ITEM TASKABORT  B(1,2,1);  # TASK IS ABORTING            #
00290  M00S00286.smfex   +++|  ITEM TASKSWPNOW B(1,3,1);  # CURRENTLY EXECING SWAP CODE #
00291  M00S00287.smfex   +++|  ITEM TASKSWPIN  B(1,4,1);  # DIRECTION OF SWAP IS IN     #
00292  M00S00288.smfex   +++|  ITEM TASKUSER   (2)=[0];             # WHICH USER IN THIS TASK     #
00293  M00S00289.smfex   +++|  ITEM TASKNXTTTO (3)=[0];             # WHERE TO APPEND NEXT OUTPUT #
00294  M00S00290.smfex   +++|  ITEM TASKTYPTTO (4)=[0];             # TRANSMIT CODE DESIRED       #
00295  M00S00291.smfex   +++|  ITEM TASKRCLADR (5)=[0];             # CURRENT RECALL FET          #
00296  M00S00292.smfex   +++|  ITEM TASKADDR   (6)=[0];             # ADDRESS OF TASK MEMORY      #
00297  M00S00293.smfex   +++|  ITEM TASKSTKPTR (7)=[0];             # DISPATCHING RSTKPTR         #
00298  M00S00294.smfex   +++|  ITEM TASKDSPADR (8)=[0];             # DISPATCH DATA START         #
00299  M00S00295.smfex   +++|  ITEM TASKTIME   (9)=[0];   # TIMEOFDAY SWAPPED IN        #
00300  M00S00296.smfex   +++|  ITEM TASKSWPFIL (10)=[0];  # WHICH SWAP FILE IN USE      #
00301  M00S00297.smfex   +++|  ITEM TASKSWPPRU (11)=[0];  # WHICH PRU IN THAT FILE      #
00302  M00S00298.smfex   +++|  ITEM TASKPULSE  (12)=[0];  # FAKE FET FOR CLOCK EVENTS   #
00303  M00S00299.smfex   +++|  END
00304  M00S00300.smfex   +++|
00305  M00S00301.smfex   +++|ARRAY SWAPQ (3);
00306  M00S00302.smfex   +++|  BEGIN
00307  M00S00303.smfex   +++|  ITEM SWPQHEAD I(0)=[0];
00308  M00S00304.smfex   +++|  ITEM SWPQTAIL I(1)=[0];
00309  M00S00305.smfex   +++|  ITEM SWPQSIZE I(2)=[0];
00310  M00S00306.smfex   +++|  END
00311  M00S00307.smfex   +++|
00312  M00S00308.smfex   +++|ARRAY SSCINPUT [-1:O"100"]; ITEM SSCINP (0)=[O"102"(0)];
00313  M00S00309.smfex   +++|
00314  M00S00310.smfex   +++|ARRAY IAFMSGWORD;
00315  M00S00311.smfex   +++|  BEGIN
00316  M00S00312.smfex   +++|  ITEM IAFHEADER;            # WHOLE WORD        #
00317  M00S00313.smfex   +++|  ITEM IAFFUNC  U(0,0,12)=[SMF2IAF"INIT"];
00318  M00S00314.smfex   +++|  ITEM IAFTERM  U(0,12,12)=[0];
00319  M00S00315.smfex   +++|  ITEM IAFPTR   U(0,24,18)=[0];
00320  M00S00316.smfex   +++|  ITEM IAFLEN   U(0,42,18)=[1];
00321  M00S00317.smfex   +++|  END
00322  M00S00318.smfex   +++|ARRAY INITSSC [0:1]; ITEM INITSSCWORD=[0,0];
00323  M00S00319.smfex   +++|BASED ARRAY SSCBUFFER;
00324  M00S00320.smfex   +++|  BEGIN
00325  M00S00321.smfex   +++|  ITEM SSCWORD;
00326  M00S00322.smfex   +++|  ITEM SSCCOUNT   U(0,36,6);
00327  M00S00323.smfex   +++|  ITEM SSCTYPE    U(0,46,2);
00328  M00S00324.smfex   +++|  ITEM SSCSTATUS  U(0,48,12);
00329  M00S00325.smfex   +++|  END
00330  M00S00326.smfex   +++|
00331  M00S00327.smfex   +++|ARRAY NULLFET(FETSIZ); ITEM NULLFETDT C(1,0,2);
00332  M00S00328.smfex   +++|
00333  M00S00329.smfex   +++|ARRAY SWPFETS [1:NUMSWPFET] S(FETSIZ);
00334  M00S00330.smfex   +++|  BEGIN
00335  M00S00331.smfex   +++|  ITEM SWPFET;
00336  M00S00332.smfex   +++|  ITEM SWPFETDONE B(0,59,1);
00337  M00S00333.smfex   +++|  ITEM SWPFETDT  C(1,0,2);
00338  M00S00334.smfex   +++|  ITEM SWPFETR   B(1,12,1);
00339  M00S00335.smfex   +++|  ITEM SWPFETL   U(1,36,6);
00340  M00S00336.smfex   +++|  ITEM SWPFETIN  U(2,42,18);
00341  M00S00337.smfex   +++|  ITEM SWPFETOUT U(3,42,18);
00342  M00S00338.smfex   +++|  ITEM SWPFETCRI U(6,0,30);
00343  M00S00339.smfex   +++|  ITEM SWPFETW   B(6,30,1);
00344  M00S00340.smfex   +++|  ITEM SWPFETRR  U(6,31,29);
00345  M00S00341.smfex   +++|  END
00346  M00S00342.smfex   +++|ARRAY DMBFET(FETSIZ);;
00347  M00S00343.smfex   +++|ARRAY FILINFPARMS (5);
00348  M00S00344.smfex   +++|  BEGIN
00349  M00S00345.smfex   +++|  ITEM FILINFNAME C(0,0,7);
00350  M00S00346.smfex   +++|  ITEM FILINFLENC U(0,42,18)=[O"050001"];
00351  M00S00347.smfex   +++|  ITEM FILINFSTAT U(1,12,42);
00352  M00S00348.smfex   +++|  ITEM FILINFTTY  B(1,43,1);
00353  M00S00349.smfex   +++|  ITEM FILINFRMS  B(1,44,1);
00354  M00S00350.smfex   +++|  ITEM FILINFWRIT B(1,52,1);
00355  M00S00351.smfex   +++|  ITEM FILINFREAD B(1,53,1);
00356  M00S00352.smfex   +++|  ITEM FILINFFT   U(1,54,6);
00357  M00S00353.smfex   +++|  END
00358  M00S00354.smfex   +++|PAGE                         # MINOR UTILITY ROUTINES      #
00359  M00S00355.smfex   +++|
00360  M00S00356.smfex   +++|
00361  M00S00357.smfex   +++|PROC INITBITMAP(MAP,NUMWORD,NUMBIT);
00362  M00S00358.smfex   +++|  BEGIN
00363  M00S00359.smfex   +++|#
00364  M00S00360.smfex   +++|**        INITBITMAP - INITIALIZE A BIT MAP ARRAY.
00365  M00S00361.smfex   +++|*
00366  M00S00362.smfex   +++|*         INITBITMAP PREPARES BITMAPS FOR USAGE.  A BIT MAP CONSISTS
00367  M00S00363.smfex   +++|*         OF ANY NUMBER OF WORDS, EACH CONTAINING A 32-BIT MASK.
00368  M00S00364.smfex   +++|*         THE MASK IS POSITIONED 12 BITS RIGHT FROM THE SIGN BIT OF
00369  M00S00365.smfex   +++|*         THE WORD.  THIS FORMAT ALLOWS SEARCHING FOR BITS WHICH ARE
00370  M00S00366.smfex   +++|*         STILL ON BY INSERTING A FLOATING POINT EXPONENT AND
00371  M00S00367.smfex   +++|*         EXECUTING THE NORMALIZE INSTRUCTION.
00372  M00S00368.smfex   +++|*
00373  M00S00369.smfex   +++|*         ENTRY  MAP - THE MAP TO INITIALIZE.
00374  M00S00370.smfex   +++|*                NUMWORD - HOW MANY WORDS IN THE MAP.
00375  M00S00371.smfex   +++|*                NUMBIT - HOW MANY TOTAL BITS IN THE MAP.
00376  M00S00372.smfex   +++|*
00377  M00S00373.smfex   +++|*         EXIT   MAP - SETUP.
00378  M00S00374.smfex   +++|*
00379  M00S00375.smfex   +++|*         CALLS  FORCEALLOC.
00380  M00S00376.smfex   +++|#
00381  M00S00377.smfex   +++|  ARRAY MAP[0:999]; ITEM MAPWORD;
00382  M00S00378.smfex   +++|  ITEM NUMWORD, NUMBIT;
00383  M00S00379.smfex   +++|  ITEM TMP1;
00384  M00S00380.smfex   +++|  FOR TMP1=0 STEP 1 UNTIL NUMWORD-1 DO MAPWORD[TMP1]
00385  M00S00381.smfex   +++|    =O"00007777777777600000";
00386  M00S00382.smfex   +++|  FOR TMP1=NUMBIT+1 STEP 1 UNTIL NUMWORD*32
00387  M00S00383.smfex   +++|    DO FORCEALLOC(MAP,TMP1,NUMWORD);
00388  M00S00384.smfex   +++|  END                          # OF INITBITMAP     #
00389  M00S00385.smfex   +++|
00390  M00S00386.smfex   +++|
00391  M00S00387.smfex   +++|PROC BUILDTASK(WHICH);
00392  M00S00388.smfex   +++|  BEGIN
00393  M00S00389.smfex   +++|#
00394  M00S00390.smfex   +++|**        BUILDTASK - ALLOCATE FIELD LENGTH AND INIT POINTERS.
00395  M00S00391.smfex   +++|*
00396  M00S00392.smfex   +++|*         BUILDTASK ALLOCATES FIELD LENGTH FOR PER-TASK ARRAYS, AND
00397  M00S00393.smfex   +++|*         MAPS OUT THE BASE ADDRESSES FOR THE ARRAYS.  BUILDTASK THEN
00398  M00S00394.smfex   +++|*         COPIES THE SET OF POINTERS INTO THE TASK'S DISPATCHING AREA.
00399  M00S00395.smfex   +++|*
00400  M00S00396.smfex   +++|*         ENTRY  WHICH - TASK NUMBER.
00401  M00S00397.smfex   +++|*                FIELDLEN - CURRENT TOP OF FIELD LENGTH.
00402  M00S00398.smfex   +++|*
00403  M00S00399.smfex   +++|*         EXIT   FIELDLEN - INCREASED.
00404  M00S00400.smfex   +++|*                TASKSPADR[WHICH] - ADDRESS OF TASK DISPATCH AREA.
00405  M00S00401.smfex   +++|*                TASK DISPATCH AREA - SETUP.
00406  M00S00402.smfex   +++|*
00407  M00S00403.smfex   +++|*         CALLS  FLDLEN, MOVEWD.
00408  M00S00404.smfex   +++|*
00409  M00S00405.smfex   +++|*         USES   POINTER WORDS FOR FOLLOWING ARRAYS -
Line S00406 Modification History
M01 (Removed by) ns2172
Seq #  *Modification Id* Act 
----------------------------+
00410  M01S00406.ns2172  ---|*                ARRAYSTART, SPLITCONTROL, ROWCONTROL, BACKSTACK,
00411  M01S00407.ns2172  ---|*                FKEYDEFS, AUDITSTAGE, LOCSTRING1, LOCSTRING2,
00412  M01S00408.ns2172  ---|*                CHGSTRING1, ARRAYEND, BFPRU, SWAPRSTK, DISPRSTK,
00413  M01S00409.ns2172  ---|*                TTOBUFFER, FET, OBF, DISK, READLST, LINEBUF, MOVTO.
Line S00001 Modification History
M01 (Added by) ns2172
M02 (Removed by) ns2353
Seq #  *Modification Id* Act 
----------------------------+
00414  M02S00001.ns2353  ---|*                ARRAYEND, ARRAYSTART, AUDITSTAGE, BACKSTACK, BFPRU,
00415  M02S00002.ns2353  ---|*                CHGSTRING1, DISK, DISPRSTK, FET, FKEYDEFS, LINEBUF,
00416  M02S00003.ns2353  ---|*                LOCSTRING1, LOCSTRING2, MOVTO, OBF, READLIST,
00417  M02S00004.ns2353  ---|*                ROWCONTROL, SPLITCONTROL, SWAPRSTK, TITLE1LIN,
00418  M02S00005.ns2353  ---|*                TITLE2LIN, TTOBUFFER.
Line S00001 Modification History
M01 (Added by) ns2353
Seq #  *Modification Id* Act 
----------------------------+
00419  M01S00001.ns2353  +++|*                ARRAYEND, ARRAYSTART, AUDITSTAGE, BACKSTACK,
00420  M01S00002.ns2353  +++|*                BACKSTORE, BFPRU, CHGSTRING1, DISK, DISPRSTK,
00421  M01S00003.ns2353  +++|*                FET, FKEYDEFS, LINEBUF, LOCSTRING1, LOCSTRING2,
00422  M01S00004.ns2353  +++|*                MOVTO, OBF, READLIST, ROWCONTROL, SPLITCONTROL,
00423  M01S00005.ns2353  +++|*                SWAPRSTK, TITLE1LIN, TITLE2LIN, TTOBUFFER.
00424  M00S00410.smfex   +++|*
00425  M00S00411.smfex   +++|*         NOTE   THIS CODE AND THE ARRAY LAYOUT IN COMFDAT ARE
00426  M00S00412.smfex   +++|*                EXTREMELY INTERDEPENDENT.
00427  M00S00413.smfex   +++|#
00428  M00S00414.smfex   +++|  ITEM WHICH;
00429  M00S00415.smfex   +++|  TASKADDR[WHICH]=FIELDLEN;
00430  M00S00416.smfex   +++|
00431  M00S00417.smfex   +++|  # FIRST ALLOCATE EDITOR ARRAYS, ORDER AND SIZE MATCHING COMFDAT #
00432  M00S00418.smfex   +++|  P<ARRAYSTART>=FIELDLEN;
00433  M00S00419.smfex   +++|  FIELDLEN=FIELDLEN+1;
Line S00002 Modification History
M01 (Added by) v23l617
Seq #  *Modification Id* Act 
----------------------------+
00434  M01S00002.v23l617 +++|  P<TABLEHEADR> = FIELDLEN;
00435  M01S00003.v23l617 +++|  FIELDLEN = FIELDLEN + 6;           # *TDU* TABLE LENGTH #
00436  M01S00004.v23l617 +++|  P<TABLEWORDS> = FIELDLEN;
00437  M01S00005.v23l617 +++|  FIELDLEN = FIELDLEN + O"272";      # *TDU* TABLE LENGTH #
00438  M00S00420.smfex   +++|  P<SPLITCONTROL>=FIELDLEN;
00439  M00S00421.smfex   +++|  FIELDLEN=FIELDLEN+2*SPLTCTLSIZ;
00440  M00S00422.smfex   +++|  P<ROWCONTROL>=FIELDLEN;
00441  M00S00423.smfex   +++|  FIELDLEN=FIELDLEN+2*(MAXROWS+1);
00442  M00S00424.smfex   +++|  P<BACKSTACK>=FIELDLEN;
00443  M00S00425.smfex   +++|  FIELDLEN=FIELDLEN+(BACKMAX+1);
Line S00006 Modification History
M01 (Added by) ns2353
Seq #  *Modification Id* Act 
----------------------------+
00444  M01S00006.ns2353  +++|  P<BACKSTORE>=FIELDLEN;
00445  M01S00007.ns2353  +++|  FIELDLEN=FIELDLEN+(2*(TEMPIND+1));
00446  M00S00426.smfex   +++|  P<FKEYDEFS>=FIELDLEN;
00447  M00S00427.smfex   +++|  FIELDLEN=FIELDLEN+NUMFKEYS;
00448  M00S00428.smfex   +++|  P<AUDITSTAGE>=FIELDLEN;
00449  M00S00429.smfex   +++|  FIELDLEN=FIELDLEN+AUDITSIZE+1;
00450  M00S00430.smfex   +++|  P<LOCSTRING1>=FIELDLEN;
00451  M00S00431.smfex   +++|  FIELDLEN=FIELDLEN+STRWID;
00452  M00S00432.smfex   +++|  P<LOCSTRING2>=FIELDLEN;
00453  M00S00433.smfex   +++|  FIELDLEN=FIELDLEN+STRWID;
00454  M00S00434.smfex   +++|  P<CHGSTRING1>=FIELDLEN;
00455  M00S00435.smfex   +++|  FIELDLEN=FIELDLEN+STRWID;
00456  M00S00436.smfex   +++|  P<FKEYSTRINGS>=FIELDLEN;
00457  M00S00437.smfex   +++|  FIELDLEN=FIELDLEN+(2*NUMFKEYS);
Line S00001 Modification History
M01 (Added by) ns2675
Seq #  *Modification Id* Act 
----------------------------+
00458  M01S00001.ns2675  +++|  P<FKEYNUMB>=FIELDLEN;
00459  M01S00002.ns2675  +++|  FIELDLEN=FIELDLEN+POSFKEYS;
Line S00006 Modification History
M01 (Added by) ns2172
Seq #  *Modification Id* Act 
----------------------------+
00460  M01S00006.ns2172  +++|  P<TITLE1LIN>=FIELDLEN;
Line S00007 Modification History
M01 (Added by) ns2172
M02 (Removed by) 242l642
Seq #  *Modification Id* Act 
----------------------------+
00461  M02S00007.242l642 ---|  FIELDLEN=FIELDLEN+STRWID;
Line S00001 Modification History
M01 (Added by) 242l642
Seq #  *Modification Id* Act 
----------------------------+
00462  M01S00001.242l642 +++|  FIELDLEN=FIELDLEN+TTLLNLEN+1;
Line S00008 Modification History
M01 (Added by) ns2172
Seq #  *Modification Id* Act 
----------------------------+
00463  M01S00008.ns2172  +++|  P<TITLE2LIN>=FIELDLEN;
Line S00009 Modification History
M01 (Added by) ns2172
M02 (Removed by) 242l642
Seq #  *Modification Id* Act 
----------------------------+
00464  M02S00009.242l642 ---|  FIELDLEN=FIELDLEN+STRWID;
Line S00002 Modification History
M01 (Added by) 242l642
Seq #  *Modification Id* Act 
----------------------------+
00465  M01S00002.242l642 +++|  FIELDLEN=FIELDLEN+TTLLNLEN+1;
00466  M00S00438.smfex   +++|  P<ARRAYEND>=FIELDLEN;
00467  M00S00439.smfex   +++|  FIELDLEN=FIELDLEN+1;
00468  M00S00440.smfex   +++|  # END OF ALLOCATED EDITOR ARRAYS #
00469  M00S00441.smfex   +++|
00470  M00S00442.smfex   +++|  # ALLOCATE BUFFERS AND CONTROL VECTORS #
00471  M00S00443.smfex   +++|  P<BFPRU>=FIELDLEN;
00472  M00S00444.smfex   +++|  FIELDLEN=FIELDLEN+BUFSIZE;
00473  M00S00445.smfex   +++|  P<SWAPRSTK>=FIELDLEN;
00474  M00S00446.smfex   +++|  FIELDLEN=FIELDLEN+MAXREENT;
00475  M00S00447.smfex   +++|  TASKDSPADR[WHICH]=FIELDLEN;
00476  M00S00448.smfex   +++|  FIELDLEN=FIELDLEN+DISPATLEN;
00477  M00S00449.smfex   +++|  P<DISPRSTK>=FIELDLEN;
00478  M00S00450.smfex   +++|  FIELDLEN=FIELDLEN+MAXREENT;
00479  M00S00451.smfex   +++|  P<TTOBUFFER>=FIELDLEN;
00480  M00S00452.smfex   +++|  FIELDLEN=FIELDLEN+SIZTTOBUF+2;
00481  M00S00453.smfex   +++|  P<FET>=FIELDLEN;
00482  M00S00454.smfex   +++|  FIELDLEN=FIELDLEN+FETSIZ;
00483  M00S00455.smfex   +++|  P<OBF>=FIELDLEN;
00484  M00S00456.smfex   +++|  FIELDLEN=FIELDLEN+OBFSIZE;
00485  M00S00457.smfex   +++|  P<DISK>=FIELDLEN;
00486  M00S00458.smfex   +++|  FIELDLEN=FIELDLEN+DSKSIZ;
00487  M00S00459.smfex   +++|  P<READLST>=FIELDLEN;
00488  M00S00460.smfex   +++|  FIELDLEN=FIELDLEN+LSTSIZE;
00489  M00S00461.smfex   +++|  FLDLEN(FIELDLEN+4);
00490  M00S00462.smfex   +++|  P<LINEBUF>=LOC(LIN);
00491  M00S00463.smfex   +++|  P<MOVTO>=TASKDSPADR[WHICH];
00492  M00S00464.smfex   +++|  MOVEWD(DISPATLEN,DATASTART,MOVTO);
00493  M00S00465.smfex   +++|  END                          # OF BUILDTASK      #
00494  M00S00466.smfex   +++|
00495  M00S00467.smfex   +++|
00496  M00S00468.smfex   +++|PROC GENWRKNAM;
00497  M00S00469.smfex   +++|  BEGIN
00498  M00S00470.smfex   +++|#
00499  M00S00471.smfex   +++|**        GENWRKNAM - GENERATE WORKFILE NAME FOR THIS USER.
00500  M00S00472.smfex   +++|*
00501  M00S00473.smfex   +++|*         GENWRKNAM DETERMINES THE CORRECT FILENAME FOR THE WORK-
00502  M00S00474.smfex   +++|*         FILE FOR THE CURRENT USER.  THE FILE NAME IS UNIQUE FOR
00503  M00S00475.smfex   +++|*         EACH USER AND IS GENERATED BY THE USER'S TLX CALL TO
00504  M00S00476.smfex   +++|*         CONNECT TO SMFEX, AND IS EQUAL TO "WK" PLUS JSN.
00505  M00S00477.smfex   +++|*
00506  M00S00478.smfex   +++|*         ENTRY  CURUSIAFNUM - IAF TERMINAL NUMBER.
00507  M00S00479.smfex   +++|*                USERJSN[CURUSER] - JSN OF THE USER'S JOB.
00508  M00S00480.smfex   +++|*
00509  M00S00481.smfex   +++|*         EXIT   WORKNAM - CORRECT NAME.
00510  M00S00482.smfex   +++|#
00511  M00S00483.smfex   +++|  C<0,2>WORKNAM="WK";
00512  M00S00484.smfex   +++|  C<2,4>WORKNAM=USERJSN[CURUSER];
00513  M00S00485.smfex   +++|  C<6,1>WORKNAM=0;
00514  M00S00486.smfex   +++|  END                         # OF GENWRKNAM      #
00515  M00S00487.smfex   +++|
00516  M00S00488.smfex   +++|
00517  M00S00489.smfex   +++|CONTROL IFEQ METERING,1;
00518  M00S00490.smfex   +++|  PROC ADDVECT(VECTOR,DATA);
00519  M00S00491.smfex   +++|    BEGIN
00520  M00S00492.smfex   +++|#
00521  M00S00493.smfex   +++|**        ADDVECT - ADD DATA INTO A STATISTICS VECTOR.
00522  M00S00494.smfex   +++|*
00523  M00S00495.smfex   +++|*         ADDVECT IS PART OF THE INSTRUMENTATION FEATURE OF SMFEX
00524  M00S00496.smfex   +++|*         AND SERVES TO INCREMENT THE TOTALS AND ONE VALUE-DEPENDENT
00525  M00S00497.smfex   +++|*         COUNTER IN A SELECTED VECTOR.  THE VECTOR HAS ONE WORD FOR
00526  M00S00498.smfex   +++|*         TOTAL VALUE AND TOTAL EVENT COUNT, THEN FOUR WORDS EACH
00527  M00S00499.smfex   +++|*         CONTAINING FOUR 15-BIT COUNTERS.  THE COUNTER TO BE
00528  M00S00500.smfex   +++|*         INCREMENTED IS SELECTED BY THE DATA VALUE, WITH THE FIRST
00529  M00S00501.smfex   +++|*         COUNTER FOR VALUES OF ZERO, THE SECOND FOR VALUES OF ONE,
00530  M00S00502.smfex   +++|*         AND THE THIRD THRU SIXTEENTH COUNTER CORRESPONDING TO
00531  M00S00503.smfex   +++|*         VALUES IN THE RANGE (2**(N-2)) .LE. VALUE .LT. (2**(N-1)).
00532  M00S00504.smfex   +++|*
00533  M00S00505.smfex   +++|*         ENTRY  DATA - VALUE TO RECORD.
00534  M00S00506.smfex   +++|*
00535  M00S00507.smfex   +++|*         EXIT   VECTOR - UPDATED.
00536  M00S00508.smfex   +++|#
00537  M00S00509.smfex   +++|    ITEM TMP1, TMP2, TMP3 R;
00538  M00S00510.smfex   +++|    ARRAY VECTOR[0:4]; ITEM WORD;
00539  M00S00511.smfex   +++|    ITEM DATA;
00540  M00S00512.smfex   +++|    B<0,30>WORD[0]=B<0,30>WORD[0]+DATA;
00541  M00S00513.smfex   +++|    B<30,30>WORD[0]=B<30,30>WORD[0]+1;
00542  M00S00514.smfex   +++|    IF DATA LQ 0 THEN TMP1=0;
00543  M00S00515.smfex   +++|    ELSE
00544  M00S00516.smfex   +++|      BEGIN
00545  M00S00517.smfex   +++|      TMP3=DATA*1.0;
00546  M00S00518.smfex   +++|      TMP1=B<6,6>TMP3-15;
00547  M00S00519.smfex   +++|      END
00548  M00S00520.smfex   +++|    TMP1=MAX(TMP1,0);
00549  M00S00521.smfex   +++|    TMP1=MIN(TMP1,15);
00550  M00S00522.smfex   +++|    TMP2=MOD4(TMP1)*15;
00551  M00S00523.smfex   +++|    TMP1=(TMP1/4)+1;
00552  M00S00524.smfex   +++|    IF B<TMP2,15>WORD[TMP1] NQ O"77777"
00553  M00S00525.smfex   +++|      THEN B<TMP2,15>WORD[TMP1]=B<TMP2,15>WORD[TMP1]+1;
00554  M00S00526.smfex   +++|   END                        # OF ADDVECT        #
00555  M00S00527.smfex   +++|CONTROL FI;
00556  M00S00528.smfex   +++|PAGE                         # TRACE ROUTINES FOR DEBUG    #
00557  M00S00529.smfex   +++|
00558  M00S00530.smfex   +++|
00559  M00S00531.smfex   +++|DEF TCTL # CONTROL IFEQ TRACEFLAG,1; #;
00560  M00S00532.smfex   +++|DEF TRCOUT(AA) # TCTL TRACEOUT(AA); CONTROL FI #;
00561  M00S00533.smfex   +++|DEF TRCSTR(AA) # TCTL TRACESTR(AA); CONTROL FI #;
00562  M00S00534.smfex   +++|DEF TRCDEC(AA) # TCTL TRACEDEC(AA); CONTROL FI #;
00563  M00S00535.smfex   +++|DEF TRCFRC     # TCTL TRACEFRC;     CONTROL FI #;
00564  M00S00536.smfex   +++|DEF TRCWORDS(AA,BB) # TCTL TRACEWORDS(AA,BB); CONTROL FI #;
00565  M00S00537.smfex   +++|DEF TRCBOTH(AA,BB)  # TCTL TRACEBOTH(AA,BB);  CONTROL FI #;
00566  M00S00538.smfex   +++|
00567  M00S00539.smfex   +++|
00568  M00S00540.smfex   +++|CONTROL IFEQ TRACEFLAG,1;
00569  M00S00541.smfex   +++|
00570  M00S00542.smfex   +++|  PROC TRACEOUT(TEXT);
00571  M00S00543.smfex   +++|    BEGIN
00572  M00S00544.smfex   +++|    ARRAY TEXT[0:99]; ITEM TXTWORD;
00573  M00S00545.smfex   +++|    ITEM INITED B=FALSE;
00574  M00S00546.smfex   +++|    ARRAY TRCFET (FETSIZ);;
00575  M00S00547.smfex   +++|    ARRAY TRCLIN[0:20]; ITEM TRCLINE;
00576  M00S00548.smfex   +++|    ITEM TRCPTR,TXTPTR;
00577  M00S00549.smfex   +++|    ARRAY TRCBUFF [0:O"2000"];;
00578  M00S00550.smfex   +++|
00579  M00S00551.smfex   +++|    IF NOT INITED THEN
00580  M00S00552.smfex   +++|      BEGIN
00581  M00S00553.smfex   +++|      INITED=TRUE;
00582  M00S00554.smfex   +++|      TRCPTR=0;
00583  M00S00555.smfex   +++|      MAKEFET(TRCFET,"TRACE",TRCBUFF,O"2001");
00584  M00S00556.smfex   +++|      END
00585  M00S00557.smfex   +++|    TXTPTR=0;
00586  M00S00558.smfex   +++|    TRCLINE[TRCPTR]=TXTWORD[TXTPTR];
00587  M00S00559.smfex   +++|    WHYLE B<48,12>TXTWORD[TXTPTR] NQ 0 DO
00588  M00S00560.smfex   +++|      BEGIN
00589  M00S00561.smfex   +++|      TXTPTR=TXTPTR+1;
00590  M00S00562.smfex   +++|      TRCPTR=TRCPTR+1;
00591  M00S00563.smfex   +++|      TRCLINE[TRCPTR]=TXTWORD[TXTPTR];
00592  M00S00564.smfex   +++|      END
00593  M00S00565.smfex   +++|    FOR TXTPTR=9 STEP -1 WHILE TXTPTR GQ 0
00594  M00S00566.smfex   +++|      AND C<TXTPTR,1>TRCLINE[TRCPTR] EQ ":"
00595  M00S00567.smfex   +++|      DO C<TXTPTR,1>TRCLINE[TRCPTR]=" ";
00596  M00S00568.smfex   +++|    TRCPTR=TRCPTR+1;
00597  M00S00569.smfex   +++|    TRCLINE[TRCPTR]=0;
00598  M00S00570.smfex   +++|    IF TRCPTR GQ 07 THEN
00599  M00S00571.smfex   +++|      BEGIN
00600  M00S00572.smfex   +++|      WRITEC(TRCFET,TRCLIN);
00601  M00S00573.smfex   +++|      TRCPTR=0;
00602  M00S00574.smfex   +++|      END
00603  M00S00575.smfex   +++|    RETURN;
00604  M00S00576.smfex   +++|
00605  M00S00577.smfex   +++|    ENTRY PROC TRACEWORDS(TEXT,NWORDS);
00606  M00S00578.smfex   +++|
00607  M00S00579.smfex   +++|    ITEM NWORDS;
00608  M00S00580.smfex   +++|
00609  M00S00581.smfex   +++|    IF NOT INITED THEN
00610  M00S00582.smfex   +++|      BEGIN
00611  M00S00583.smfex   +++|      INITED=TRUE;
00612  M00S00584.smfex   +++|      TRCPTR=0;
00613  M00S00585.smfex   +++|      MAKEFET(TRCFET,"TRACE",TRCBUFF,O"2001");
00614  M00S00586.smfex   +++|      END
00615  M00S00587.smfex   +++|    IF TRCPTR NQ 0 THEN
00616  M00S00588.smfex   +++|      BEGIN
00617  M00S00589.smfex   +++|      WRITEC(TRCFET,TRCLIN);
00618  M00S00590.smfex   +++|      TRCPTR=0;
00619  M00S00591.smfex   +++|      END
00620  M00S00592.smfex   +++|    WRITEW(TRCFET,TEXT,NWORDS);
00621  M00S00593.smfex   +++|    IF B<48,12>TXTWORD[NWORDS-1] NQ 0 THEN WRITEW(TRCFET,0,1);
00622  M00S00594.smfex   +++|    RETURN;
00623  M00S00595.smfex   +++|
00624  M00S00596.smfex   +++|    ENTRY PROC TRACEFRC;
00625  M00S00597.smfex   +++|
00626  M00S00598.smfex   +++|    IF TRCPTR NQ 0 THEN
00627  M00S00599.smfex   +++|      BEGIN
00628  M00S00600.smfex   +++|      WRITEC(TRCFET,TRCLIN);
00629  M00S00601.smfex   +++|      TRCPTR=0;
00630  M00S00602.smfex   +++|      END
00631  M00S00603.smfex   +++|    WRITER(TRCFET,1);
00632  M00S00604.smfex   +++|
00633  M00S00605.smfex   +++|    END                        # OF TRCOUT         #
00634  M00S00606.smfex   +++|
00635  M00S00607.smfex   +++|
00636  M00S00608.smfex   +++|  PROC TRACESTR(STR);
00637  M00S00609.smfex   +++|    BEGIN
00638  M00S00610.smfex   +++|
00639  M00S00611.smfex   +++|    ITEM STR C(40);
00640  M00S00612.smfex   +++|
00641  M00S00613.smfex   +++|    ARRAY TEXT [0:4]; ITEM TXTWORD;
00642  M00S00614.smfex   +++|    ITEM TMP1;
00643  M00S00615.smfex   +++|
00644  M00S00616.smfex   +++|    TXTWORD[0]=0;
00645  M00S00617.smfex   +++|    FOR TMP1=0 STEP 1 WHILE TMP1 LQ 39 AND C<TMP1,1>STR NQ "$" DO
00646  M00S00618.smfex   +++|      BEGIN
00647  M00S00619.smfex   +++|      C<MOD(TMP1,10),1>TXTWORD[TMP1/10]=C<TMP1,1>STR;
00648  M00S00620.smfex   +++|      TXTWORD[1+TMP1/10]=0;
00649  M00S00621.smfex   +++|      END
00650  M00S00622.smfex   +++|    TRCOUT(TEXT);
00651  M00S00623.smfex   +++|
00652  M00S00624.smfex   +++|    END                        # OF TRCSTR         #
00653  M00S00625.smfex   +++|
00654  M00S00626.smfex   +++|
00655  M00S00627.smfex   +++|  PROC TRACEDEC(NUM);
00656  M00S00628.smfex   +++|    BEGIN
00657  M00S00629.smfex   +++|    ITEM NUM;
00658  M00S00630.smfex   +++|    ITEM TMP1,TMP2,TMP3;
00659  M00S00631.smfex   +++|
00660  M00S00632.smfex   +++|    TMP1=NUM;
00661  M00S00633.smfex   +++|    TMP2=O"55555555555555330000";
00662  M00S00634.smfex   +++|    TMP3=7;
00663  M00S00635.smfex   +++|    IF TMP1 LS 0 THEN
00664  M00S00636.smfex   +++|      BEGIN
00665  M00S00637.smfex   +++|      C<0,1>TMP2="-";
00666  M00S00638.smfex   +++|      TMP1=-TMP1;
00667  M00S00639.smfex   +++|      END
00668  M00S00640.smfex   +++|    WHYLE TMP1 NQ 0 DO
00669  M00S00641.smfex   +++|      BEGIN
00670  M00S00642.smfex   +++|      C<TMP3,1>TMP2=O"33"+MOD(TMP1,10);
00671  M00S00643.smfex   +++|      TMP3=TMP3-1;
00672  M00S00644.smfex   +++|      TMP1=TMP1/10;
00673  M00S00645.smfex   +++|      END
00674  M00S00646.smfex   +++|    TRCOUT(TMP2);
00675  M00S00647.smfex   +++|
00676  M00S00648.smfex   +++|    END                        # OF TRCDEC         #
00677  M00S00649.smfex   +++|
00678  M00S00650.smfex   +++|
00679  M00S00651.smfex   +++|  PROC TRACEBOTH(AA,BB);
00680  M00S00652.smfex   +++|    BEGIN
00681  M00S00653.smfex   +++|    ARRAY AA;;
00682  M00S00654.smfex   +++|    ARRAY BB;;
00683  M00S00655.smfex   +++|    TRCSTR(AA);
00684  M00S00656.smfex   +++|    TRCDEC(BB);
00685  M00S00657.smfex   +++|    END                        # OF TRCBOTH        #
00686  M00S00658.smfex   +++|
00687  M00S00659.smfex   +++|CONTROL FI;
00688  M00S00660.smfex   +++|PAGE                         # UTIITIES FOR QUEUES, CHAINS, TABLES   #
00689  M00S00661.smfex   +++|
00690  M00S00662.smfex   +++|
00691  M00S00663.smfex   +++|PROC GETUSER;
00692  M00S00664.smfex   +++|  BEGIN
00693  M00S00665.smfex   +++|#
00694  M00S00666.smfex   +++|**        GETUSER - MAKE TABLE ENTRIES ACCESSIBLE FOR CURRENT USER.
00695  M00S00667.smfex   +++|*
00696  M00S00668.smfex   +++|*         GETUSER UNPACKS THE DENSELY FORMATTED, INDEXABLE USER
00697  M00S00669.smfex   +++|*         TABLE INTO THE SPARSE, NONINDEXABLE USER TABLE.  THE DENSE
00698  M00S00670.smfex   +++|*         TABLE PROVIDES CONSERVATION OF MEMORY CAPACITY, WHILE
00699  M00S00671.smfex   +++|*         THE SPARSE TABLE PROVIDES CONSERVATION OF CODE SIZE AND
00700  M00S00672.smfex   +++|*         TIMING FOR FREQUENT REFERENCES.
00701  M00S00673.smfex   +++|*
00702  M00S00674.smfex   +++|*         ENTRY  CURUSER - INDEX FOR WHICH USER.
00703  M00S00675.smfex   +++|*                USERTAB[CURUSER] - "DENSE PACK" FORMATTED TABLE.
00704  M00S00676.smfex   +++|*
00705  M00S00677.smfex   +++|*         EXIT   CURUSERTAB - EXPANDED COPY OF USERTAB.
00706  M00S00678.smfex   +++|*
00707  M00S00679.smfex   +++|*         CALLS  GETUTAB.
00708  M00S00680.smfex   +++|#
00709  M00S00681.smfex   +++|  BASED ARRAY PARM;;
00710  M00S00682.smfex   +++|  P<PARM>=LOC(USERTAB[CURUSER]);
00711  M00S00683.smfex   +++|  GETUTAB(PARM,CURUSERTAB);
00712  M00S00684.smfex   +++|  END                         # OF GETUSER        #
00713  M00S00685.smfex   +++|
00714  M00S00686.smfex   +++|
00715  M00S00687.smfex   +++|PROC PUTUSER;
00716  M00S00688.smfex   +++|  BEGIN
00717  M00S00689.smfex   +++|#
00718  M00S00690.smfex   +++|**        PUTUSER - PRESERVE TABLE ENTRIES IN DENSE TABLE.
00719  M00S00691.smfex   +++|*
00720  M00S00692.smfex   +++|*         PUTUSER IS CALLED TO COPY AND PACK THE SPARSELY FORMATTED,
00721  M00S00693.smfex   +++|*         NON-INDEXABLE USER TABLE INTO THE DENSELY FORMATTED,
00722  M00S00694.smfex   +++|*         INDEXABLE TABLE.  PUTUSER IS THUS THE OPPOSITE OF
00723  M00S00695.smfex   +++|*         GETUSER.  NOTE THAT THE SPARSE TABLE IS TEMPORARY AND
00724  M00S00696.smfex   +++|*         THE DENSE TABLE IS PERMANENT.
00725  M00S00697.smfex   +++|*
00726  M00S00698.smfex   +++|*         ENTRY  CURUSER - CURRENT USER.
00727  M00S00699.smfex   +++|*                CURUSERTAB - SPARSE TABLE.
00728  M00S00700.smfex   +++|*
00729  M00S00701.smfex   +++|*         EXIT   USERTAB[CURUSER] - PACKED VERSION OF TABLE.
00730  M00S00702.smfex   +++|*
00731  M00S00703.smfex   +++|*         CALLS  SAVUTAB.
00732  M00S00704.smfex   +++|#
00733  M00S00705.smfex   +++|  BASED ARRAY PARM;;
00734  M00S00706.smfex   +++|  P<PARM>=LOC(USERTAB[CURUSER]);
00735  M00S00707.smfex   +++|  SAVUTAB(PARM,CURUSERTAB);
00736  M00S00708.smfex   +++|  END                         # OF PUTUSER        #
00737  M00S00709.smfex   +++|
00738  M00S00710.smfex   +++|
00739  M00S00711.smfex   +++|PROC GETCOMMON;
00740  M00S00712.smfex   +++|  BEGIN
00741  M00S00713.smfex   +++|#
00742  M00S00714.smfex   +++|**        GETCOMMON - GET STORAGE FOR RIGHT TASK INTO COMMON.
00743  M00S00715.smfex   +++|*
00744  M00S00716.smfex   +++|*         TO CONSERVE CPU TIME REQUIRED FOR SHUFFLING OF THE COMMON
00745  M00S00717.smfex   +++|*         BLOCK IN MULTI-TASKING, THE COMMON BLOCK IS LEFT VOLATILE
00746  M00S00718.smfex   +++|*         WHEN ONE TASK GIVES UP THE CPU IN THE HOPE THAT THE SAME
00747  M00S00719.smfex   +++|*         TASK WILL BE THE NEXT TO USE THE CPU.  WHEN A DIFFERENT
00748  M00S00720.smfex   +++|*         TASK IS NEXT ON THE CPU, THEN WE MUST PERFORM THE DEFERRED
00749  M00S00721.smfex   +++|*         COPYING OF COMMON TO/FROM TASK DISPATCHING AREAS.
00750  M00S00722.smfex   +++|*
00751  M00S00723.smfex   +++|*         ENTRY  LASTTASK - TASK WHICH MOST RECENTLY USED COMMON.
00752  M00S00724.smfex   +++|*                    ZERO INDICATES COMMON IS NOT VOLATILE.
00753  M00S00725.smfex   +++|*                CURTASK - TASK WHICH NEEDS COMMON.
00754  M00S00726.smfex   +++|*                TASKSWPNOW[LASTTASK], TASKSWPIN[LASTTASK] -
00755  M00S00727.smfex   +++|*                    INDICATE IF VOLATILITY SUPPRESSED BY
00756  M00S00728.smfex   +++|*                    CURRENTLY ACTIVE SWAPIN.
00757  M00S00729.smfex   +++|*
00758  M00S00730.smfex   +++|*         EXIT   LASTTASK - EQUALS CURTASK.
00759  M00S00731.smfex   +++|*                COMMON BLOCK - SAVED IN LASTTASK IF NEEDED,
00760  M00S00732.smfex   +++|*                    UPDATED FOR CURTASK IF NEEDED.
00761  M00S00733.smfex   +++|*
00762  M00S00734.smfex   +++|*         CALLS  MOVEWD.
00763  M00S00735.smfex   +++|*
00764  M00S00736.smfex   +++|*         USES   P<MOVFROM>, P<MOVTO>.
00765  M00S00737.smfex   +++|#
00766  M00S00738.smfex   +++|  IF LASTTASK NQ 0 AND LASTTASK NQ CURTASK AND
00767  M00S00739.smfex   +++|    NOT (TASKSWPNOW[LASTTASK] AND TASKSWPIN[LASTTASK]) THEN
00768  M00S00740.smfex   +++|    BEGIN
00769  M00S00741.smfex   +++|    P<MOVTO>=TASKDSPADR[LASTTASK];
00770  M00S00742.smfex   +++|    MOVEWD(DISPATLEN,DATASTART,MOVTO);
00771  M00S00743.smfex   +++|    END
00772  M00S00744.smfex   +++|  IF LASTTASK NQ CURTASK THEN
00773  M00S00745.smfex   +++|    BEGIN
00774  M00S00746.smfex   +++|    P<MOVFROM>=TASKDSPADR[CURTASK];
00775  M00S00747.smfex   +++|    MOVEWD(DISPATLEN,MOVFROM,DATASTART);
00776  M00S00748.smfex   +++|    END
00777  M00S00749.smfex   +++|  LASTTASK=CURTASK;
00778  M00S00750.smfex   +++|  END                         # OF GETCOMMON      #
00779  M00S00751.smfex   +++|
00780  M00S00752.smfex   +++|
00781  M00S00753.smfex   +++|PROC PUTCOMMON;
00782  M00S00754.smfex   +++|  BEGIN
00783  M00S00755.smfex   +++|#
00784  M00S00756.smfex   +++|**        PUTCOMMON - COPY COMMON INTO DISPATCHING AREA.
00785  M00S00757.smfex   +++|*
00786  M00S00758.smfex   +++|*         PUTCOMMON IS CALLED WHEN THE LIVE COMMON BLOCK IS CONSIDERED
00787  M00S00759.smfex   +++|*         MORE CURRENT THAN THE COMMON IMAGE IN THE TASK DISPATCHING
00788  M00S00760.smfex   +++|*         AREA, AND REQUIRES IMMEDIATE COPYING.
00789  M00S00761.smfex   +++|*
00790  M00S00762.smfex   +++|*         ENTRY  CURTASK - CURRENT TASK.
00791  M00S00763.smfex   +++|*                TASKDSPADR[CURTASK] - ADDRESS OF DISPATCH AREA.
00792  M00S00764.smfex   +++|*
00793  M00S00765.smfex   +++|*         EXIT   DISPATCH AREA - UPDATED FROM DATASTART.
00794  M00S00766.smfex   +++|*
00795  M00S00767.smfex   +++|*         CALLS  MOVEWD.
00796  M00S00768.smfex   +++|*
00797  M00S00769.smfex   +++|*         USES   P<MOVTO>.
00798  M00S00770.smfex   +++|#
00799  M00S00771.smfex   +++|  # COPY DISPATCHABLE STORAGE FOR THIS TASK OUT OF COMMON #
00800  M00S00772.smfex   +++|  P<MOVTO>=TASKDSPADR[CURTASK];
00801  M00S00773.smfex   +++|  MOVEWD(DISPATLEN,DATASTART,MOVTO);
00802  M00S00774.smfex   +++|  END                         # OF PUTCOMMON      #
00803  M00S00775.smfex   +++|
00804  M00S00776.smfex   +++|
00805  M00S00777.smfex   +++|PROC KILL;
00806  M00S00778.smfex   +++|  BEGIN
00807  M00S00779.smfex   +++|#
00808  M00S00780.smfex   +++|**        KILL - ERASE USE FROM TABLES.
00809  M00S00781.smfex   +++|*
00810  M00S00782.smfex   +++|*         KILL IS CALLED WHEN DISCONNECTING A USER.  IT IS ASSUMED
00811  M00S00783.smfex   +++|*         THE USER IS NOT IN THE SWAPIN QUEUE.  THE USER MAY
00812  M00S00784.smfex   +++|*         HAVE TERMINAL INPUT BUFFERS, WHICH ARE RELEASED.  THEN
00813  M00S00785.smfex   +++|*         THE TABLE ENTRIES ARE ZEROED.
00814  M00S00786.smfex   +++|*
00815  M00S00787.smfex   +++|*         ENTRY  CURUSER - WHO TO KILL.
00816  M00S00788.smfex   +++|*                CURUSIAFNUM - IAF TERMINAL NUMBER.
00817  M00S00789.smfex   +++|*
00818  M00S00790.smfex   +++|*         EXIT   USERTAB[CURUSER], ORDWORD[CURUSIAFNUM] - ZERO.
00819  M00S00791.smfex   +++|*                CURUSERTAB - ZERO ALSO.
00820  M00S00792.smfex   +++|*
00821  M00S00793.smfex   +++|*         CALLS  PURGETTI, PUTUSER, GETUSER.
00822  M00S00794.smfex   +++|#
00823  M00S00795.smfex   +++|  PURGETTI;
00824  M00S00796.smfex   +++|  USERWORD0[CURUSER]=0;
00825  M00S00797.smfex   +++|  USERWORD1[CURUSER]=0;
00826  M00S00798.smfex   +++|  USERWORD2[CURUSER]=0;
00827  M00S00799.smfex   +++|  GETUSER;
00828  M00S00800.smfex   +++|  END                          # OF KILL #
00829  M00S00801.smfex   +++|
00830  M00S00802.smfex   +++|
00831  M00S00803.smfex   +++|PROC SCHEDULE;
00832  M00S00804.smfex   +++|  BEGIN
00833  M00S00805.smfex   +++|#
00834  M00S00806.smfex   +++|**        SCHEDULE - ASSURE USER WILL RUN IN A TASK SOON.
00835  M00S00807.smfex   +++|*
00836  M00S00808.smfex   +++|*         SCHEDULE IS USED WHENEVER WE RECEIVE A CODE FROM IAFEX,
00837  M00S00809.smfex   +++|*         ASSURES THE USER WILL BE SCHEDULED FOR TASK SERVICE OR WILL
00838  M00S00810.smfex   +++|*         BE ADEQUATELY SERVICED IF ALREADY IN A TASK.
00839  M00S00811.smfex   +++|*
00840  M00S00812.smfex   +++|*         ENTRY  CURUSER - USER TO BE QUEUED.
00841  M00S00813.smfex   +++|*                CURUSERTAB - ALL ENTRIES SETUP.
00842  M00S00814.smfex   +++|*                CURUSINTASK - WHETHER ALREADY SCHEDULED.
00843  M00S00815.smfex   +++|*                CURUSINQUE - WHETHER ALREADY QUEUED.
00844  M00S00816.smfex   +++|*                CURUSTASK - WHICH TASK IF CURUSINTASK TRUE.
00845  M00S00817.smfex   +++|*
00846  M00S00818.smfex   +++|*         EXIT   USER QUEUED IF NOT ALREADY IN TASK.
00847  M00S00819.smfex   +++|*                TASKREQUE[] - SET IF IN TASK TO SIGNAL EVENT.
00848  M00S00820.smfex   +++|*                TASKPULSE[] - SET TO QUICKLY END ANY DELAY.
00849  M00S00821.smfex   +++|*
00850  M00S00822.smfex   +++|*         CALLS  PUTINQ.
00851  M00S00823.smfex   +++|#
00852  M00S00824.smfex   +++|  IF CURUSINTASK THEN
00853  M00S00825.smfex   +++|    BEGIN
00854  M00S00826.smfex   +++|    TASKREQUE[CURUSTASK]=TRUE; # ASSURE KEEPS RUNNING        #
00855  M00S00827.smfex   +++|    TASKPULSE[CURUSTASK]=3;    # ASSURE NO CLOCK DELAY LOOP  #
00856  M00S00828.smfex   +++|    END
00857  M00S00829.smfex   +++|  ELSE IF NOT CURUSINQUE THEN PUTINQ;
00858  M00S00830.smfex   +++|
00859  M00S00831.smfex   +++|  END                          # OF SCHEDULE       #
00860  M00S00832.smfex   +++|
00861  M00S00833.smfex   +++|
00862  M00S00834.smfex   +++|PROC PUTINQ;
00863  M00S00835.smfex   +++|  BEGIN
00864  M00S00836.smfex   +++|#
00865  M00S00837.smfex   +++|**        PUTINQ - PUT CURRENT USER IN SCHEDULE QUEUE.
00866  M00S00838.smfex   +++|*
00867  M00S00839.smfex   +++|*         PUTINQ LINKS THE CURRENT USER ONTO THE QUEUE OF JOBS
00868  M00S00840.smfex   +++|*         WHICH HAVE BEEN SCHEDULED FOR FUTURE TASK ASSIGNMENT.
00869  M00S00841.smfex   +++|*         A NEW QUEUE LINKAGE IS STARTED IF THERE IS NO QUEUE
00870  M00S00842.smfex   +++|*         ALREADY.
00871  M00S00843.smfex   +++|*
00872  M00S00844.smfex   +++|*         ENTRY  CURUSER - CURRENT USER.
00873  M00S00845.smfex   +++|*                CURUSERTAB - ALL ENTRIES SETUP.
00874  M00S00846.smfex   +++|*                CURUSINQUE - MUST BE FALSE.
00875  M00S00847.smfex   +++|*                SWPQHEAD - ZERO IF NO QUEUE EXISTS, OR LINK TO HEAD
00876  M00S00848.smfex   +++|*                    OF QUEUE IF OTHER USERS ALREADY QUEUED.
00877  M00S00849.smfex   +++|*                SWPQTAIL - IF SWPQHEAD NON-TRIVIAL, LAST USER QUEUED.
00878  M00S00850.smfex   +++|*                SWPQSIZE - NUMBER OF USERS IN QUEUE.
00879  M00S00851.smfex   +++|*
00880  M00S00852.smfex   +++|*         EXIT   VIA MELT IF INVALID CONDITIONS.
00881  M00S00853.smfex   +++|*                SWPQHEAD - HEAD OF QUEUE.  (CURUSER IF NEW QUEUE)
00882  M00S00854.smfex   +++|*                SWPQTAIL - TAIL OF QUEUE NOW EQUALS CURUSER.
00883  M00S00855.smfex   +++|*                USERQUELNK[OLD SWPQTAIL] - LINKS TO CURUSER IF THERE
00884  M00S00856.smfex   +++|*                    WAS A PREVIOUS QUEUE.
00885  M00S00857.smfex   +++|*                CURUSINQUE - TRUE.
00886  M00S00858.smfex   +++|*                SWPQSIZE - INCREMENTED.
00887  M00S00859.smfex   +++|*
00888  M00S00860.smfex   +++|*         CALLS  MELT.
00889  M00S00861.smfex   +++|#
00890  M00S00862.smfex   +++|  CONTROL IFGQ PARANOIA,5;
00891  M00S00863.smfex   +++|    IF CURUSINQUE THEN MELT("PUTINQ 1$");
00892  M00S00864.smfex   +++|  CONTROL FI;
00893  M00S00865.smfex   +++|  IF SWPQHEAD EQ 0 THEN        # NEW QUEUE         #
00894  M00S00866.smfex   +++|    BEGIN
00895  M00S00867.smfex   +++|    SWPQHEAD=CURUSER;
00896  M00S00868.smfex   +++|    SWPQTAIL=CURUSER;
00897  M00S00869.smfex   +++|    CURUSQUELNK=0;
00898  M00S00870.smfex   +++|    END
00899  M00S00871.smfex   +++|  ELSE                         # APPEND TO QUEUE   #
00900  M00S00872.smfex   +++|    BEGIN
00901  M00S00873.smfex   +++|    USERQUELNK[SWPQTAIL]=CURUSER;
00902  M00S00874.smfex   +++|    CURUSQUELNK=0;
00903  M00S00875.smfex   +++|    SWPQTAIL=CURUSER;
00904  M00S00876.smfex   +++|    END
00905  M00S00877.smfex   +++|  CURUSINQUE=TRUE;
00906  M00S00878.smfex   +++|  SWPQSIZE=SWPQSIZE+1;
00907  M00S00879.smfex   +++|
00908  M00S00880.smfex   +++|  END                          # OF PUTINQ         #
00909  M00S00881.smfex   +++|
00910  M00S00882.smfex   +++|
00911  M00S00883.smfex   +++|PROC TAKEOFFQ;
00912  M00S00884.smfex   +++|  BEGIN
00913  M00S00885.smfex   +++|#
00914  M00S00886.smfex   +++|**        TAKEOFFQ - TAKE CURRENT USER OFF QUEUE.
00915  M00S00887.smfex   +++|*
00916  M00S00888.smfex   +++|*         TAKEOFFQ REMOVES THE CURRENT USER FROM THE QUEUE OF USERS
00917  M00S00889.smfex   +++|*         SCHEDULED FOR FUTURE TASK ASSIGNMENT.  THE CURRENT USER IS
00918  M00S00890.smfex   +++|*         REQUIRED TO BE IN THE QUEUE, BUT IS ALLOWED TO BE AT THE
00919  M00S00891.smfex   +++|*         HEAD, OR AT THE TAIL, OR ANYWHERE IN BETWEEN.  TAKEOFFQ
00920  M00S00892.smfex   +++|*         THEREFORE CONTAINS LOGIC TO CLOSE QUEUE LINKAGE UP AROUND
00921  M00S00893.smfex   +++|*         THE EXTRACTED USER.
00922  M00S00894.smfex   +++|*
00923  M00S00895.smfex   +++|*         ENTRY  CURUSER - CURRENT USER.
00924  M00S00896.smfex   +++|*                CURUSERTAB - ALL ENTRIES SETUP.
00925  M00S00897.smfex   +++|*                CURUSINQUE - MUST BE TRUE.
00926  M00S00898.smfex   +++|*                SWPQHEAD - HEAD OF QUEUE.
00927  M00S00899.smfex   +++|*                SWPQTAIL - TAIL OF QUEUE.
00928  M00S00900.smfex   +++|*                SWPQSIZE - NUMBER OF USERS IN QUEUE.
00929  M00S00901.smfex   +++|*                USERQUELNK[ALL IN QUEUE] - LINKAGE.
00930  M00S00902.smfex   +++|*
00931  M00S00903.smfex   +++|*         EXIT   CURUSINQUE - FALSE.
00932  M00S00904.smfex   +++|*                CURUSQUELNK - ZEROED OUT.
00933  M00S00905.smfex   +++|*                SWPQTAIL - BACKED TO PREVIOUSLY NEXT-TO-LAST
00934  M00S00906.smfex   +++|*                    USER IF CURUSER MATCHED SWPQTAIL.
00935  M00S00907.smfex   +++|*                SWPQHEAD - ADVANCED TO PREVIOUSLY SECOND USER IF
00936  M00S00908.smfex   +++|*                    CURUSER MATCHED SWPQHEAD.  ZERO IF CURUSER WAS
00937  M00S00909.smfex   +++|*                    ONLY USER IN QUEUE.
00938  M00S00910.smfex   +++|*                SWPQSIZE - DECREMENTED.
00939  M00S00911.smfex   +++|*
00940  M00S00912.smfex   +++|*         CALLS  MELT.
00941  M00S00913.smfex   +++|#
00942  M00S00914.smfex   +++|  ITEM TMP1,TMP2;
00943  M00S00915.smfex   +++|
00944  M00S00916.smfex   +++|  CONTROL IFGQ PARANOIA,5;
00945  M00S00917.smfex   +++|    IF NOT CURUSINQUE THEN MELT("TAKEOFFQ 1$");
00946  M00S00918.smfex   +++|  CONTROL FI;
00947  M00S00919.smfex   +++|  IF SWPQHEAD EQ CURUSER THEN  # TAKE FROM FRONT   #
00948  M00S00920.smfex   +++|    BEGIN
00949  M00S00921.smfex   +++|    IF SWPQHEAD EQ SWPQTAIL THEN SWPQTAIL=0;
00950  M00S00922.smfex   +++|    SWPQHEAD=CURUSQUELNK;
00951  M00S00923.smfex   +++|    END
00952  M00S00924.smfex   +++|  ELSE                         # FIND THEN EXTRACT #
00953  M00S00925.smfex   +++|    BEGIN
00954  M00S00926.smfex   +++|    TMP1=SWPQHEAD;
00955  M00S00927.smfex   +++|    WHYLE TMP1 NQ CURUSER DO
00956  M00S00928.smfex   +++|      BEGIN
00957  M00S00929.smfex   +++|      CONTROL IFGQ PARANOIA,5;
00958  M00S00930.smfex   +++|        IF TMP1 EQ 0 THEN MELT("TAKEOFFQ 2$");
00959  M00S00931.smfex   +++|      CONTROL FI;
00960  M00S00932.smfex   +++|      TMP2=TMP1;
00961  M00S00933.smfex   +++|      TMP1=USERQUELNK[TMP1];
00962  M00S00934.smfex   +++|      END
00963  M00S00935.smfex   +++|    IF TMP1 EQ SWPQTAIL THEN SWPQTAIL=TMP2;
00964  M00S00936.smfex   +++|    USERQUELNK[TMP2]=USERQUELNK[TMP1];
00965  M00S00937.smfex   +++|    END
00966  M00S00938.smfex   +++|  CURUSINQUE=FALSE;
00967  M00S00939.smfex   +++|  CURUSQUELNK=0;
00968  M00S00940.smfex   +++|  SWPQSIZE=SWPQSIZE-1;
00969  M00S00941.smfex   +++|
00970  M00S00942.smfex   +++|  END                          # OF TAKEOFFQ       #
00971  M00S00943.smfex   +++|
00972  M00S00944.smfex   +++|
00973  M00S00945.smfex   +++|PROC ALLOC(BITMAP,BITMASK,INDEX,LIMIT);
00974  M00S00946.smfex   +++|  BEGIN
00975  M00S00947.smfex   +++|#
00976  M00S00948.smfex   +++|**        ALLOC - ALLOCATE RESOURCE VIA BITMAP.
00977  M00S00949.smfex   +++|*
00978  M00S00950.smfex   +++|*         SEARCH THE BITMAP FOR AN AVAILABLE ENTITY, RETURN THE INDEX
00979  M00S00951.smfex   +++|*         FOR IT.  SET THE BIT AS UNAVAILABLE.  BITMAPS ARE 32-BITS
00980  M00S00952.smfex   +++|*         PER WORD, CENTERED, SO THAT THE FINDBIT ROUTINE CAN USE
00981  M00S00953.smfex   +++|*         OPTIMAL INSTRUCTIONS (E.G., NORMALIZE) TO FIND A BIT.  A
00982  M00S00954.smfex   +++|*         BIT IS ON TO SHOW AVAILABLE ENTITY.
00983  M00S00955.smfex   +++|*
00984  M00S00956.smfex   +++|*         ENTRY  BITMAP - THE BITMAP ARRAY TO SEARCH AND UPDATE.
00985  M00S00957.smfex   +++|*                BITMASK - ARRAY WITH "DONT USE" FLAGS.
00986  M00S00958.smfex   +++|*                LIMIT - SIZE OF ARRAYS.
00987  M00S00959.smfex   +++|*
00988  M00S00960.smfex   +++|*         EXIT   INDEX - ORDINAL OF ALLOCATED RESOURCE.
00989  M00S00961.smfex   +++|*                BITMAP - UPDATED TO REFLECT ALLOCATION.
00990  M00S00962.smfex   +++|*
00991  M00S00963.smfex   +++|*         CALLS  FINDBIT.
00992  M00S00964.smfex   +++|#
00993  M00S00965.smfex   +++|  ARRAY BITMAP[0:99]; ITEM BITWORD;
00994  M00S00966.smfex   +++|  ARRAY BITMASK;;
00995  M00S00967.smfex   +++|  ITEM INDEX, LIMIT;
00996  M00S00968.smfex   +++|
00997  M00S00969.smfex   +++|  INDEX=FINDBIT(LIMIT,BITMAP,BITMASK);
00998  M00S00970.smfex   +++|  IF INDEX NQ -1 THEN B<12+MOD32(INDEX),1>BITWORD[INDEX/32]=0;
00999  M00S00971.smfex   +++|  INDEX=INDEX+1;               # ADJUST TO ORIGIN OF ONE     #
01000  M00S00972.smfex   +++|
01001  M00S00973.smfex   +++|  END                          # OF ALLOC          #
01002  M00S00974.smfex   +++|
01003  M00S00975.smfex   +++|
01004  M00S00976.smfex   +++|PROC DEALLOC(BITMAP,INDEX,LIMIT);
01005  M00S00977.smfex   +++|  BEGIN
01006  M00S00978.smfex   +++|#
01007  M00S00979.smfex   +++|**        DEALLOC - UPDATED BITMAP TO MAKE RESOURCE AVAILABLE.
01008  M00S00980.smfex   +++|*
01009  M00S00981.smfex   +++|*         DEALLOC IS THE COUNTERPART TO ALLOC.
01010  M00S00982.smfex   +++|*
01011  M00S00983.smfex   +++|*         ENTRY  BITMAP - ARRAY CONTAINING ALLOCATION FLAGS.
01012  M00S00984.smfex   +++|*                INDEX - WHICH RESOURCE TO FREE UP.
01013  M00S00985.smfex   +++|*                LIMIT - SIZE OF BITMAP.
01014  M00S00986.smfex   +++|*
01015  M00S00987.smfex   +++|*         EXIT   BITMAP - UPDATED.
01016  M00S00988.smfex   +++|*
01017  M00S00989.smfex   +++|*         CALLS  MELT.
01018  M00S00990.smfex   +++|#
01019  M00S00991.smfex   +++|  ITEM INDEX, LIMIT;
01020  M00S00992.smfex   +++|  ARRAY BITMAP [0:99]; ITEM BITWORD;
01021  M00S00993.smfex   +++|  ITEM TMP1;
01022  M00S00994.smfex   +++|  TMP1=INDEX-1;
01023  M00S00995.smfex   +++|  CONTROL IFGQ PARANOIA,5;
01024  M00S00996.smfex   +++|    IF TMP1 GQ LIMIT*32 OR TMP1 LS 0 THEN MELT("DEALLOC 1$");
01025  M00S00997.smfex   +++|    IF B<12+MOD32(TMP1),1>BITWORD[TMP1/32] EQ 1
01026  M00S00998.smfex   +++|      THEN MELT("DEALLOC 2$");
01027  M00S00999.smfex   +++|  CONTROL FI;
01028  M00S01000.smfex   +++|  B<12+MOD32(TMP1),1>BITWORD[TMP1/32]=1;
01029  M00S01001.smfex   +++|  END                          # OF DEALLOC        #
01030  M00S01002.smfex   +++|
01031  M00S01003.smfex   +++|
01032  M00S01004.smfex   +++|PROC FORCEALLOC(BITMAP,INDEX,LIMIT);
01033  M00S01005.smfex   +++|  BEGIN
01034  M00S01006.smfex   +++|#
01035  M00S01007.smfex   +++|**        FORCEALLOC - ALLOCATE SPECIFIC RESOURCE WITHOUT SEARCH.
01036  M00S01008.smfex   +++|*
01037  M00S01009.smfex   +++|*         FORCES A BIT AS UNAVAIL.  USED TO CUT OFF EXCESS BITS AT
01038  M00S01010.smfex   +++|*         END OF A BITMAP AND TO SHUT OFF ENTITIES THAT HAVE SUFFERED
01039  M00S01011.smfex   +++|*         HARDWARE FAILURES.  (SUCH AS SEGMENTS OF ECS)
01040  M00S01012.smfex   +++|*
01041  M00S01013.smfex   +++|*         ENTRY  BITMAP - ARRAY OF ALLOCATION FLAGS.
01042  M00S01014.smfex   +++|*                INDEX - WHICH RESOURCE TO ALLOCATE.
01043  M00S01015.smfex   +++|*                LIMIT - SIZE OF BITMAP.
01044  M00S01016.smfex   +++|*
01045  M00S01017.smfex   +++|*         EXIT   BITMAP - UPDATED.
01046  M00S01018.smfex   +++|*
01047  M00S01019.smfex   +++|*         CALLS  MELT.
01048  M00S01020.smfex   +++|#
01049  M00S01021.smfex   +++|  ITEM INDEX,LIMIT;
01050  M00S01022.smfex   +++|  ARRAY BITMAP[0:99]; ITEM BITWORD;
01051  M00S01023.smfex   +++|  ITEM TMP1;
01052  M00S01024.smfex   +++|
01053  M00S01025.smfex   +++|  TMP1=INDEX-1;
01054  M00S01026.smfex   +++|  CONTROL IFGQ PARANOIA,5;
01055  M00S01027.smfex   +++|    IF TMP1 GQ LIMIT*32 OR TMP1 LS 0 THEN MELT("FORCEALLOC 1$");
01056  M00S01028.smfex   +++|  CONTROL FI;
01057  M00S01029.smfex   +++|  B<12+MOD32(TMP1),1>BITWORD[TMP1/32]=0;
01058  M00S01030.smfex   +++|
01059  M00S01031.smfex   +++|  END                          # OF FORCEALLOC     #
01060  M00S01032.smfex   +++|
01061  M00S01033.smfex   +++|
01062  M00S01034.smfex   +++|PROC KILLECSBITS(BITMAP);
01063  M00S01035.smfex   +++|  BEGIN
01064  M00S01036.smfex   +++|#
01065  M00S01037.smfex   +++|**        KILLECSBITS - FORCEALLOC ALL ECS SWAP PAGES.
01066  M00S01038.smfex   +++|*
01067  M00S01039.smfex   +++|*         ENTRY  BITMAP - ARRAY OF ALLOCATION FLAGS TO UPDATE.
01068  M00S01040.smfex   +++|*
01069  M00S01041.smfex   +++|*         BITMAP - UPDATED.
01070  M00S01042.smfex   +++|*
01071  M00S01043.smfex   +++|*         CALLS  FORCEALLOC.
01072  M00S01044.smfex   +++|#
01073  M00S01045.smfex   +++|  ARRAY BITMAP;;
01074  M00S01046.smfex   +++|  ITEM TMP1;
01075  M00S01047.smfex   +++|  FOR TMP1=1 STEP 1 UNTIL NUMSWPECS
01076  M00S01048.smfex   +++|    DO FORCEALLOC(BITMAP,TMP1,NUMSWPBIT);
01077  M00S01049.smfex   +++|  END                          # OF KILLECSBITS    #
01078  M00S01050.smfex   +++|
01079  M00S01051.smfex   +++|
01080  M00S01052.smfex   +++|PROC PURGETTI;
01081  M00S01053.smfex   +++|  BEGIN
01082  M00S01054.smfex   +++|#
01083  M00S01055.smfex   +++|**        PURGETTI - GET RID OF ANY TERMINAL INPUT CHAINS.
01084  M00S01056.smfex   +++|*
01085  M00S01057.smfex   +++|*         ENTRY  CURUSER - CURRENT USER.
01086  M00S01058.smfex   +++|*                CURUSTTIBUF - FIRST TTI BUFFER OR NULL.
01087  M00S01059.smfex   +++|*                REMAINTTI - HOW MANY BUFFERS STILL AVAIL.
01088  M00S01060.smfex   +++|*                TTIBUFLNK[ALL] - LINKAGES.
01089  M00S01061.smfex   +++|*                TTIBITS - ALLOCATION BITMASK.
01090  M00S01062.smfex   +++|*
01091  M00S01063.smfex   +++|*         EXIT   CURUSTTIBUF - NULL.
01092  M00S01064.smfex   +++|*                REMAINTTI - INCREMENTED.
01093  M00S01065.smfex   +++|*                TTIBITS - UPDATED.
01094  M00S01066.smfex   +++|*
01095  M00S01067.smfex   +++|*         CALLS  DEALLOC.
01096  M00S01068.smfex   +++|#
01097  M00S01069.smfex   +++|  ITEM TMP1;
01098  M00S01070.smfex   +++|  TRCSTR("PURGETTI$");
01099  M00S01071.smfex   +++|  TMP1=CURUSTTIBUF;
01100  M00S01072.smfex   +++|  WHYLE TMP1 NQ 0 DO
01101  M00S01073.smfex   +++|    BEGIN
01102  M00S01074.smfex   +++|    CURUSTTIBUF=0;
01103  M00S01075.smfex   +++|    DEALLOC(TTIBITS,TMP1,NUMTTIBIT);
01104  M00S01076.smfex   +++|    REMAINTTI=REMAINTTI+1;
01105  M00S01077.smfex   +++|    TMP1=TTIBUFLNK[TMP1];
01106  M00S01078.smfex   +++|    END
01107  M00S01079.smfex   +++|  END                          # OF PURGETTI       #
01108  M00S01080.smfex   +++|PAGE                         # MAJOR SYSTEM STATE ROUTINES #
01109  M00S01081.smfex   +++|
01110  M00S01082.smfex   +++|
01111  M00S01083.smfex   +++|PROC DROPSLICE;
01112  M00S01084.smfex   +++|  BEGIN
01113  M00S01085.smfex   +++|#
01114  M00S01086.smfex   +++|**        DROPSLICE - RECALL CPU FOR A LITTLE WHILE.
01115  M00S01087.smfex   +++|*
01116  M00S01088.smfex   +++|*         ENTRY  NO CONDITIONS.
01117  M00S01089.smfex   +++|*
01118  M00S01090.smfex   +++|*         EXIT   REAL TIME HAS BEEN DELAYED.
01119  M00S01091.smfex   +++|*
01120  M00S01092.smfex   +++|*         CALLS  RECALL, INSTRMNT1.
01121  M00S01093.smfex   +++|#
01122  M00S01094.smfex   +++|  RECALL(0);
01123  M00S01095.smfex   +++|  CONTROL IFEQ METERING,1;
01124  M00S01096.smfex   +++|    INSTRMNT1(INSTST"CLOCKTICK");
01125  M00S01097.smfex   +++|  CONTROL FI;
01126  M00S01098.smfex   +++|
01127  M00S01099.smfex   +++|  END                         # OF DROPSLICE      #
01128  M00S01100.smfex   +++|
01129  M00S01101.smfex   +++|
01130  M00S01102.smfex   +++|PROC DOTIMER;
01131  M00S01103.smfex   +++|  BEGIN
01132  M00S01104.smfex   +++|#
01133  M00S01105.smfex   +++|**        DOTIMER - SUPERVISE TIME DEPENDENCIES.
01134  M00S01106.smfex   +++|*
01135  M00S01107.smfex   +++|*         DOTIMER IS INTENDED TO BE CALLED ONCE PER MAIN LOOP.  THE
01136  M00S01108.smfex   +++|*         CPU IS RECALLED ONCE TO ACHIEVE A SMALL DELAY IN REAL TIME,
01137  M00S01109.smfex   +++|*         ABOUT 24 MILLISECONDS IF THE INSTALLATION RUNS WITH DEFAULT
01138  M00S01110.smfex   +++|*         OPERATOR PARAMETERS, THE TIME OF DAY IS NOTED, AND CERTAIN
01139  M00S01111.smfex   +++|*         FUNCTIONS ARE PERFORMED IF THE TIME OF DAY HAS ADVANCED
01140  M00S01112.smfex   +++|*         SUFFICIENTLY SINCE THE LAST TIME SUCH FUNCTIONS WERE
01141  M00S01113.smfex   +++|*         PERFORMED.
01142  M00S01114.smfex   +++|*
01143  M00S01115.smfex   +++|*         ON A CYCLE OF APPROX FIVE TIMES PER SECOND, WE LOOK FOR
01144  M00S01116.smfex   +++|*         OPERATOR COMMANDS AND SIGNAL RESTART OF ANY TASKS WHICH ARE
01145  M00S01117.smfex   +++|*         DELAYING FOR THE PURPOSE OF ACHIEVING A QUICK RECYCLE OF
01146  M00S01118.smfex   +++|*         THE SAME TASK FOR THE SAME USER.
01147  M00S01119.smfex   +++|*
01148  M00S01120.smfex   +++|*         ON A CYCLE OF APPROX TWO SECONDS, THE B-DISPLAY MESSAGE IS
01149  M00S01121.smfex   +++|*         UPDATED TO SHOW CURRENT LOAD PARAMETERS - NUMBER OF USERS
01150  M00S01122.smfex   +++|*         IN THE SUBSYSTEM AND NUMBER OF TASKS CURRENTLY ASSIGNED TO
01151  M00S01123.smfex   +++|*         EXECUTE.
01152  M00S01124.smfex   +++|*
01153  M00S01125.smfex   +++|*         ENTRY  TIMEOFDAY - TIME AT WHICH PREVIOUS CPU SLICE STARTED.
01154  M00S01126.smfex   +++|*                NEWTIMEDAY - EQUALS TIMEOFDAY OR TIME AT WHICH A TASK
01155  M00S01127.smfex   +++|*                WAS CONSIDERED FOR PREEMPTIVE SWAP, WHICHEVER LARGER.
01156  M00S01128.smfex   +++|*                SLICECOUNT - NUMBER OF CYCLES EXECUTED SO FAR.
01157  M00S01129.smfex   +++|*                LOGGEDIN - NUMBER OF USERS.
01158  M00S01130.smfex   +++|*                TASKSBUSY - NUMBER OF TASKS UTILIZED.
01159  M00S01131.smfex   +++|*                ENABLEFLAG - ENABLE/DISABLE NEW USERS OR NO-OP.
01160  M00S01132.smfex   +++|*
01161  M00S01133.smfex   +++|*         EXIT   OLDTIMEDAY - PREVIOUS VALUE FOR TIMEOFDAY.
01162  M00S01134.smfex   +++|*                TIMEOFDAY, NEWTIMEDAY - CURRENT TIME.
01163  M00S01135.smfex   +++|*                SLICECOUNT - INCREMENTED.
01164  M00S01136.smfex   +++|*                SHUTDOWN, SENSE SWITCHES - REFER TO DOOPER ROUTINE.
01165  M00S01137.smfex   +++|*                TASKPULSE[ALL] - 1 IF 5-HERTZ CYCLE OCCURRED.
01166  M00S01138.smfex   +++|*                B-DISPLAY UPDATED IF 2-SECOND CYCLE.
01167  M00S01139.smfex   +++|*
01168  M00S01140.smfex   +++|*         CALLS  DROPSLICE, DOOPER, RTIME, SMFSSTF, SFMCSTF,
01169  M00S01141.smfex   +++|*                CHECKTIME(INTERNAL), MESSAGE.
01170  M00S01142.smfex   +++|#
01171  M00S01143.smfex   +++|  # HANDLES TIME-OF-DAY DEPENDENT STUFF #
01172  M00S01144.smfex   +++|
01173  M00S01145.smfex   +++|  ITEM LAST5HZ=0, LAST2SEC=0;
01174  M00S01146.smfex   +++|  ITEM TMP1, TMP2, BOOL B;
01175  M00S01147.smfex   +++|
01176  M00S01148.smfex   +++|  PROC CHECKTIME(LAST,INTERVAL,FLAG);
01177  M00S01149.smfex   +++|    BEGIN
01178  M00S01150.smfex   +++|    ITEM LAST, INTERVAL, FLAG B;
01179  M00S01151.smfex   +++|    FLAG=FALSE;
01180  M00S01152.smfex   +++|    IF TIMEOFDAY-LAST GQ INTERVAL THEN
01181  M00S01153.smfex   +++|      BEGIN
01182  M00S01154.smfex   +++|      LAST=TIMEOFDAY;
01183  M00S01155.smfex   +++|      FLAG=TRUE;
01184  M00S01156.smfex   +++|      END
01185  M00S01157.smfex   +++|    END                       # OF CHECKTIME      #
01186  M00S01158.smfex   +++|
01187  M00S01159.smfex   +++|
01188  M00S01160.smfex   +++|  # DOTIMER MAIN CODE STARTS HERE #
01189  M00S01161.smfex   +++|
01190  M00S01162.smfex   +++|  DROPSLICE;                         # RECALL FOR A WHILE  #
01191  M00S01163.smfex   +++|  OLDTIMEDAY=NEWTIMEDAY;
01192  M00S01164.smfex   +++|  RTIME(TIMEOFDAY);
01193  M00S01165.smfex   +++|  B<0,30>TIMEOFDAY=0;          # DONT NEED UPPER PART        #
01194  M00S01166.smfex   +++|  NEWTIMEDAY=TIMEOFDAY;
01195  M00S01167.smfex   +++|  SLICECOUNT=SLICECOUNT+1;
01196  M00S01168.smfex   +++|
01197  M00S01169.smfex   +++|  IF ENABLEFLAG NQ 0 THEN
01198  M00S01170.smfex   +++|    BEGIN
01199  M00S01171.smfex   +++|    IF ENABLEFLAG GQ 0 AND SHUTDOWN EQ 0 THEN SFMSSTF;
01200  M00S01172.smfex   +++|    IF ENABLEFLAG LS 0 THEN SFMCSTF;
01201  M00S01173.smfex   +++|    ENABLEFLAG=0;
01202  M00S01174.smfex   +++|    END
01203  M00S01175.smfex   +++|
01204  M00S01176.smfex   +++|  CHECKTIME(LAST5HZ,200,BOOL); # 5 TIMES PER SECOND          #
01205  M00S01177.smfex   +++|  IF BOOL THEN
01206  M00S01178.smfex   +++|    BEGIN
01207  M00S01179.smfex   +++|    DOOPER;                          # LOOK FOR OPERATOR COMMANDS #
01208  M00S01180.smfex   +++|    # ACTIVATE ANY TASKS THAT ARE SPINNING WHEELS #
01209  M00S01181.smfex   +++|    FOR CURTASK=1 STEP 1 UNTIL NUMTASKS DO TASKPULSE[CURTASK]=3;
01210  M00S01182.smfex   +++|    END
01211  M00S01183.smfex   +++|
01212  M00S01184.smfex   +++|  CHECKTIME(LAST2SEC,2000,BOOL);       # ONCE EVERY TWO SECONDS      #
01213  M00S01185.smfex   +++|  IF BOOL THEN
01214  M00S01186.smfex   +++|    BEGIN
01215  M00S01187.smfex   +++|    # DISPLAY LOAD FACTORS #
01216  M00S01188.smfex   +++|    TMP1=LOGGEDIN;
01217  M00S01189.smfex   +++|    FOR TMP2=3 STEP -1 UNTIL 0 DO
01218  M00S01190.smfex   +++|      BEGIN
01219  M00S01191.smfex   +++|      C<TMP2,1>STATUSMSG=MOD(TMP1,10)+O"33";
01220  M00S01192.smfex   +++|      TMP1=TMP1/10;
01221  M00S01193.smfex   +++|      END
01222  M00S01194.smfex   +++|    C<12,1>STATUSMSG=O"33"+MOD(TASKSBUSY,10);
01223  M00S01195.smfex   +++|    C<11,1>STATUSMSG=O"33"+MOD(TASKSBUSY/10,10);
01224  M00S01196.smfex   +++|    C<28,2>STATUSMSG=0;
01225  M00S01197.smfex   +++|    MESSAGE(STATUSMSG,1,1);
01226  M00S01198.smfex   +++|    END
01227  M00S01199.smfex   +++|
01228  M00S01200.smfex   +++|  END                          # OF DOTIMER        #
01229  M00S01201.smfex   +++|
01230  M00S01202.smfex   +++|
01231  M00S01203.smfex   +++|PROC DOOPER;
01232  M00S01204.smfex   +++|  BEGIN
01233  M00S01205.smfex   +++|#
01234  M00S01206.smfex   +++|**        DOOPER - PERFORM OPERATOR FUNCTIONS.
01235  M00S01207.smfex   +++|*
01236  M00S01208.smfex   +++|*         DOOPER SHOULD BE CALLED FROM TIME TO TIME TO SEE IF THE
01237  M00S01209.smfex   +++|*         ENVIRONMENT INDICATES AN OPERATIONAL CHANGE IS OCCURRING.
01238  M00S01210.smfex   +++|*
01239  M00S01211.smfex   +++|*         THE FIRST ISSUANCE OF "IDLE,SMF." INDICATES THAT SMFEX
01240  M00S01212.smfex   +++|*         SHOULD ENROLL NO NEW USERS AND SHOULD TRANSITION EXISTING
01241  M00S01213.smfex   +++|*         USERS BACK TO THEIR SINGLE-USER EDITORS WITH COMPLETE
01242  M00S01214.smfex   +++|*         TRANSPARENCY.  THIS CAN BE DONE AS THE USERS CYCLE THROUGH
01243  M00S01215.smfex   +++|*         THE MAIN LOOP OF THE EDITOR.  WHEN THE USER COUNT REACHES
01244  M00S01216.smfex   +++|*         ZERO, SMFEX WILL SHUT DOWN.
01245  M00S01217.smfex   +++|*
01246  M00S01218.smfex   +++|*         A SECOND ISSUE OF THE IDLE COMMAND REQUESTS THAT SMFEX GET
01247  M00S01219.smfex   +++|*         OUT OF THE SYSTEM MORE RAPIDLY, POSSIBLY AT THE EXPENSE OF
01248  M00S01220.smfex   +++|*         SOME USERS RECEIVING INTERRUPT WARNING MESSAGES BUT STILL
01249  M00S01221.smfex   +++|*         WITH NO LOSS OF DATA.  SMFEX CAN STOP AS QUICKLY AS IT CAN
01250  M00S01222.smfex   +++|*         GET ANY CURRENT TASKS TO LEAVE THEIR INTERNAL CONTROL POINTS.
01251  M00S01223.smfex   +++|*
01252  M00S01224.smfex   +++|*         A THIRD ISSUE OF THE IDLE COMMAND REQUESTS EVEN MORE RAPID
01253  M00S01225.smfex   +++|*         SHUTDOWN.  ANY CURRENT TASKS WILL BE PAUSED AT THEIR NEXT
01254  M00S01226.smfex   +++|*         CIO RECALL.  THUS SOME USER COMMANDS MAY NOT COMPLETE, BUT
01255  M00S01227.smfex   +++|*         NO EDIT SESSIONS WILL SUFFER REGRESSIVE DAMAGE.
01256  M00S01228.smfex   +++|*
01257  M00S01229.smfex   +++|*         ANY TIME DOOPER DETECTS EITHER THE SLOWDOWN MODE OR THE
01258  M00S01230.smfex   +++|*         QUICK IDLE MODE, IT SETS THE ENABLEFLAG SO THAT DOTIMER
01259  M00S01231.smfex   +++|*         WILL DISABLE THE ACCESSABILITY OF THE SUBSYSTEM.
01260  M00S01232.smfex   +++|*
01261  M00S01233.smfex   +++|*         ENTRY  SHUTDOWN - PREVIOUS SHUTDOWN LEVEL IF ANY.
01262  M00S01234.smfex   +++|*                    0 = NORMAL PROCESSING.
01263  M00S01235.smfex   +++|*                    1 = ACCEPT NO USERS, KEEP RUNNING.
01264  M00S01236.smfex   +++|*                    2 = SPECIAL FOR RECOVERY FUNCTION.
01265  M00S01237.smfex   +++|*                    3 = SHUTDOWN WHEN TASKS BECOME EMPTY.
01266  M00S01238.smfex   +++|*                    4 = SHUTDOWN WHEN CIO CALLS COMPLETE.
01267  M00S01239.smfex   +++|*                SWAPGOOD, SWAPBAD - EXTENDED MEMORY CONTROLS.
01268  M00S01240.smfex   +++|*
01269  M00S01241.smfex   +++|*         EXIT   SHUTDOWN - UPDATED.
01270  M00S01242.smfex   +++|*                MEM[0] - UPDATED TO ACKNOWLEDGE IDLE COMMAND.
01271  M00S01243.smfex   +++|*                ENABLEFLAG - FORCED NEGATIVE IF DETECT NEW NON-TRIVIAL
01272  M00S01244.smfex   +++|*                    VALUE FOR SHUTDOWN FLAG.
01273  M00S01245.smfex   +++|#
01274  M00S01246.smfex   +++|  ITEM TMP1;
01275  M00S01247.smfex   +++|
01276  M00S01248.smfex   +++|  IF SHUTDOWN EQ 2 THEN RETURN;
01277  M00S01249.smfex   +++|
01278  M00S01250.smfex   +++|  IF MEM[0] LAN O"100000" NQ 0 THEN  # IDLE,SMF. #
01279  M00S01251.smfex   +++|    BEGIN
01280  M00S01252.smfex   +++|    IF IDLEDOWN THEN STOPNOW=TRUE;
01281  M00S01253.smfex   +++|    ELSE IF ACCEPTNONE THEN IDLEDOWN=TRUE;
01282  M00S01254.smfex   +++|    ELSE ACCEPTNONE=TRUE;
01283  M00S01255.smfex   +++|    MEM[0]=MEM[0] LXR O"100000";     # ACKNOWLEDGE IDLE COMMAND #
Line S00001 Modification History
M01 (Added by) ns2650
Seq #  *Modification Id* Act 
----------------------------+
01284  M01S00001.ns2650  +++|    ONSW(O"40");                     # SIGNAL SUBSYSTEM TERMINATION #
01285  M00S01256.smfex   +++|    END
01286  M00S01257.smfex   +++|
01287  M00S01258.smfex   +++|  TMP1=0;
01288  M00S01259.smfex   +++|  IF ACCEPTNONE THEN TMP1=1;
01289  M00S01260.smfex   +++|  IF IDLEDOWN THEN TMP1=3;
01290  M00S01261.smfex   +++|  IF STOPNOW THEN TMP1=4;
01291  M00S01262.smfex   +++|
01292  M00S01263.smfex   +++|  IF SHUTDOWN NQ TMP1 THEN
01293  M00S01264.smfex   +++|    BEGIN
01294  M00S01265.smfex   +++|    IF TMP1 NQ 0 THEN ENABLEFLAG=-1;
01295  M00S01266.smfex   +++|    ELSE ENABLEFLAG=1;
01296  M00S01267.smfex   +++|    END
01297  M00S01268.smfex   +++|  SHUTDOWN=TMP1;
01298  M00S01269.smfex   +++|
01299  M00S01270.smfex   +++|  CONTROL IFEQ ECSCODE,1;
01300  M00S01271.smfex   +++|    IF ECSDOWN THEN P<SWAPMASK>=LOC(SWAPBAD);
01301  M00S01272.smfex   +++|    ELSE P<SWAPMASK>=LOC(SWAPGOOD);
01302  M00S01273.smfex   +++|  CONTROL FI;
01303  M00S01274.smfex   +++|
01304  M00S01275.smfex   +++|  END                         # OF DOOPER         #
01305  M00S01276.smfex   +++|PAGE                         # DOINPUT -- RECEIVE SIC MSG AND QUEUE  #
01306  M00S01277.smfex   +++|
01307  M00S01278.smfex   +++|
01308  M00S01279.smfex   +++|PROC DOINPUT;
01309  M00S01280.smfex   +++|  BEGIN
01310  M00S01281.smfex   +++|#
01311  M00S01282.smfex   +++|**        DOINPUT - ACCEPT MESSAGES FROM IAFEX.
01312  M00S01283.smfex   +++|*
01313  M00S01284.smfex   +++|*         DOINPUT SUPERVISES ALL MESSAGE RECEIVED FROM IAF, AND
01314  M00S01285.smfex   +++|*         SHOULD BE CALLED BY THE MAIN LOOP ONCE PER RECALL CYCLE.
01315  M00S01286.smfex   +++|*         IAF COMMUNICATES WITH SMF BY USING THE SCP/UCP FACILITY
01316  M00S01287.smfex   +++|*         (IAF IS THE SCP AND SMF IS THE UCP) TO PLACE MESSAGES
01317  M00S01288.smfex   +++|*         INSIDE THE SMF FIELD LENGTH.  THE ADDRESS OF THE SMF WINDOW
01318  M00S01289.smfex   +++|*         FOR MESSAGES WAS ESTABLISHED BY SMF WHEN IT FIRST SENT A
01319  M00S01290.smfex   +++|*         MESSAGE TO IAF.  IAF CANNOT SEND ITS NEXT MESSAGE UNTIL SMF
01320  M00S01291.smfex   +++|*         ACKNOWLEDGES THE CURRENT MESSAGE BY CLEARING THE HEADER
01321  M00S01292.smfex   +++|*         WORD.
01322  M00S01293.smfex   +++|*
01323  M00S01294.smfex   +++|*         NOTE THAT THE DOINPUT ROUTINE PROCESSES RECEIPT OF
01324  M00S01295.smfex   +++|*         MESSAGES, BUT HAS NOTHING TO DO WITH SENDING MESSAGES TO
01325  M00S01296.smfex   +++|*         IAFEX.  THAT FUNCTION IS PROVIDED AS TASKS EXECUTE VIA
01326  M00S01297.smfex   +++|*         EXECUTIVE ROUTINES CALLED BY THE EDITOR MODULE.  DOINPUT
01327  M00S01298.smfex   +++|*         CAN TRANSMIT A MESSAGE TO IAFEX, BUT ONLY UNDER THE
01328  M00S01299.smfex   +++|*         EMERGENCY SITUATION WHERE THE USER TABLE HAS OVERFLOWED, IN
01329  M00S01300.smfex   +++|*         WHICH CASE THE USER BEING CONNECTED MUST BE IMMEDIATELY
01330  M00S01301.smfex   +++|*         DISCONNECTED BEFORE ANY OTHER SMFEX PROCESSING CAN PROCEED.
01331  M00S01302.smfex   +++|*         THIS SITUATION IS NORMALLY DISCOURAGED BY LOGIC TO DISABLE
01332  M00S01303.smfex   +++|*         SMFEX SUBSYSTEM ACCESSABILITY WHEN THE USER TABLE GETS
01333  M00S01304.smfex   +++|*         CLOSE TO THE FULL CONDITION.
01334  M00S01305.smfex   +++|*
01335  M00S01306.smfex   +++|*         MESSAGES FROM IAF ARE OF TWO BASIC FORMS - FIRST, A
01336  M00S01307.smfex   +++|*         QUICK-SHUTDOWN IS INDICATED BY NON-ZERO CONTENT APPEARING
01337  M00S01308.smfex   +++|*         IN SSCINP[-1], AND SECOND, A PRODUCTION MESSAGE IS
01338  M00S01309.smfex   +++|*         INDICATED BY NON-ZERO CONTENT IN ONE OR MORE WORDS STARTING
01339  M00S01310.smfex   +++|*         WITH SSCINP[0].
01340  M00S01311.smfex   +++|*
01341  M00S01312.smfex   +++|*         PRODUCTION MESSAGES CAN APPEAR IN SIX VARIATIONS - (1)
01342  M00S01313.smfex   +++|*         INITIALIZATION OF IAF, (2) COMMAND TEXT, (3)
01343  M00S01314.smfex   +++|*         ACKNOWLEDGEMENT THAT OUTPUT HAS BEEN RECEIVED AND MORE CAN
01344  M00S01315.smfex   +++|*         BE ACCEPTED, (4) USER BREAK, (5) DETACHMENT OF TERMINAL
01345  M00S01316.smfex   +++|*         FROM JOB, AND (6) CONNECTION OF A NEW USER INTO SMFEX.
01346  M00S01317.smfex   +++|*
01347  M00S01318.smfex   +++|*         THE SECOND THRU FIFTH MESSAGE TYPES REQUIRE REFERENCE TO AN
01348  M00S01319.smfex   +++|*         EXISTING USER WITHIN SMFEX.  THE SECOND MESSAGE TYPE
01349  M00S01320.smfex   +++|*         CARRIES ARBITRARY TEXT ALONG WITH THE HEADER WORD, AND THE
01350  M00S01321.smfex   +++|*         SIXTH MESSAGE TYPE CARRIES ONE WORD OF TEXT WITH THE HEADER
01351  M00S01322.smfex   +++|*         WORD.  THE OTHER MESSAGE TYPES CONSIST SOLELY OF THE HEADER
01352  M00S01323.smfex   +++|*         WORD.
01353  M00S01324.smfex   +++|*
01354  M00S01325.smfex   +++|*         COMMAND MESSAGES CAUSE SCHEDULING OF THE USER FOR TASK
01355  M00S01326.smfex   +++|*         PROCESSING, AND TO ENABLE THE RECEIPT OF ADDITIONAL
01356  M00S01327.smfex   +++|*         MESSAGES FROM IAF WHILE THE TASK SWAPS IN, THE MESSAGE TEXT
01357  M00S01328.smfex   +++|*         IS QUEUED IN ONE OF THE TERMINAL INPUT BUFFERS.  SINCE ONE
01358  M00S01329.smfex   +++|*         COMMAND MESSAGE MAY BE JUST A FRAGMENT OF THE ENTIRE
01359  M00S01330.smfex   +++|*         COMMAND TEXT, INPUT BUFFERS ARE LINKED TO THE USER AND TO
01360  M00S01331.smfex   +++|*         EACH OTHER AS NEEDED.
01361  M00S01332.smfex   +++|*
01362  M00S01333.smfex   +++|*         SMFEX ATTEMPTS TO AVOID RUNNING OUT OF INPUT BUFFERS WITH
01363  M00S01334.smfex   +++|*         "TRY HARDER" TASK SCHEDULING RULES, BUT IF BUFFERS DO GET
01364  M00S01335.smfex   +++|*         EXHAUSTED, THEN DOINPUT SIMPLY NEGLECTS TO CLEAR AWAY THE
01365  M00S01336.smfex   +++|*         IAF WINDOW AT SSCINP[0], THUS PREVENTING IAF FROM SENDING
01366  M00S01337.smfex   +++|*         MORE MESSAGES UNTIL WE CATCH UP AND CAUSING FUTURE DOINPUT
01367  M00S01338.smfex   +++|*         CYCLES TO ONCE AGAIN ATTEMPT TO QUEUE THE INPUT.  IN THE
01368  M00S01339.smfex   +++|*         EXTREME CASE WHERE SMFEX FALLS BEHIND WITH IAFEX HOLDING 64
01369  M00S01340.smfex   +++|*         MESSAGES IN ITS OWN QUEUE, THEN IAFEX WILL TREAT SMFEX AS A
01370  M00S01341.smfex   +++|*         DERELICT AND REVERT ALL USERS BACK TO SINGLE-USER MODE.
01371  M00S01342.smfex   +++|*
01372  M00S01343.smfex   +++|*         USER BREAKS AND DETACHMENTS CAUSE TASK SCHEDULING WITH
01373  M00S01344.smfex   +++|*         APPROPRIATE FLAGS SET SO THE TASK WILL INTERRUPT NORMAL
01374  M00S01345.smfex   +++|*         PROCESSING AND REACT ACCORDINGLY.  FOR DETACHMENT, IAF
01375  M00S01346.smfex   +++|*         DELAYS DETACH COMPLETION UNTIL SMFEX FINALLY TRANSMITS AN
01376  M00S01347.smfex   +++|*         END-OF-EDIT MESSAGE.
01377  M00S01348.smfex   +++|*
01378  M00S01349.smfex   +++|*         OUTPUT ACCEPTANCE MESSAGES CAUSE TASK SCHEDULING FOR
01379  M00S01350.smfex   +++|*         CONTINUED EXECUTION.
01380  M00S01351.smfex   +++|*
01381  M00S01352.smfex   +++|*         CONNECTION MESSAGES CAUSE SMFEX TO ALLOCATE A NEW TABLE
01382  M00S01353.smfex   +++|*         ENTRY FOR THE USER, SAVING THE JSN AND EJT ORDINAL PROVIDED
01383  M00S01354.smfex   +++|*         IN THE SECOND WORD OF THE MESSAGE, WITH THE NEW USER
01384  M00S01355.smfex   +++|*         SCHEDULED FOR TASK EXECUTION SO THAT THE TRANSFERRED
01385  M00S01356.smfex   +++|*         WORKFILE CAN BE QUICKLY VALIDATED.
01386  M00S01357.smfex   +++|*
01387  M00S01358.smfex   +++|*         ENTRY  SSCINP[-1] - AS CLEARED BY PREVIOUS DOINPUT, OR
01388  M00S01359.smfex   +++|*                    NEW SHUTDOWN MESSAGE FROM IAFEX.
01389  M00S01360.smfex   +++|*                SSCINP[0] - AS CLEARED BY PREVIOUS DOINPUT, OR
01390  M00S01361.smfex   +++|*                    HEADER OF NEW MESSAGE FROM IAFEX.
01391  M00S01362.smfex   +++|*                SHUTDOWN - WHETHER TO PROCESS INPUT NORMALLY.
01392  M00S01363.smfex   +++|*                USER AND TASK TABLES SETUP.
01393  M00S01364.smfex   +++|*                REMAINTTI - NUMBER OF INPUT QUEUE BUFFERS LEFT.
01394  M00S01365.smfex   +++|*                TTIBITS - ALLOCATION BITMASK FOR INPUT BUFFERS.
01395  M00S01366.smfex   +++|*                TTIBUFADDR[ALL] - WHERE THE INPUT BUFFERS ARE.
01396  M00S01367.smfex   +++|*                TTIBUFLNK[ALL] - EXISTING LINKAGES OF GROUPED BUFFERS.
01397  M00S01368.smfex   +++|*                LOGGEDIN - NUMBER OF USERS IN SMFEX.
01398  M00S01369.smfex   +++|*                MAXLOGGED - HIGH WATER MARK OF LOGGEDIN.
01399  M00S01370.smfex   +++|*                SWAP QUEUE - SETUP.
01400  M00S01371.smfex   +++|*
01401  M00S01372.smfex   +++|*         EXIT   SSCINP[-1] - CLEARED.
01402  M00S01373.smfex   +++|*                SSCINP[0] - CLEARED UNLESS REMAINTTI WAS ZERO WITH
01403  M00S01374.smfex   +++|*                    A COMMAND MESSAGE AWAITING QUEUING.
01404  M00S01375.smfex   +++|*                LOGGEDIN - INCREMENTED IF CONNECTION MESSAGE.
01405  M00S01376.smfex   +++|*                MAXLOGGED - HIGH WATER MARK.
01406  M00S01377.smfex   +++|*                REMAINTTI - DECREMENTED IF COMMAND MESSAGE ARRIVED
01407  M00S01378.smfex   +++|*                    AND REMAINTTI WAS NOT ALREADY ZERO.
01408  M00S01379.smfex   +++|*                SWAP QUEUE - UPDATED AS NEEDED.
01409  M00S01380.smfex   +++|*                TERMINAL INPUT BUFFERS - IF ALLOCATED, THEN LINKED TO
01410  M00S01381.smfex   +++|*                    USER TABLE ENTRY OR TO EXISTING BUFFERS.
01411  M00S01382.smfex   +++|*                USER TABLE ENTRY - UPDATED AS NEEDED.
01412  M00S01383.smfex   +++|*                MEM[0] - SENSE SWITCH 6 SET AS NEEDED.
01413  M00S01384.smfex   +++|*                ENABLEFLAG - FORCED NEGATIVE IF NEARING FULL TABLE.
01414  M00S01385.smfex   +++|*
01415  M00S01386.smfex   +++|*         CALLS  MELT, INSTRMNT2, INSTRMNT1, ALLOC, MOVEWD,
01416  M00S01387.smfex   +++|*                SCHEDULE, PURGETTI, SYSTEM, RECALL, GETUSER, PUTINQ,
01417  M00S01388.smfex   +++|*                PUTUSER, MAX.
01418  M00S01389.smfex   +++|*
01419  M00S01390.smfex   +++|*         USES   IAFHEADER, CURUSER.
01420  M00S01391.smfex   +++|#
01421  M00S01392.smfex   +++|  ITEM TMP1,TMP2,TMP3;
01422  M00S01393.smfex   +++|
01423  M00S01394.smfex   +++|  SWITCH RCVFNCSW RCVINIT,RCVMSGIN,RCVOUTDONE,RCVBREAK,
01424  M00S01395.smfex   +++|                  RCVHUNGUP,RCVCONNECT;
01425  M00S01396.smfex   +++|  ARRAY VALIDATE[0:5]; ITEM VLDTUSR B=[FALSE,4(TRUE),FALSE];
01426  M00S01397.smfex   +++|  ARRAY REJECTION [0:1]; ITEM REJECTMSG;
Line S00001 Modification History
M01 (Added by) smfex4
Seq #  *Modification Id* Act 
----------------------------+
01427  M01S00001.smfex4  +++|  ITEM EJT;
01428  M00S01398.smfex   +++|
01429  M00S01399.smfex   +++|  IF SSCINP[-1] NQ 0 THEN
01430  M00S01400.smfex   +++|    BEGIN
01431  M00S01401.smfex   +++|    STOPNOW=TRUE;
01432  M00S01402.smfex   +++|    SSCINP[-1]=0;
Line S00002 Modification History
M01 (Added by) ns2650
Seq #  *Modification Id* Act 
----------------------------+
01433  M01S00002.ns2650  +++|    ONSW(O"40");               # SIGNAL SUBSYSTEM TERMINATION #
01434  M00S01403.smfex   +++|    END
01435  M00S01404.smfex   +++|
01436  M00S01405.smfex   +++|  IF SHUTDOWN GR 1 THEN RETURN;
01437  M00S01406.smfex   +++|
01438  M00S01407.smfex   +++|  IAFHEADER=SSCINP[0];
01439  M00S01408.smfex   +++|  IF IAFHEADER NQ 0 THEN         # WE HAVE RECEIVED SOMETHING  #
01440  M00S01409.smfex   +++|    BEGIN
01441  M00S01410.smfex   +++|    IF VLDTUSR[IAFFUNC] THEN
01442  M00S01411.smfex   +++|      BEGIN
01443  M00S01412.smfex   +++|      CURUSER=0;
01444  M00S01413.smfex   +++|      # SEARCH FOR USER AMONG RECENT TASK ASSIGNMENTS #
01445  M00S01414.smfex   +++|      FOR TMP1=1 STEP 1 UNTIL TASKSAVAIL DO
01446  M00S01415.smfex   +++|        BEGIN
01447  M00S01416.smfex   +++|        IF TASKUSER[TMP1] NQ 0 AND USERIAFNUM[TASKUSER[TMP1]]
01448  M00S01417.smfex   +++|          EQ IAFTERM THEN
01449  M00S01418.smfex   +++|          BEGIN
01450  M00S01419.smfex   +++|          CURUSER=TASKUSER[TMP1];
01451  M00S01420.smfex   +++|          GOTO RCVFOUND;
01452  M00S01421.smfex   +++|          END
01453  M00S01422.smfex   +++|        END
01454  M00S01423.smfex   +++|      # SEARCH FOR USER BY BRUTE FORCE #
01455  M00S01424.smfex   +++|      FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
01456  M00S01425.smfex   +++|        BEGIN
01457  M00S01426.smfex   +++|        IF USERIAFNUM[TMP1] EQ IAFTERM THEN
01458  M00S01427.smfex   +++|          BEGIN
01459  M00S01428.smfex   +++|          CURUSER=TMP1;
01460  M00S01429.smfex   +++|          GOTO RCVFOUND;
01461  M00S01430.smfex   +++|          END
01462  M00S01431.smfex   +++|        END
01463  M00S01432.smfex   +++|RCVFOUND:
01464  M00S01433.smfex   +++|      IF CURUSER LQ 0 OR CURUSER GR NUMSMFUSR THEN
01465  M00S01434.smfex   +++|        BEGIN
01466  M00S01435.smfex   +++|        SSCINP[0]=0;
01467  M00S01436.smfex   +++|        GOTO AFTERRCV;
01468  M00S01437.smfex   +++|        END
01469  M00S01438.smfex   +++|      GETUSER;
01470  M00S01439.smfex   +++|      END
01471  M00S01440.smfex   +++|    GOTO RCVFNCSW[IAFFUNC];
01472  M00S01441.smfex   +++|
01473  M00S01442.smfex   +++|RCVMSGIN:
01474  M00S01443.smfex   +++|      CONTROL IFEQ TRACEFLAG,1;
01475  M00S01444.smfex   +++|        P<MOVFROM>=LOC(SSCINP[1]);
01476  M00S01445.smfex   +++|        TMP1=IAFLEN-1;
01477  M00S01446.smfex   +++|      CONTROL FI;
01478  M00S01447.smfex   +++|      TRCBOTH("MSGIN$",CURUSER);
01479  M00S01448.smfex   +++|      TRCWORDS(MOVFROM,TMP1);
01480  M00S01449.smfex   +++|      CONTROL IFGQ PARANOIA,2;
01481  M00S01450.smfex   +++|        IF NOT CURUSLOGGED THEN MELT("DOIN 2$");
01482  M00S01451.smfex   +++|        IF IAFLEN GR SIZTTIBUF+1 THEN MELT("DOIN 22$");
01483  M00S01452.smfex   +++|      CONTROL FI;
01484  M00S01453.smfex   +++|      IF IAFLEN LS 2 THEN
01485  M00S01454.smfex   +++|        BEGIN
01486  M00S01455.smfex   +++|        SSCINP[0]=0;
01487  M00S01456.smfex   +++|        GOTO AFTERRCV;
01488  M00S01457.smfex   +++|        END
01489  M00S01458.smfex   +++|      CONTROL IFEQ METERING,1;
01490  M00S01459.smfex   +++|        INSTRMNT2(INSTST"INPUT",IAFLEN);
01491  M00S01460.smfex   +++|      CONTROL FI;
01492  M00S01461.smfex   +++|      IF REMAINTTI LQ 0 THEN   # TRY ANOTHER DAY   #
01493  M00S01462.smfex   +++|        BEGIN
01494  M00S01463.smfex   +++|        CONTROL IFEQ METERING,1;
01495  M00S01464.smfex   +++|          INSTRMNT1(INSTST"NOTTI");
01496  M00S01465.smfex   +++|        CONTROL FI;
01497  M00S01466.smfex   +++|        GOTO PASTRCV;
01498  M00S01467.smfex   +++|        END
01499  M00S01468.smfex   +++|      ALLOC(TTIBITS,TTIGOOD,TMP2,NUMTTIBIT);
01500  M00S01469.smfex   +++|      CONTROL IFGQ PARANOIA,2;
01501  M00S01470.smfex   +++|        IF TMP2 EQ 0 THEN MELT("DOIN 4$");       # MUST SUCCEED      #
01502  M00S01471.smfex   +++|      CONTROL FI;
01503  M00S01472.smfex   +++|      REMAINTTI=REMAINTTI-1;   # KEEP TRACK RESOURCE         #
01504  M00S01473.smfex   +++|      P<MOVFROM>=LOC(SSCINP[1]);
01505  M00S01474.smfex   +++|      P<MOVTO>=TTIBUFADDR[TMP2];
01506  M00S01475.smfex   +++|      TMP3=IAFLEN-1;
01507  M00S01476.smfex   +++|      MOVEWD(TMP3,MOVFROM,MOVTO);
01508  M00S01477.smfex   +++|      TTIBUFLEN[TMP2]=TMP3;
01509  M00S01478.smfex   +++|      TTIBUFLNK[TMP2]=0;
01510  M00S01479.smfex   +++|      IF CURUSTTIBUF EQ 0 THEN # START NEW CHAIN   #
01511  M00S01480.smfex   +++|        BEGIN
01512  M00S01481.smfex   +++|        CURUSTTIBUF=TMP2;
01513  M00S01482.smfex   +++|        CONTROL IFEQ METERING,1;
01514  M00S01483.smfex   +++|          TMP1=TIMEOFDAY-CURUSLASTIM;
01515  M00S01484.smfex   +++|          INSTRMNT2(INSTST"THNK",TMP1);
01516  M00S01485.smfex   +++|        CONTROL FI;
01517  M00S01486.smfex   +++|        END
01518  M00S01487.smfex   +++|      ELSE                     # ADD TO CHAIN      #
01519  M00S01488.smfex   +++|        BEGIN
01520  M00S01489.smfex   +++|        TMP1=CURUSTTIBUF;
01521  M00S01490.smfex   +++|        WHYLE TMP1 NQ 0 DO
01522  M00S01491.smfex   +++|          BEGIN
01523  M00S01492.smfex   +++|          TMP3=TMP1;
01524  M00S01493.smfex   +++|          TMP1=TTIBUFLNK[TMP1];
01525  M00S01494.smfex   +++|          END
01526  M00S01495.smfex   +++|        TTIBUFLNK[TMP3]=TMP2;
01527  M00S01496.smfex   +++|        END
01528  M00S01497.smfex   +++|      SCHEDULE;
01529  M00S01498.smfex   +++|      GOTO ENDRCV;
01530  M00S01499.smfex   +++|
01531  M00S01500.smfex   +++|RCVBREAK:
01532  M00S01501.smfex   +++|      TRCBOTH("BREAK$",CURUSER);
01533  M00S01502.smfex   +++|      CONTROL IFEQ METERING,1;
01534  M00S01503.smfex   +++|        INSTRMNT1(INSTST"BREAKS");
01535  M00S01504.smfex   +++|      CONTROL FI;
01536  M00S01505.smfex   +++|      IF NOT CURUSLOGGED THEN GOTO ENDRCV;
01537  M00S01506.smfex   +++|      CURUSINTRPT=TRUE;
01538  M00S01507.smfex   +++|      CURUSCRUNCH=FALSE;     # IMPROVE SCHEDULEING PRIORITY          #
01539  M00S01508.smfex   +++|      PURGETTI;
01540  M00S01509.smfex   +++|      SCHEDULE;
01541  M00S01510.smfex   +++|      GOTO ENDRCV;
01542  M00S01511.smfex   +++|
01543  M00S01512.smfex   +++|RCVHUNGUP:
01544  M00S01513.smfex   +++|      TRCBOTH("HUNGUP$",CURUSER);
01545  M00S01514.smfex   +++|      CONTROL IFEQ METERING,1;
01546  M00S01515.smfex   +++|        INSTRMNT1(INSTST"HANGUPS");
01547  M00S01516.smfex   +++|      CONTROL FI;
Line S00003 Modification History
M01 (Added by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
01548  M01S00003.ns2136  +++|      CURUSDROP=TRUE;
01549  M00S01517.smfex   +++|      CURUSRCVRY=TRUE;
01550  M00S01518.smfex   +++|      GOTO RCVBREAK;
01551  M00S01519.smfex   +++|
01552  M00S01520.smfex   +++|RCVINIT:
01553  M00S01521.smfex   +++|      STOPNOW=TRUE;
01554  M00S01522.smfex   +++|      GOTO AFTERRCV;
01555  M00S01523.smfex   +++|
01556  M00S01524.smfex   +++|RCVOUTDONE:                # TTY OUTPUT COMPLETE         #
01557  M00S01525.smfex   +++|      TRCBOTH("TOCIN $",CURUSER);
01558  M00S01526.smfex   +++|      CONTROL IFGQ PARANOIA,3;
01559  M00S01527.smfex   +++|        IF NOT CURUSLOGGED THEN MELT("DOIN 43$");
01560  M00S01528.smfex   +++|      CONTROL FI;
01561  M00S01529.smfex   +++|      SCHEDULE;
01562  M00S01530.smfex   +++|      GOTO ENDRCV;
01563  M00S01531.smfex   +++|
01564  M00S01532.smfex   +++|RCVCONNECT:
01565  M00S01533.smfex   +++|      TRCBOTH("CONNECT$",IAFTERM);
01566  M00S01534.smfex   +++|      IF IAFTERM GR MAXCONNECT THEN MELT("TABLE LIMIT$");
01567  M00S01535.smfex   +++|      CURUSER=0;
01568  M00S01536.smfex   +++|      FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
01569  M00S01537.smfex   +++|        BEGIN
01570  M00S01538.smfex   +++|        IF USERIAFNUM[TMP1] EQ IAFTERM THEN CURUSER=TMP1;
01571  M00S01539.smfex   +++|        IF CURUSER EQ 0 THEN
01572  M00S01540.smfex   +++|          BEGIN
Line S01541 Modification History
M01 (Removed by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
01573  M01S01541.ns2136  ---|          IF (NOT USERLOGGED[TMP1]) AND (NOT USERLOGIN[TMP1])
01574  M01S01542.ns2136  ---|            THEN CURUSER=TMP1;
Line S00004 Modification History
M01 (Added by) ns2136
Seq #  *Modification Id* Act 
----------------------------+
01575  M01S00004.ns2136  +++|          IF NOT USERLOGGED[TMP1] THEN CURUSER=TMP1;
01576  M00S01543.smfex   +++|          END
01577  M00S01544.smfex   +++|        END
01578  M00S01545.smfex   +++|      TRCBOTH("PICK USER$",CURUSER);
01579  M00S01546.smfex   +++|      IF CURUSER EQ 0 THEN
01580  M00S01547.smfex   +++|        BEGIN
01581  M00S01548.smfex   +++|        # CRITICAL TABLE SPACE SHORTAGE - SEND LOGOUT FUNCTION TO  #
01582  M00S01549.smfex   +++|        # IAF IMMEDIATELY AND SERIALIZE UNTIL THIS IS ACCOMPLISHED #
Line S00002 Modification History
M01 (Added by) smfex4
Seq #  *Modification Id* Act 
----------------------------+
01583  M01S00002.smfex4  +++|        EJT=B<48,12>SSCINP[1];
01584  M00S01550.smfex   +++|TRYREJECT:
01585  M00S01551.smfex   +++|        IAFFUNC=SMF2IAF"LOGOUT";
01586  M00S01552.smfex   +++|        IAFLEN=1;
01587  M00S01553.smfex   +++|        IAFPTR=0;
01588  M00S01554.smfex   +++|        REJECTMSG[0]=0;
01589  M00S01555.smfex   +++|        REJECTMSG[1]=IAFHEADER;
01590  M00S01556.smfex   +++|        P<SSCBUFFER>=LOC(REJECTION);
01591  M00S01557.smfex   +++|        SSCTYPE=O"3";
01592  M00S01558.smfex   +++|        SSCCOUNT=1;
01593  M00S01559.smfex   +++|        SYSREQ("SSC",0,LOC(SSCBUFFER),IAFSSID);
01594  M00S01560.smfex   +++|        IF SSCSTATUS LAN O"7776" EQ 4 THEN
01595  M00S01561.smfex   +++|          BEGIN
01596  M00S01562.smfex   +++|          RECALL(0);
01597  M00S01563.smfex   +++|          GOTO TRYREJECT;
01598  M00S01564.smfex   +++|          END
01599  M01S00003.smfex4  +++|        EESET((TTEQ*4096)+EJT);
01600  M00S01565.smfex   +++|        GOTO AFTERRCV;
01601  M00S01566.smfex   +++|        END
01602  M00S01567.smfex   +++|      USERFLAGS[CURUSER]=0;
01603  M00S01568.smfex   +++|      GETUSER;
01604  M00S01569.smfex   +++|      CURUSLOGGED=TRUE;
01605  M00S01570.smfex   +++|      CURUSSTART=TRUE;
01606  M00S01571.smfex   +++|      CURUSIAFNUM=IAFTERM;
01607  M00S01572.smfex   +++|      USERJSN[CURUSER]=C<0,4>SSCINP[1];
01608  M00S01573.smfex   +++|      USEREJT[CURUSER]=B<48,12>SSCINP[1];
01609  M00S01574.smfex   +++|      LOGGEDIN=LOGGEDIN+1;
01610  M00S01575.smfex   +++|      IF LOGGEDIN GQ NUMSMFUSR-2 THEN ENABLEFLAG=-1;
01611  M00S01576.smfex   +++|      CONTROL IFEQ METERING,1;
01612  M00S01577.smfex   +++|        MAXLOGGED=MAX(MAXLOGGED,LOGGEDIN);
01613  M00S01578.smfex   +++|      CONTROL FI;
01614  M00S01579.smfex   +++|      PUTINQ;
01615  M00S01580.smfex   +++|      GOTO ENDRCV;
01616  M00S01581.smfex   +++|
01617  M00S01582.smfex   +++|ENDRCV:
01618  M00S01583.smfex   +++|      CURUSLASTIM=TIMEOFDAY;
01619  M00S01584.smfex   +++|      SSCINP[0]=0;
01620  M00S01585.smfex   +++|PASTRCV:
01621  M00S01586.smfex   +++|      PUTUSER;
01622  M00S01587.smfex   +++|AFTERRCV:
01623  M00S01588.smfex   +++|
01624  M00S01589.smfex   +++|    END                         # OF BUFFER0 HANDLER          #
01625  M00S01590.smfex   +++|
01626  M00S01591.smfex   +++|  END                          # OF DOINPUT        #
01627  M00S01592.smfex   +++|PAGE                         # RUNJOBS -- TRY TO DO SOME USER CODE   #
01628  M00S01593.smfex   +++|
01629  M00S01594.smfex   +++|
01630  M00S01595.smfex   +++|
01631  M00S01596.smfex   +++|PROC RUNJOBS;
01632  M00S01597.smfex   +++|  BEGIN
01633  M00S01598.smfex   +++|#
01634  M00S01599.smfex   +++|**        RUNJOBS - SUPERVISE TASK EXECUTION.
01635  M00S01600.smfex   +++|*
01636  M00S01601.smfex   +++|*         RUNJOBS CONTROLS TASK EXECUTION.  TASKS GET THE CPU ONLY
01637  M00S01602.smfex   +++|*         FROM RUNJOBS, AND ARE REQUIRED TO EXIT EACH TIME SLICE TO
01638  M00S01603.smfex   +++|*         THE APPROPRIATE LABEL WITHIN RUNJOBS.  SINCE RUNJOBS IS THE
01639  M00S01604.smfex   +++|*         SOLE PATH FOR TASKS TO RECEIVE CONTROL, IT IS NOT NECESSARY
01640  M00S01605.smfex   +++|*         FOR RUNJOBS ITSELF TO USE REENTRANT ENTRY AND EXIT EVEN
01641  M00S01606.smfex   +++|*         THOUGH ITS SUBROUTINES ARE THEMSELVES REENTRANT.
01642  M00S01607.smfex   +++|*
01643  M00S01608.smfex   +++|*         NOTE THAT THERE IS NO ARCHITECTURAL PROTECTION AGAINST
01644  M00S01609.smfex   +++|*         RENEGADE TASKS.  IF A TASK LOOPS OR OVERWRITES MEMORY, THE
01645  M00S01610.smfex   +++|*         ENTIRE SUBSYSTEM WILL BE IMPACTED.  THEREFORE, MULTI-USER
01646  M00S01611.smfex   +++|*         EDITING CODE MUST BE BUG-FREE.  EDITING CODE MUST ALSO BE
01647  M00S01612.smfex   +++|*         SENSITIVE AND REASONABLE IN RESOURCE CONSUMPTION SINCE THIS
01648  M00S01613.smfex   +++|*         SUBSYSTEM EXECUTES AT A VERY HIGH PRIORITY.
01649  M00S01614.smfex   +++|*
01650  M00S01615.smfex   +++|*         RUNJOBS PERFORMS TWO PRELIMINARY PHASES BEFORE INITIATING
01651  M00S01616.smfex   +++|*         TASKS.  THE FIRST PRELIMINARY PHASE ACCOUNTS FOR THE LEVEL
01652  M00S01617.smfex   +++|*         OF UTILIZATION, BOTH FOR STATISTICAL REASONS AND TO ENABLE
01653  M00S01618.smfex   +++|*         SCHEDULING RULES TO "TRY HARDER".  THE SECOND PRELIMINARY
01654  M00S01619.smfex   +++|*         PHASE CHECKS FOR SHUTDOWN CONDITIONS.
01655  M00S01620.smfex   +++|*
01656  M00S01621.smfex   +++|*         THE PRINCIPAL FUNCTION OF RUNJOBS IS TO ADVANCE THE STATUS
01657  M00S01622.smfex   +++|*         OF EACH AVAILABLE TASK.  WHILE THE SUBSYSTEM IS COMPILED
01658  M00S01623.smfex   +++|*         WITH A LARGE NUMBER OF TASKS IN EXISTENCE, THE NUMBER OF
01659  M00S01624.smfex   +++|*         TASKS AVAILABLE FOR EXECUTION IS DETERMINED AT SUBSYSTEM
01660  M00S01625.smfex   +++|*         STARTUP AND IS TYPICALLY MUCH SMALLER.
01661  M00S01626.smfex   +++|*
01662  M00S01627.smfex   +++|*         EACH TASK CAN HAVE ANY OF THE FOLLOWING STATUSES --
01663  M00S01628.smfex   +++|*
01664  M00S01629.smfex   +++|*         1.  IT MAY BE EMPTY.  AN EMPTY TASK WILL BE ASSIGNED TO A
01665  M00S01630.smfex   +++|*         USER IF THERE ARE USERS IN THE SCHEDULING (SWAPIN) QUEUE
01666  M00S01631.smfex   +++|*         AND NO SHUTDOWN CONDITION EXISTS.  IN ASSIGNING A USER TO A
01667  M00S01632.smfex   +++|*         PREVIOUSLY EMPTY TASK, THE TASK STATUS IS CHANGED TO
01668  M00S01633.smfex   +++|*         "START" OR "SWAPIN" BASED ON THE USER'S PROGRESS.
01669  M00S01634.smfex   +++|*
01670  M00S01635.smfex   +++|*         2.  IT MAY BE DELAYING.  A DELAYING TASK MISSES THE CPU FOR
01671  M00S01636.smfex   +++|*         PRECISELY ONE SMFEX CPU RECALL CYCLE, AND TYPICALLY IS
01672  M00S01637.smfex   +++|*         WASTING REAL TIME WHILE POLLING ON COMPLETION OF AN I/O
01673  M00S01638.smfex   +++|*         FUNCTION.  IN VIEW OF THE BRUTE FORCE REQUIRED TO RESTART A
01674  M00S01639.smfex   +++|*         DELAYED TASK, THIS STYLE OF WAITING FOR I/O IS NOT USED
01675  M00S01640.smfex   +++|*         OFTEN WITHIN THE EDITING CODE, BUT IT IS FULLY SUPPORTED BY
01676  M00S01641.smfex   +++|*         THIS EXECUTIVE.  RUNJOBS RESTARTS A DELAYED TASK AS SOON AS
01677  M00S01642.smfex   +++|*         IT IS DISCOVERED, BY CHANGING THE TASK STATUS TO "RUN".
01678  M00S01643.smfex   +++|*
01679  M00S01644.smfex   +++|*         3.  A TASK MAY BE IN AUTO RECALL.  THIS TASK WISHES TO MISS
01680  M00S01645.smfex   +++|*         THE CPU UNTIL SMFEX DETECTS THAT THE SPECIFIED COMPLETION
01681  M00S01646.smfex   +++|*         BIT HAS BEEN TOGGLED BY ANYBODY.  THIS IS THE METHOD
01682  M00S01647.smfex   +++|*         GENERALLY USED WITHIN THE EDITOR TO WAIT FOR I/O, SINCE IT
01683  M00S01648.smfex   +++|*         AVOIDS WASTING CPU TIME TO START UP A DELAYED TASK WHICH IS
01684  M00S01649.smfex   +++|*         LIKELY TO DROP RIGHT BACK INTO DELAY.  ONCE SMFEX VERIFIES
01685  M00S01650.smfex   +++|*         THAT THE DESIRED EVENT IS COMPLETE, IT RESTARTS A RECALLED
01686  M00S01651.smfex   +++|*         TASK BY CHANGING THE TASK STATUS TO "RUN".
01687  M00S01652.smfex   +++|*
01688  M00S01653.smfex   +++|*         4.  A TASK MAY BE IN "START" STATUS.  THIS TASK IS READY
01689  M00S01654.smfex   +++|*         FOR THE CPU, FOR A USER WHO HAS NOT YET EXECUTED ANY
01690  M00S01655.smfex   +++|*         MULTI-USER EDITING CODE.  THE TASK WILL GET THE CPU AT THE
01691  M00S01656.smfex   +++|*         EDITOR'S MAIN ENTRY POINT.  NO SWAP PAGE EXISTS YET, AND
01692  M00S01657.smfex   +++|*         DISPATCHING DATA IS IN MODEL FORMAT.
01693  M00S01658.smfex   +++|*
01694  M00S01659.smfex   +++|*         5.  A TASK MAY BE IN "SWAPIN" STATUS.  THIS TASK HAS
01695  M00S01660.smfex   +++|*         PREVIOUSLY EXECUTED AND SWAPPED OUT.  THE TASK THEREFORE
01696  M00S01661.smfex   +++|*         WANTS THE CPU AT THE ENTRY POINT OF THE SWAPPING CODE.
01697  M00S01662.smfex   +++|*         SINCE THE SWAPOUT AND SWAPIN CODE ARE ONE AND THE SAME,
01698  M00S01663.smfex   +++|*         TASK CPU DISPATCHING IS EFFECTED BY RETURNING TO THE SWAP
01699  M00S01664.smfex   +++|*         CODE WHERE CONTROL WAS PREVIOUSLY SURRENDERED.  THAT SWAP
01700  M00S01665.smfex   +++|*         CODE WILL READ IN THE SWAP CODE AND ALTER THE MEMORY IMAGE
01701  M00S01666.smfex   +++|*         FOR THE TASK ON THE FLY, THEN RETURN OUT THE THE EDITING
01702  M00S01667.smfex   +++|*         CODE WHICH HAD CAUSED THE PREVIOUS SWAPOUT.
01703  M00S01668.smfex   +++|*
01704  M00S01669.smfex   +++|*         6.  A TASK MAY BE IN "RUN" STATUS.  THIS TASK HAS BEEN
01705  M00S01670.smfex   +++|*         SWAPPED IN FOR SOME TIME, AND IS PRESENTLY COMPLETING A
01706  M00S01671.smfex   +++|*         DELAY OR RECALL.  SINCE THE MEMORY IMAGE FOR THE TASK IS
01707  M00S01672.smfex   +++|*         INTACT, WE ARE REQUIRED ONLY TO MANIPULATE THOSE ARRAYS
01708  M00S01673.smfex   +++|*         CRITICAL TO TASK DISPATCHING, AND RETURN TO THE POINT IN
01709  M00S01674.smfex   +++|*         THE EDITING CODE WHERE THE TASK HAD PREVIOUSLY PAUSED.
01710  M00S01675.smfex   +++|*
01711  M00S01676.smfex   +++|*         EACH TIME A TASK GETS THE CPU, IT CAN FINISH ITS TIME SLICE
01712  M00S01677.smfex   +++|*         IT THREE WAYS -- (1) THE ENTIRE EDIT SESSION MAY END, IN
01713  M00S01678.smfex   +++|*         WHICH CASE THE TASK EXITS VIA LABEL "AFTEREDIT" FOR CLEANUP
01714  M00S01679.smfex   +++|*         PROCESSING, OR (2) THE TASK MAY COMPLETE A TRANSACTION,
01715  M00S01680.smfex   +++|*         I.E., IT MAY FINISH SWAPPING OUT FOR TERMINAL I/O OR
01716  M00S01681.smfex   +++|*         RESOURCE BALANCING, IN WHICH CASE IT EXITS VIA LABEL
01717  M00S01682.smfex   +++|*         "AFTERTRANS", OR (3) IT MAY NEED TO DELAY/RECALL WITHIN ITS
01718  M00S01683.smfex   +++|*         MEMORY IMAGE (I.E., WHILE STILL SWAPPED IN) FOR SOME DISK
01719  M00S01684.smfex   +++|*         I/O OR OTHER SHORT-TERM EVENT, IN WHICH CASE IT EXITS VIA
01720  M00S01685.smfex   +++|*         LABEL "AFTERSLICE".
01721  M00S01686.smfex   +++|*
01722  M00S01687.smfex   +++|*         IN SUMMARY, THERE ARE THREE WAYS FOR A TASK TO BE ASSIGNED
01723  M00S01688.smfex   +++|*         THE CPU (START OF SESSION, START OF TRANSACTION, OR RESTART
01724  M00S01689.smfex   +++|*         AFTER DELAY) AND THREE WAYS FOR A TASK TO FORFEIT THE CPU
01725  M00S01690.smfex   +++|*         (END OF SESSION, END OF TRANSACTION, DELAY), AND THESE
01726  M00S01691.smfex   +++|*         ENTRIES AND EXITS CAN BE MIXED IN ANY FASHION.  AS A
01727  M00S01692.smfex   +++|*         RESULT, RUNJOBS MUST VIOLATE A RULE OF CLEAN PROGRAMMING
01728  M00S01693.smfex   +++|*         PRACTISE, IN ALLOWING JUMPS INTO BLOCKS OF CODE (IF-THEN,
01729  M00S01694.smfex   +++|*         NOT LOOPS) WHICH ARE NOT NECESSARILY ACTIVE.
01730  M00S01695.smfex   +++|*
01731  M00S01696.smfex   +++|*
01732  M00S01697.smfex   +++|*         ENTRY  SHUTDOWN - CONTROLS WHETHER TO EXECUTE AT ALL.
01733  M00S01698.smfex   +++|*                SWPQHEAD - START OF SWAPIN QUEUE.
01734  M00S01699.smfex   +++|*                TASKSAVAIL - NUMBER OF TASKS WE CAN USE.
01735  M00S01700.smfex   +++|*                TASK AND USER TABLES - SETUP.
01736  M00S01701.smfex   +++|*                MODELPTR, MODELLEN - MODEL FORMAT DISPATCH DATA.
01737  M00S01702.smfex   +++|*                TIMEOFDAY - MILLISECOND CLOCK.
01738  M00S01703.smfex   +++|*                LOGGEDIN - NUMBER OF USERS.
01739  M00S01704.smfex   +++|*
01740  M00S01705.smfex   +++|*         EXIT   TASKSBUSY - NUMBER OF NON-EMPTY TASKS.
01741  M00S01706.smfex   +++|*                COMPLETE - FORCED TRUE BASED ON SHUTDOWN.
01742  M00S01707.smfex   +++|*                LOGGEDIN - DECREMENTED FOR ANY SESSION COMPLETIONS.
01743  M00S01708.smfex   +++|*                ENABLEFLAG - NON-ZERO POSITIVE IF LOGGEDIN
01744  M00S01709.smfex   +++|*                    DECREMENTS OUT OF NEAR-FULL CONDITION.
01745  M00S01710.smfex   +++|*                USER AND TASK TABLES - UPDATED AS NEEDED.
01746  M00S01711.smfex   +++|*
01747  M00S01712.smfex   +++|*         CALLS  INSTRMNT1, GETUSER, TAKEOFFQ, PUTUSER, GETCOMMON,
01748  M00S01713.smfex   +++|*                MOVEWD, GENWRKNAM, EDTINIT, PROCESS, EDTTERM,
01749  M00S01714.smfex   +++|*                MELT, ABTKILL, ABTPAUSE, RTRNWRKFIL, SENDLOGOUT,
01750  M00S01715.smfex   +++|*                KILL, TRANSACT, PUTINQ, SPREAD, GATHER.
01751  M00S01716.smfex   +++|*
01752  M00S01717.smfex   +++|*         USES   CURUSER, CURTASK, RSTKPTR, RENTSTK.
01753  M00S01718.smfex   +++|*
01754  M00S01719.smfex   +++|*         NOTE   WHENEVER RUNJOBS INVOKES A TASK, BY CALLING
01755  M00S01720.smfex   +++|*                PROCESS, TRANSACT, OR RESUME, THE FOLLOWING
01756  M00S01721.smfex   +++|*                CONVENTIONS APPLY FOR PARAMETERS PASSED TO AND
01757  M00S01722.smfex   +++|*                FROM THE EDITOR CODE --
01758  M00S01723.smfex   +++|*
01759  M00S01724.smfex   +++|*                PASSED     CURTASK, CURUSER, RSTKPTR, RENTSTK,
01760  M00S01725.smfex   +++|*                           WORKNAM, P<MANY ARRAYS>.
01761  M00S01726.smfex   +++|*
01762  M00S01727.smfex   +++|*                RETURNED   ABORTED, RSTKPTR, RENTSTK,
01763  M00S01728.smfex   +++|*                           CHNGSTATUS, TASKRCLADR[CURTASK].
01764  M00S01729.smfex   +++|#
01765  M00S01730.smfex   +++|  ITEM TMP1,TMP2;
01766  M00S01731.smfex   +++|  XDEF LABEL AFTEREDIT;
01767  M00S01732.smfex   +++|  XDEF LABEL AFTERTRANS;
01768  M00S01733.smfex   +++|  XDEF LABEL AFTERSLICE;
01769  M00S01734.smfex   +++|  XREF LABEL RESUME;
01770  M00S01735.smfex   +++|
01771  M00S01736.smfex   +++|  TASKSBUSY=0;                 # COUNT UP TASK UTILIZATION   #
01772  M00S01737.smfex   +++|  FOR TMP1=1 STEP 1 UNTIL NUMTASKS DO  IF TASKSTATUS[TMP1] NQ
01773  M00S01738.smfex   +++|    TASKST"EMPTY" THEN TASKSBUSY=TASKSBUSY+1;
01774  M00S01739.smfex   +++|  CONTROL IFEQ METERING,1;
01775  M00S01740.smfex   +++|    IF TASKSBUSY GQ TASKSAVAIL AND SWPQHEAD NQ 0
01776  M00S01741.smfex   +++|      THEN INSTRMNT1(INSTST"NOTASK");
01777  M00S01742.smfex   +++|  CONTROL FI;
01778  M00S01743.smfex   +++|
01779  M00S01744.smfex   +++|  IF SHUTDOWN GR 1 THEN        # SEE IF SINUSES CLEARED      #
01780  M00S01745.smfex   +++|    BEGIN
01781  M00S01746.smfex   +++|    IF TASKSBUSY EQ 0 THEN     # ALL ACTIVITY CEASED         #
01782  M00S01747.smfex   +++|      BEGIN
01783  M00S01748.smfex   +++|      IF (SHUTDOWN GQ 2 AND SWPQHEAD EQ 0) OR
01784  M00S01749.smfex   +++|        SHUTDOWN EQ 4 THEN COMPLETE=TRUE;
01785  M00S01750.smfex   +++|      END
01786  M00S01751.smfex   +++|    END
01787  M00S01752.smfex   +++|  IF SHUTDOWN EQ 1 AND LOGGEDIN EQ 0 THEN COMPLETE=TRUE;
01788  M00S01753.smfex   +++|
01789  M00S01754.smfex   +++|
01790  M00S01755.smfex   +++|  FOR CURTASK=1 STEP 1 UNTIL TASKSAVAIL DO
01791  M00S01756.smfex   +++|    BEGIN
01792  M00S01757.smfex   +++|
01793  M00S01758.smfex   +++|    IF SWPQHEAD NQ 0 AND SHUTDOWN LQ 3
01794  M00S01759.smfex   +++|      AND TASKSTATUS[CURTASK] EQ TASKST"EMPTY" THEN
01795  M00S01760.smfex   +++|      BEGIN
01796  M00S01761.smfex   +++|      CURUSER=SWPQHEAD;
01797  M00S01762.smfex   +++|      WHYLE CURUSER NQ 0 AND USERTTIBUF[CURUSER] EQ 0
01798  M00S01763.smfex   +++|        DO CURUSER=USERQUELNK[CURUSER];
01799  M00S01764.smfex   +++|      IF CURUSER EQ 0 THEN
01800  M00S01765.smfex   +++|        BEGIN
01801  M00S01766.smfex   +++|        CURUSER=SWPQHEAD;
01802  M00S01767.smfex   +++|        WHYLE CURUSER NQ 0 AND USERCRUNCH[CURUSER]
01803  M00S01768.smfex   +++|          DO CURUSER=USERQUELNK[CURUSER];
01804  M00S01769.smfex   +++|        IF CURUSER EQ 0 THEN CURUSER=SWPQHEAD;
01805  M00S01770.smfex   +++|        END
01806  M00S01771.smfex   +++|      TRCBOTH("ASGN SLT$",CURTASK);  TRCDEC(CURUSER);
01807  M00S01772.smfex   +++|      GETUSER;
01808  M00S01773.smfex   +++|      CURUSCRUNCH=FALSE;
01809  M00S01774.smfex   +++|      CURUSINTASK=TRUE;
01810  M00S01775.smfex   +++|      CURUSTASK=CURTASK;
01811  M00S01776.smfex   +++|      TAKEOFFQ;
01812  M00S01777.smfex   +++|      TASKUSER[CURTASK]=CURUSER;
01813  M00S01778.smfex   +++|      TASKFLAGS[CURTASK]=0;    # CLEAR ALL         #
01814  M00S01779.smfex   +++|      TASKNXTTTO[CURTASK]=0;
01815  M00S01780.smfex   +++|      TASKTYPTTO[CURTASK]=0;
01816  M00S01781.smfex   +++|      IF CURUSSTART THEN TASKSTATUS[CURTASK]=TASKST"START";
01817  M00S01782.smfex   +++|      ELSE TASKSTATUS[CURTASK]=TASKST"SWAP";
01818  M00S01783.smfex   +++|      PUTUSER;
01819  M00S01784.smfex   +++|      END
01820  M00S01785.smfex   +++|
01821  M00S01786.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"EMPTY" THEN TEST CURTASK;
01822  M00S01787.smfex   +++|
01823  M00S01788.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"DELAY" THEN
01824  M00S01789.smfex   +++|      BEGIN
01825  M00S01790.smfex   +++|      TASKSTATUS[CURTASK]=TASKST"RUN";
01826  M00S01791.smfex   +++|      END
01827  M00S01792.smfex   +++|
01828  M00S01793.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"RECALLFET" THEN
01829  M00S01794.smfex   +++|      BEGIN
01830  M00S01795.smfex   +++|      IF B<59,1>MEM[TASKRCLADR[CURTASK]] EQ 1 THEN
01831  M00S01796.smfex   +++|        BEGIN
01832  M00S01797.smfex   +++|        TASKSTATUS[CURTASK]=TASKST"RUN";
01833  M00S01798.smfex   +++|        END
01834  M00S01799.smfex   +++|      END
01835  M00S01800.smfex   +++|
01836  M00S01801.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"START" THEN
01837  M00S01802.smfex   +++|      BEGIN
01838  M00S01803.smfex   +++|      CURUSER=TASKUSER[CURTASK];
01839  M00S01804.smfex   +++|      TRCBOTH("TASK STRT$",CURTASK);  TRCDEC(CURUSER);
01840  M00S01805.smfex   +++|      GETUSER;
01841  M00S01806.smfex   +++|      CONTROL IFEQ METERING,1;
01842  M00S01807.smfex   +++|        INSTRMNT1(INSTST"SESSION");
01843  M00S01808.smfex   +++|      CONTROL FI;
01844  M00S01809.smfex   +++|      CURUSSTART=FALSE;
01845  M00S01810.smfex   +++|      RSTKPTR=1;               # MAKE A NEW STACK  #
01846  M00S01811.smfex   +++|      GETCOMMON;               # SET ARRAY BASES   #
01847  M00S01812.smfex   +++|      P<MOVFROM>=MODELPTR;
01848  M00S01813.smfex   +++|      MOVEWD(MODELLEN,MOVFROM,DATAEND);        # VIRGIN EDIT DATA  #
01849  M00S01814.smfex   +++|      GENWRKNAM;
01850  M00S01815.smfex   +++|      TASKTIME[CURTASK]=TIMEOFDAY;       # SINCE NO SWAPIN   #
01851  M00S01816.smfex   +++|      IF NOT CURUSRCVRY THEN
01852  M00S01817.smfex   +++|        BEGIN
01853  M00S01818.smfex   +++|        EDTINIT;
01854  M00S01819.smfex   +++|        PROCESS;
01855  M00S01820.smfex   +++|        EDTTERM;
01856  M00S01821.smfex   +++|        END
01857  M00S01822.smfex   +++|AFTEREDIT:               # CONTROL FORCE HERE IF RCVRY #
01858  M00S01823.smfex   +++|      CONTROL IFEQ METERING,1;
01859  M00S01824.smfex   +++|        INSTRMNT1(INSTST"ENDEDT");
01860  M00S01825.smfex   +++|      CONTROL FI;
01861  M00S01826.smfex   +++|      CURUSDONE=TRUE;
01862  M00S01827.smfex   +++|      CONTROL IFEQ TRACEFLAG,1;
01863  M00S01828.smfex   +++|        IF ABORTED THEN TRACESTR("ABORTEDIT$");
01864  M00S01829.smfex   +++|        ELSE TRACESTR("ENDEDIT$");
01865  M00S01830.smfex   +++|      CONTROL FI;
01866  M00S01831.smfex   +++|      CONTROL IFEQ MELTONABT,1;
01867  M00S01832.smfex   +++|        IF ABORTED THEN MELT("SUBTASK ABORT$");
01868  M00S01833.smfex   +++|      CONTROL FI;
01869  M00S01834.smfex   +++|      RSTKPTR=1;
01870  M00S01835.smfex   +++|      IF ABORTED THEN
01871  M00S01836.smfex   +++|        BEGIN
01872  M00S01837.smfex   +++|        IF TASKABORT[CURTASK] THEN ABTKILL;
01873  M00S01838.smfex   +++|        ELSE
01874  M00S01839.smfex   +++|          BEGIN
01875  M00S01840.smfex   +++|          TASKABORT[CURTASK]=TRUE;
01876  M00S01841.smfex   +++|          ABTPAUSE;
01877  M00S01842.smfex   +++|          TASKABORT[CURTASK]=FALSE;
01878  M00S01843.smfex   +++|          END
01879  M00S01844.smfex   +++|        END
01880  M00S01845.smfex   +++|      RTRNWRKFIL;              # RETURN THE WORK FILE        #
01881  M00S01846.smfex   +++|      SENDLOGOUT;              # TRANSMIT LOGOUT FUNCTION    #
01882  M00S01847.smfex   +++|      LOGGEDIN=LOGGEDIN-1;
01883  M00S01848.smfex   +++|      IF LOGGEDIN EQ NUMSMFUSR-5 THEN ENABLEFLAG=1;
01884  M00S01849.smfex   +++|      TASKSTATUS[CURTASK]=TASKST"EMPTY";
01885  M00S01850.smfex   +++|      LASTTASK=0;
01886  M00S01851.smfex   +++|      KILL;
01887  M00S01852.smfex   +++|      END
01888  M00S01853.smfex   +++|
01889  M00S01854.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"SWAP" THEN
01890  M00S01855.smfex   +++|      BEGIN
01891  M00S01856.smfex   +++|      CURUSER=TASKUSER[CURTASK];
01892  M00S01857.smfex   +++|      TRCBOTH("TASK TRNS$",CURTASK);  TRCDEC(CURUSER);
01893  M00S01858.smfex   +++|      GETUSER;
01894  M00S01859.smfex   +++|      RSTKPTR=CURUSSTKPTR  ;   # HE REMEMBERS HIS PLACE      #
01895  M00S01860.smfex   +++|      GETCOMMON;
01896  M00S01861.smfex   +++|      FETFNT=CURUSFNTPTR;
01897  M00S01862.smfex   +++|      GENWRKNAM;
01898  M00S01863.smfex   +++|      TRANSACT;                # RUNS AS SUBROUTINE OF USER  #
01899  M00S01864.smfex   +++|AFTERTRANS:  # CONTROL COMES HERE MANUALLY FROM TRANSACT/ENDTRANS #
01900  M00S01865.smfex   +++|      CURUSSTKPTR=RSTKPTR;
01901  M00S01866.smfex   +++|      CURUSFNTPTR=FETFNT;
01902  M00S01867.smfex   +++|      CURUSINTASK=FALSE;
01903  M00S01868.smfex   +++|      IF TASKREQUE[CURTASK] THEN PUTINQ;
01904  M00S01869.smfex   +++|      TASKSTATUS[CURTASK]=TASKST"EMPTY";
01905  M00S01870.smfex   +++|      LASTTASK=0;
01906  M00S01871.smfex   +++|      PUTUSER;
01907  M00S01872.smfex   +++|      END
01908  M00S01873.smfex   +++|
01909  M00S01874.smfex   +++|    IF TASKSTATUS[CURTASK] EQ TASKST"RUN" THEN
01910  M00S01875.smfex   +++|      BEGIN
01911  M00S01876.smfex   +++|      CURUSER=TASKUSER[CURTASK];
01912  M00S01877.smfex   +++|      TRCBOTH("TASK RUN$",CURTASK);  TRCDEC(CURUSER);
01913  M00S01878.smfex   +++|      GETUSER;
01914  M00S01879.smfex   +++|      IF SHUTDOWN EQ 4 THEN    # SELF DESTRUCT     #
01915  M00S01880.smfex   +++|        BEGIN
01916  M00S01881.smfex   +++|        TASKSTATUS[CURTASK]=TASKST"EMPTY";
01917  M00S01882.smfex   +++|        RETURN;
01918  M00S01883.smfex   +++|        END
01919  M00S01884.smfex   +++|      RSTKPTR=TASKSTKPTR[CURTASK];     # HE REMEMBERS PLACE          #
01920  M00S01885.smfex   +++|      GETCOMMON;
01921  M00S01886.smfex   +++|      MOVEWD(RSTKPTR-1,DISPRSTK,RENTSTK);
01922  M00S01887.smfex   +++|      SPREAD(RSTKPTR,RENTSTK);
01923  M00S01888.smfex   +++|      IF CURUSINTRPT THEN USRBRK=1;
Line S01889 Modification History
M01 (Removed by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
01924  M01S01889.ns2186  ---|      IF SHUTDOWN GR 1 THEN
Line S00001 Modification History
M01 (Added by) ns2186
Seq #  *Modification Id* Act 
----------------------------+
01925  M01S00001.ns2186  +++|      IF SHUTDOWN GR 2 THEN
01926  M00S01890.smfex   +++|        BEGIN
01927  M00S01891.smfex   +++|        USRBRK=1;
01928  M00S01892.smfex   +++|        FORCENULL=TRUE;
01929  M00S01893.smfex   +++|        END
01930  M00S01894.smfex   +++|      GENWRKNAM;
01931  M00S01895.smfex   +++|      GOTO RESUME;             # TO RESUME JOB WHERE IT WAS  #
01932  M00S01896.smfex   +++|AFTERSLICE:              # CONTROL MANUALLY SENT HERE BY PAUSE   #
01933  M00S01897.smfex   +++|      GATHER(RSTKPTR,RENTSTK); # SAVE ALL SUBROUTINES        #
01934  M00S01898.smfex   +++|      MOVEWD(RSTKPTR-1,RENTSTK,DISPRSTK);
01935  M00S01899.smfex   +++|      TASKSTATUS[CURTASK]=CHNGSTATUS;
01936  M00S01900.smfex   +++|      TASKSTKPTR[CURTASK]=RSTKPTR;
01937  M00S01901.smfex   +++|      PUTUSER;
01938  M00S01902.smfex   +++|      END
01939  M00S01903.smfex   +++|
01940  M00S01904.smfex   +++|    END                         # OF POLLING LOOP   #
01941  M00S01905.smfex   +++|
01942  M00S01906.smfex   +++|
01943  M00S01907.smfex   +++|  END                          # OF RUNJOBS        #
01944  M00S01908.smfex   +++|PAGE                         # INSTRUMENT -- COLLECT STATS #
01945  M00S01909.smfex   +++|
01946  M00S01910.smfex   +++|
01947  M00S01911.smfex   +++|CONTROL IFEQ METERING,1;
01948  M00S01912.smfex   +++|  PROC INSTRUMENT(TYPE,DATA,DATA2);
01949  M00S01913.smfex   +++|    BEGIN
01950  M00S01914.smfex   +++|#
01951  M00S01915.smfex   +++|**        INSTRUMENT - TAKE STATISTICS.
01952  M00S01916.smfex   +++|*
01953  M00S01917.smfex   +++|*         INSTRUMENT, TOGETHER WITH ENTRY POINTS INSTRMNT1,
01954  M00S01918.smfex   +++|*         INSTRMNT2, AND INSTRMNT3, COLLECTS STATISTICS REGARDING
01955  M00S01919.smfex   +++|*         INTERNAL PERFORMANCE AND WORKLOAD CHARACTERISTICS.
01956  M00S01920.smfex   +++|*
01957  M00S01921.smfex   +++|*         ENTRY  TYPE - SELECTS STATISTICAL CASE.
01958  M00S01922.smfex   +++|*                DATA - ONE DATA ITEM, WHERE APPLICABLE.
01959  M00S01923.smfex   +++|*                DATA2 - ADDITIONAL DATA WHERE REQUIRED.
01960  M00S01924.smfex   +++|*                MAXLOGGED, LOGGEDIN, TIMEOFDAY, SLICECOUNT,
01961  M00S01925.smfex   +++|*                    BUILDCIO, ACCTTRANS, PALAST[0] - ADDITIONAL
01962  M00S01926.smfex   +++|*                    PARAMETERS FOR CERTAIN FUNCTION TYPES.
01963  M00S01927.smfex   +++|*
01964  M00S01928.smfex   +++|*         EXIT   STATWORD[ALL] - INCREMENTED OR SET.
01965  M00S01929.smfex   +++|*                DISTRSTM, DISTTKTM, DISTCICT, DISTTRCT, DISTFLSZ,
01966  M00S01930.smfex   +++|*                    DISTMGSZ - FREQUENCY DISTRIBUTIONS.
01967  M00S01931.smfex   +++|*
01968  M00S01932.smfex   +++|*         CALLS  ADDVECT.
01969  M00S01933.smfex   +++|#
01970  M00S01934.smfex   +++|    ITEM DATA,DATA2,TYPE;
01971  M00S01935.smfex   +++|
01972  M00S01936.smfex   +++|    ENTRY PROC INSTRMNT1(TYPE);
01973  M00S01937.smfex   +++|
01974  M00S01938.smfex   +++|    ENTRY PROC INSTRMNT2(TYPE,DATA);
01975  M00S01939.smfex   +++|
01976  M00S01940.smfex   +++|    ENTRY PROC INSTRMNT3(TYPE,DATA,DATA2);
01977  M00S01941.smfex   +++|
01978  M00S01942.smfex   +++|    SWITCH INSTSW INSTTHNK,INSTRSPNS,INSTNOTTI,
01979  M00S01943.smfex   +++|                  INSTNOTASK,INSTSWPE,INSTSWPD,INSTCLOCK,
01980  M00S01944.smfex   +++|                  INSTPREEMPT,INSTSWPTIM,INSTEDTCIO,
01981  M00S01945.smfex   +++|                  INSTSESSION,INSTTRANS,INSTXSTTO,
01982  M00S01946.smfex   +++|                  INSTBREAK,INSTHANG,INSTBGNEDT,
01983  M00S01947.smfex   +++|                  INSTENDEDT,INSTINPUT,INSTXMIT,
01984  M00S01948.smfex   +++|                  INSTKWIK,INSTUTIL,INSTWORK,INSTDROP;
01985  M00S01949.smfex   +++|
01986  M00S01950.smfex   +++|    GOTO INSTSW[TYPE];
01987  M00S01951.smfex   +++|
01988  M00S01952.smfex   +++|INSTNOTTI:
01989  M00S01953.smfex   +++|    STATWORD[1]=STATWORD[1]+1;
01990  M00S01954.smfex   +++|    RETURN;
01991  M00S01955.smfex   +++|
01992  M00S01956.smfex   +++|INSTNOTASK:
01993  M00S01957.smfex   +++|    STATWORD[2]=STATWORD[2]+1;
01994  M00S01958.smfex   +++|    RETURN;
01995  M00S01959.smfex   +++|
01996  M00S01960.smfex   +++|INSTSESSION:
01997  M00S01961.smfex   +++|    STATWORD[3]=STATWORD[3]+1;
01998  M00S01962.smfex   +++|    RETURN;
01999  M00S01963.smfex   +++|
02000  M00S01964.smfex   +++|INSTTRANS:
Proceed to Part 1
cdc/nos2.source/opl.opl871/deck/smfex.txt ยท Last modified: (external edit)