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
Line S00003 Modification History |
M01 (Added by) | smfex4 |
Seq # *Modification Id* Act
----------------------------+
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 +++|