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