Seq # *Modification Id* Act
----------------------------+
01996 M00S01960.smfex +++|INSTSESSION:
01997 M00S01961.smfex +++| STATWORD[3]=STATWORD[3]+1;
01998 M00S01962.smfex +++| RETURN;
01999 M00S01963.smfex +++|
02000 M00S01964.smfex +++|INSTTRANS:
02001 M00S01965.smfex +++| STATWORD[4]=STATWORD[4]+1;
02002 M00S01966.smfex +++| RETURN;
02003 M00S01967.smfex +++|
02004 M00S01968.smfex +++|INSTRSPNS:
02005 M00S01969.smfex +++| STATWORD[5]=STATWORD[5]+DATA;
02006 M00S01970.smfex +++| ADDVECT(DISTRSTM,DATA/16);
02007 M00S01971.smfex +++| RETURN;
02008 M00S01972.smfex +++|
02009 M00S01973.smfex +++|INSTTHNK:
02010 M00S01974.smfex +++| STATWORD[6]=STATWORD[6]+DATA;
02011 M00S01975.smfex +++| ADDVECT(DISTTKTM,DATA/1024);
02012 M00S01976.smfex +++| RETURN;
02013 M00S01977.smfex +++|
02014 M00S01978.smfex +++|INSTPREEMPT: # WORDS 7, 8, 9 #
02015 M00S01979.smfex +++| STATWORD[6+DATA]=STATWORD[6+DATA]+1;
02016 M00S01980.smfex +++| RETURN;
02017 M00S01981.smfex +++|
02018 M00S01982.smfex +++|INSTXSTTO:
02019 M00S01983.smfex +++| STATWORD[10]=STATWORD[10]+1;
02020 M00S01984.smfex +++| RETURN;
02021 M00S01985.smfex +++|
02022 M00S01986.smfex +++|INSTBREAK:
02023 M00S01987.smfex +++| STATWORD[11]=STATWORD[11]+1;
02024 M00S01988.smfex +++| RETURN;
02025 M00S01989.smfex +++|
02026 M00S01990.smfex +++|INSTHANG:
02027 M00S01991.smfex +++| STATWORD[12]=STATWORD[12]+1;
02028 M00S01992.smfex +++| RETURN;
02029 M00S01993.smfex +++|
02030 M00S01994.smfex +++|INSTCLOCK:
02031 M00S01995.smfex +++| STATWORD[13]=MAXLOGGED;
02032 M00S01996.smfex +++| STATWORD[14]=LOGGEDIN;
02033 M00S01997.smfex +++| STATWORD[15]=TIMEOFDAY;
02034 M00S01998.smfex +++| STATWORD[16]=SLICECOUNT;
02035 M00S01999.smfex +++| RETURN;
02036 M00S02000.smfex +++|
02037 M00S02001.smfex +++|INSTSWPE:
02038 M00S02002.smfex +++| STATWORD[17]=STATWORD[17]+1;
02039 M00S02003.smfex +++| RETURN;
02040 M00S02004.smfex +++|
02041 M00S02005.smfex +++|INSTSWPD:
02042 M00S02006.smfex +++| STATWORD[18]=STATWORD[18]+1;
02043 M00S02007.smfex +++| RETURN;
02044 M00S02008.smfex +++|
02045 M00S02009.smfex +++|INSTSWPTIM:
02046 M00S02010.smfex +++| STATWORD[19]=STATWORD[19]+DATA;
02047 M00S02011.smfex +++| RETURN;
02048 M00S02012.smfex +++|
02049 M00S02013.smfex +++|INSTEDTCIO:
02050 M00S02014.smfex +++| STATWORD[20]=STATWORD[20]+DATA; # CIO MSECS #
02051 M00S02015.smfex +++| STATWORD[21]=STATWORD[21]+DATA2; # CIO COUNT #
02052 M00S02016.smfex +++| IF DATA2 EQ 0 THEN STATWORD[22]=STATWORD[22]+1; # NUM ZERO CIO #
02053 M00S02017.smfex +++| IF DATA2 GQ 16 THEN
02054 M00S02018.smfex +++| BEGIN
02055 M00S02019.smfex +++| STATWORD[23]=STATWORD[23]+1; # NUM CRUNCHERS #
02056 M00S02020.smfex +++| STATWORD[24]=STATWORD[24]+DATA2; # CRUNCHY EFFORT #
02057 M00S02021.smfex +++| END
02058 M00S02022.smfex +++| ADDVECT(DISTCICT,DATA2);
02059 M00S02023.smfex +++| RETURN;
02060 M00S02024.smfex +++|
02061 M00S02025.smfex +++|INSTBGNEDT:
02062 M00S02026.smfex +++| STATWORD[25]=STATWORD[25]+BUILDCIO; # FILEBUILD CIOS #
02063 M00S02027.smfex +++| RETURN;
02064 M00S02028.smfex +++|
02065 M00S02029.smfex +++|INSTENDEDT:
02066 M00S02030.smfex +++| ADDVECT(DISTTRCT,ACCTTRANS);
02067 M00S02031.smfex +++| ADDVECT(DISTFLSZ,PALAST[0]);
02068 M00S02032.smfex +++| RETURN;
02069 M00S02033.smfex +++|
02070 M00S02034.smfex +++|INSTINPUT:
02071 M00S02035.smfex +++| STATWORD[26]=STATWORD[26]+DATA; # NUM WORDS #
02072 M00S02036.smfex +++| RETURN;
02073 M00S02037.smfex +++|
02074 M00S02038.smfex +++|INSTXMIT:
02075 M00S02039.smfex +++| STATWORD[27]=STATWORD[27]+DATA; # NUM WORDS #
02076 M00S02040.smfex +++| STATWORD[28]=STATWORD[28]+DATA2; # NUM BLOCKS #
02077 M00S02041.smfex +++| ADDVECT(DISTMGSZ,DATA);
02078 M00S02042.smfex +++| RETURN;
02079 M00S02043.smfex +++|
02080 M00S02044.smfex +++|INSTKWIK:
02081 M00S02045.smfex +++| STATWORD[29]=STATWORD[29]+1;
02082 M00S02046.smfex +++| RETURN;
02083 M00S02047.smfex +++|
02084 M00S02048.smfex +++|INSTUTIL:
02085 M00S02049.smfex +++| STATWORD[30]=STATWORD[30]+DATA;
02086 M00S02050.smfex +++| RETURN;
02087 M00S02051.smfex +++|
02088 M00S02052.smfex +++|INSTWORK:
02089 M00S02053.smfex +++| STATWORD[31+DATA]=STATWORD[31+DATA]+1; # WORDS 31 THRU 41 #
02090 M00S02054.smfex +++| RETURN;
02091 M00S02055.smfex +++|
02092 M00S02056.smfex +++|INSTDROP:
02093 M00S02057.smfex +++| STATWORD[42]=STATWORD[42]+1;
02094 M00S02058.smfex +++| RETURN;
02095 M00S02059.smfex +++|
02096 M00S02060.smfex +++| END # OF INSTRUMENT #
02097 M00S02061.smfex +++|CONTROL FI;
02098 M00S02062.smfex +++|PAGE # USER-STATE CODE #
02099 M00S02063.smfex +++| # BASIC WAIT/INTERRUPT HOOKS #
02100 M00S02064.smfex +++|
02101 M00S02065.smfex +++|
02102 M00S02066.smfex +++|PROC SMFDLY;
02103 M00S02067.smfex +++| IOBEGIN(SMFDLY)
02104 M00S02068.smfex +++|#
02105 M00S02069.smfex +++|** SMFDLY - INTERFACE FOR TASKS TO DELAY.
02106 M00S02070.smfex +++|*
02107 M00S02071.smfex +++|* EDITING CODE USE COMPILE-TIME MACROS TO REDEFINE THE
02108 M00S02072.smfex +++|* KEYWORD "DELAY" INTO A CALL TO "SMFDLY" FOR MULTI-USER
02109 M00S02073.smfex +++|* CODE. SMFDLY INTERFACES TO THE PAUSE ROUTINE, WHICH IN
02110 M00S02074.smfex +++|* TURN WORKS WITH RUNJOBS TO CONTROL THE TASK.
02111 M00S02075.smfex +++|*
02112 M00S02076.smfex +++|* ENTRY NO CONDITIONS.
02113 M00S02077.smfex +++|*
02114 M00S02078.smfex +++|* EXIT AFTER DELAYING.
02115 M00S02079.smfex +++|*
02116 M00S02080.smfex +++|* CALLS PAUSE.
02117 M00S02081.smfex +++|*
02118 M00S02082.smfex +++|* USES CHNGSTATUS.
02119 M00S02083.smfex +++|#
02120 M00S02084.smfex +++| CHNGSTATUS=TASKST"DELAY";
02121 M00S02085.smfex +++| PAUSE;
02122 M00S02086.smfex +++| IOEND # OF SMFDLY #
02123 M00S02087.smfex +++|
02124 M00S02088.smfex +++|
02125 M00S02089.smfex +++|PROC SMFRCL(AFET);
02126 M00S02090.smfex +++| IOBEGIN(SMFRCL)
02127 M00S02091.smfex +++|#
02128 M00S02092.smfex +++|** SMFRCL - INTERFACE FOR TASKS TO AUTO-RECALL ON AN EVENT.
02129 M00S02093.smfex +++|*
02130 M00S02094.smfex +++|* EDITING CODE USE COMPILE-TIME MACROS TO REDEFINE THE
02131 M00S02095.smfex +++|* KEYWORD "RECALL" INTO A CALL TO "SMFRCL" FOR MULTI-USER
02132 M00S02096.smfex +++|* CODE. SMFDLY INTERFACES TO THE PAUSE ROUTINE, WHICH IN
02133 M00S02097.smfex +++|* TURN WORKS WITH RUNJOBS TO CONTROL THE TASK.
02134 M00S02098.smfex +++|*
02135 M00S02099.smfex +++|* NOTE THAT EDITING CODE IS NOT ALLOWED TO SPECIFY AUTO-RECALL
02136 M00S02100.smfex +++|* ON ANY RA+1 CALL. INSTEAD, EDITING CODE MUST ISSUE
02137 M00S02101.smfex +++|* RA+1 AND THEN CALL THIS ROUTINE TO RECALL UNTIL THE SYSTEM
02138 M00S02102.smfex +++|* FUNCTION IS COMPLETE.
02139 M00S02103.smfex +++|*
02140 M00S02104.smfex +++|* ENTRY AFET - COMPLETION WORD.
02141 M00S02105.smfex +++|*
02142 M00S02106.smfex +++|* EXIT AFTER COMPLETION BIT IS FOUND TO BE ON.
02143 M00S02107.smfex +++|*
02144 M00S02108.smfex +++|* CALLS PAUSE.
02145 M00S02109.smfex +++|*
02146 M00S02110.smfex +++|* USES CHNGSTATUS, TASKRCLADR[CURTASK].
02147 M00S02111.smfex +++|#
02148 M00S02112.smfex +++| ARRAY AFET;;
02149 M00S02113.smfex +++| TASKRCLADR[CURTASK]=LOC(AFET);
02150 M00S02114.smfex +++| CHNGSTATUS=TASKST"RECALLFET";
02151 M00S02115.smfex +++| PAUSE;
02152 M00S02116.smfex +++| IOEND # OF SMFRCL #
02153 M00S02117.smfex +++|
02154 M00S02118.smfex +++|
02155 M00S02119.smfex +++|PROC CLEARINT;
02156 M00S02120.smfex +++| IOBEGIN(CLEARINT)
02157 M00S02121.smfex +++|#
02158 M00S02122.smfex +++|** CLEARINT - ACKNOWLEGE USER BREAK.
02159 M00S02123.smfex +++|*
02160 M00S02124.smfex +++|* EDITING CODE IS REQUIRED TO CALL THIS ROUTINE AS SOON AS
02161 M00S02125.smfex +++|* A USER BREAK HAS BEEN NOTICED, AND ALL EDITOR-SPECIFIC
02162 M00S02126.smfex +++|* RESPONSES HAVE BEEN PERFORMED. CLEARINT CLEARS FLAGS
02163 M00S02127.smfex +++|* INDICATING UNACKNOWLEGED INTERRUPT, SINCE ONLY EXECUTIVE
02164 M00S02128.smfex +++|* CODE CAN ACCESS SUCH FLAGS.
02165 M00S02129.smfex +++|*
02166 M00S02130.smfex +++|* ENTRY NO CONDITIONS.
02167 M00S02131.smfex +++|*
02168 M00S02132.smfex +++|* EXIT CURUSINTRPT - FALSE.
02169 M00S02133.smfex +++|* BUFFERED OUTPUT PURGED.
02170 M00S02134.smfex +++|* TASKREQUE - FALSE UNLESS TASK RECOVERY IN EFFECT.
02171 M00S02135.smfex +++|*
02172 M00S02136.smfex +++|* CALLS CLEARQUE.
02173 M00S02137.smfex +++|#
02174 M00S02138.smfex +++| IF CURUSINTRPT THEN TASKNXTTTO[CURTASK]=0;
02175 M00S02139.smfex +++| CLEARQUE;
02176 M00S02140.smfex +++| CURUSINTRPT=FALSE;
02177 M00S02141.smfex +++| IOEND # OF CLEARINT #
02178 M00S02142.smfex +++|
02179 M00S02143.smfex +++|
02180 M00S02144.smfex +++|PROC CLEARQUE;
02181 M00S02145.smfex +++| BEGIN
02182 M00S02146.smfex +++|#
02183 M00S02147.smfex +++|** CLEARQUE - ATTEMPT TO CLEAR TASKREQUE FLAG.
02184 M00S02148.smfex +++|*
02185 M00S02149.smfex +++|* CLEARQUE CLEARS THE TASKREQUE FLAG UNLESS TASK RECOVERY IS
02186 M00S02150.smfex +++|* IN EFFECT. TASKREQUE IS SET BY DOINPUT WHEN A USER NEEDS
02187 M00S02151.smfex +++|* TO BE SCEDULED TO A TASK BUT IS ALREADY IN A TASK. DOINPUT
02188 M00S02152.smfex +++|* HAS NO WAY TO KNOW IF THE TASK ALREADY RUNNING WILL DETECT
02189 M00S02153.smfex +++|* OR IGNORE THE INPUT EVENT. THUS, THE TASKREQUE FLAG IS
02190 M00S02154.smfex +++|* SET. IF THE EDITING CODE NEVER USES CLEARQUE TO SHOW
02191 M00S02155.smfex +++|* ACKNOWLEGEMENT, THEN WHEN THE TASK SWAPS OUT THE RUNJOBS
02192 M00S02156.smfex +++|* ROUTINE WILL IMMEDIATELY PUT THE USER BACK IN THE SWAPIN
02193 M00S02157.smfex +++|* QUEUE. IF THE EDITING CODE ACKNOWLEGES THE INPUT EVENT,
02194 M00S02158.smfex +++|* WHICH IS USUALLY A USER BREAK, THEN CLEARQUE GETS RID OF
02195 M00S02159.smfex +++|* THE RESCHEDULING AT END OF TRANSACTION.
02196 M00S02160.smfex +++|*
02197 M00S02161.smfex +++|* THE TASKREQUE FLAG IS PRESERVED IF RECOVERY IS ON.
02198 M00S02162.smfex +++|* RECOVERY DEALS WITH JOB DETACHMENT AND SUBSYSTEM EXITS.
02199 M00S02163.smfex +++|*
02200 M00S02164.smfex +++|* ENTRY CURUSRCVRY - WHETHER RECOVERY IN EFFECT.
02201 M00S02165.smfex +++|* TASKREQUE[CURTASK] - WHETHER RESCHEDULING PLANNED.
02202 M00S02166.smfex +++|*
02203 M00S02167.smfex +++|* EXIT TASKREQUE[CURTASK] - UPDATED.
02204 M00S02168.smfex +++|#
02205 M00S02169.smfex +++| TASKREQUE[CURTASK]=TASKREQUE[CURTASK] AND CURUSRCVRY;
02206 M00S02170.smfex +++| END # OF CLEARQUE #
02207 M00S02171.smfex +++|
02208 M00S02172.smfex +++|
02209 M00S02173.smfex +++|PROC SPINWHEELS;
02210 M00S02174.smfex +++| IOBEGIN(SPINWHEELS)
02211 M00S02175.smfex +++|#
02212 M00S02176.smfex +++|** SPINWHEELS - DELAY TASK UNTIL INPUT ARRIVES.
02213 M00S02177.smfex +++|*
02214 M00S02178.smfex +++|* SPINWHEELS ALLOWS A TASK TO HOLD ONTO ITS RESOURCES FOR
02215 M00S02179.smfex +++|* BRIEF TIME INTERVALS IN EXPECTATION OF A USEFUL EXTERNAL
02216 M00S02180.smfex +++|* ARRIVING PROBABLY WITHIN A FRACTION OF A SECOND. IF
02217 M00S02181.smfex +++|* RESOURCES ARE TIGHT WE TERMINATE THE WAIT SO THE CALLER CAN
02218 M00S02182.smfex +++|* SWAP OUT.
02219 M00S02183.smfex +++|*
02220 M00S02184.smfex +++|* ENTRY TIMEOFDAY - CURRENT TIME.
02221 M00S02185.smfex +++|* TASKREQUE[CURTASK], TASKTIME[CURTASK], REMAINTTI,
02222 M00S02186.smfex +++|* TASKAVAIL, TASKSBUSY - EVENT/RESOURCE DATA.
02223 M00S02187.smfex +++|* SPINTIME - TIME ALREADY SPENT SPINNING.
02224 M00S02188.smfex +++|*
02225 M00S02189.smfex +++|* EXIT TIMEOFDAY - CURRENT TIME MAY HAVE ADVANCED.
02226 M00S02190.smfex +++|* SPINTIME - POSSIBLY INCREMENTED.
02227 M00S02191.smfex +++|*
02228 M00S02192.smfex +++|* CALLS OKTOWAIT(INTERNAL), SMFRCL.
02229 M00S02193.smfex +++|*
02230 M00S02194.smfex +++|* USES SPINSTART, TASKPULSE[CURTASK].
02231 M00S02195.smfex +++|#
02232 M00S02196.smfex +++|
02233 M00S02197.smfex +++| FUNC OKTOWAIT B;
02234 M00S02198.smfex +++| BEGIN
02235 M00S02199.smfex +++|#
02236 M00S02200.smfex +++|** OKTOWAIT - COMPUTE RULES FOR SPINWHEELS.
02237 M00S02201.smfex +++|*
02238 M00S02202.smfex +++|* OKTOWAIT DETERMINES THE EVENT/RESOURCE THRESHOLDS FOR THE
02239 M00S02203.smfex +++|* SPINWHEELS ROUTINES. A TASK MAY SPIN ITS WHEELS, HOLDING
02240 M00S02204.smfex +++|* RESOURCES, UNTIL/UNLESS ANY OF THE FOLLOWING --
02241 M00S02205.smfex +++|*
02242 M00S02206.smfex +++|* 1. THE DESIRED INPUT ARRIVES FROM IAFEX (TASKREQUE)
02243 M00S02207.smfex +++|*
02244 M00S02208.smfex +++|* 2. TWO SECONDS EXPIRE.
02245 M00S02209.smfex +++|*
02246 M00S02210.smfex +++|* 3. ONE-HALF SECOND EXPIRES AND THERE ARE MORE USERS
02247 M00S02211.smfex +++|* SCHEDULED FOR TASKS THAN TASKS LEFT TO TAKE THEM.
02248 M00S02212.smfex +++|*
02249 M00S02213.smfex +++|* 4. REGARDLESS OF TIMING, LESS THAN HALF OF THE TERMINAL
02250 M00S02214.smfex +++|* INPUT BUFFERS ARE LEFT OVER. (MOST CRITICAL RESOURCE)
02251 M00S02215.smfex +++|*
02252 M00S02216.smfex +++|* ENTRY AND EXIT - SEE OUTER PROCEDURE.
02253 M00S02217.smfex +++|#
02254 M00S02218.smfex +++| OKTOWAIT=TRUE;
02255 M00S02219.smfex +++| IF TASKREQUE[CURTASK] OR TIMEOFDAY-TASKTIME[CURTASK]
02256 M00S02220.smfex +++| GR 2000 THEN OKTOWAIT=FALSE;
02257 M00S02221.smfex +++| IF NUMTTIBUF-REMAINTTI GR TASKSAVAIL-TASKSBUSY AND
02258 M00S02222.smfex +++| TIMEOFDAY-TASKTIME[CURTASK] GR 500 THEN OKTOWAIT=FALSE;
02259 M00S02223.smfex +++| IF REMAINTTI LQ NUMTTIBUF/2 THEN OKTOWAIT=FALSE;
02260 M00S02224.smfex +++| END
02261 M00S02225.smfex +++|
02262 M00S02226.smfex +++|
02263 M00S02227.smfex +++| # SPINWHEELS MAIN CODE STARTS HERE #
02264 M00S02228.smfex +++|
02265 M00S02229.smfex +++| SPINSTART=TIMEOFDAY;
02266 M00S02230.smfex +++| WHYLE OKTOWAIT DO
02267 M00S02231.smfex +++| BEGIN
02268 M00S02232.smfex +++| TASKPULSE[CURTASK]=2; # SIMULATE BUSY FET #
02269 M00S02233.smfex +++| P<MOVTO>=LOC(TASKPULSE[CURTASK]);
02270 M00S02234.smfex +++| SMFRCL(MOVTO); # APPROX 05-HZ DELAY LOOP #
02271 M00S02235.smfex +++| END
02272 M00S02236.smfex +++| SPINTIME=SPINTIME+TIMEOFDAY-SPINSTART;
02273 M00S02237.smfex +++| IOEND # OF SPINWHEELS #
02274 M00S02238.smfex +++|PAGE # RELIABILITY/METERING HOOKS #
02275 M00S02239.smfex +++|
02276 M00S02240.smfex +++|
02277 M00S02241.smfex +++|PROC FATALTRAP;
02278 M00S02242.smfex +++| IOBEGIN(FATALTRAP)
02279 M00S02243.smfex +++|#
02280 M00S02244.smfex +++|** FATALTRAP - INTERFACE FOR FAILING TASKS.
02281 M00S02245.smfex +++|*
02282 M00S02246.smfex +++|* FATALTRAP IS CALLED BY EDITING CODE WHICH DETECTS ITS OWN
02283 M00S02247.smfex +++|* UNCORRECTABLE ALGORITHMIC INCONSISTENCY. THIS INTERFACE
02284 M00S02248.smfex +++|* WAITS FOR ANY CIO CALL TO FINISH THEN BRANCHES DIRECTLY
02285 M00S02249.smfex +++|* TO THE RUNJOBS EXECUTIVE.
02286 M00S02250.smfex +++|*
02287 M00S02251.smfex +++|* ENTRY FET - MAYBE ACTIVE.
02288 M00S02252.smfex +++|*
02289 M00S02253.smfex +++|* EXIT FET - COMPLETE.
02290 M00S02254.smfex +++|* VIA AFTEREDIT LABEL.
02291 M00S02255.smfex +++|*
02292 M00S02256.smfex +++|* CALLS SMFRCL, AFTEREDIT.
02293 M00S02257.smfex +++|#
02294 M00S02258.smfex +++| XREF LABEL AFTEREDIT;
02295 M00S02259.smfex +++| SMFRCL(FET); # WAIT IO DONE #
02296 M00S02260.smfex +++| GOTO AFTEREDIT; # TERMINATE TASK #
02297 M00S02261.smfex +++| END # OF FATALTRAP #
02298 M00S02262.smfex +++|
02299 M00S02263.smfex +++|
02300 M00S02264.smfex +++|PROC ABTPAUSE;
02301 M00S02265.smfex +++| IOBEGIN(ABTPAUSE)
02302 M00S02266.smfex +++|#
02303 M00S02267.smfex +++|** ABTPAUSE - TRY TO CHECKPOINT WORKFILE AFTER ABORT.
02304 M00S02268.smfex +++|*
02305 M00S02269.smfex +++|* ABTPAUSE IS CALLED AS EDITING CODE BY THE RUNJOBS EXECUTIVE
02306 M00S02270.smfex +++|* WHEN A TASK HAS ABORTED ITSELF. THE INTENT IS TO ATTEMPT
02307 M00S02271.smfex +++|* TO CHECKPOINT THE WORKFILE BEFORE TRANSITIONING BACK TO
02308 M00S02272.smfex +++|* SINGLE-USER. IF THIS CAN BE DONE, THEN THE SINGLE EDITOR
02309 M00S02273.smfex +++|* WILL DETECT THE ABORTED FLAG IN THE DATA SEGMENT OF THE
02310 M00S02274.smfex +++|* WORKFILE AND WILL KNOW THAT IT CANNOT PROCEED. ABTPAUSE
02311 M00S02275.smfex +++|* MAY NOT SUCCEED, AND RUNJOBS IS RESPONSIBLE TO KEEP TRACK
02312 M00S02276.smfex +++|* OF ABTPAUSE FAILURE AND INSTEAD CALL ABTKILL.
02313 M00S02277.smfex +++|*
02314 M00S02278.smfex +++|* CALLS PAUSEIO.
02315 M00S02279.smfex +++|#
02316 M00S02280.smfex +++| PAUSEIO;
02317 M00S02281.smfex +++| IOEND # OF ABTPAUSE #
02318 M00S02282.smfex +++|
02319 M00S02283.smfex +++|
02320 M00S02284.smfex +++|PROC ABTKILL;
02321 M00S02285.smfex +++| IOBEGIN(ABTKILL)
02322 M00S02286.smfex +++|#
02323 M00S02287.smfex +++|** ABTKILL - KILL OFF TASK AFTER DOUBLE ABORT.
02324 M00S02288.smfex +++|*
02325 M00S02289.smfex +++|* THE RUNJOBS EXECUTIVE CALLS ABTKILL AS A LAST RESORT WHEN A
02326 M00S02290.smfex +++|* TASK HAS DELIBERATELY ABORTED ITSELF, THEN HAS ABORTED
02327 M00S02291.smfex +++|* ITSELF A SECOND TIME WHEN ABTPAUSE ATTEMPTED TO CHECKPOINT
02328 M00S02292.smfex +++|* THE WORKFILE. ABTKILL ATTEMPTS TO ZAP THE WORKFILE TO
02329 M00S02293.smfex +++|* CONTAIN EXACTLY ONE WORD OF ZEROES, WHICH WOULD NOT BE
02330 M00S02294.smfex +++|* ACCEPTED AS A VALID TRANSITION ONCE THE SINGLE-USER EDITOR
02331 M00S02295.smfex +++|* GETS BACK IN CONTROL. THE INTENT IS TO BE AS CERTAIN AS
02332 M00S02296.smfex +++|* POSSIBLE THAT THE SINGLE EDITOR WILL NOT PICK UP AND
02333 M00S02297.smfex +++|* CONTINUE A HOPELESS EDIT SESSION.
02334 M00S02298.smfex +++|*
02335 M00S02299.smfex +++|* CALLS SMFRCL, WRITEO, REWRITR, SMFRCL.
02336 M00S02300.smfex +++|*
02337 M00S02301.smfex +++|* USES FET.
02338 M00S02302.smfex +++|#
02339 M00S02303.smfex +++| SMFRCL(FET);
02340 M00S02304.smfex +++| FETRR=1;
02341 M00S02305.smfex +++| WRITEO(FET,0);
02342 M00S02306.smfex +++| REWRITR(FET,0);
02343 M00S02307.smfex +++| SMFRCL(FET);
02344 M00S02308.smfex +++| IOEND # OF ABTKILL #
02345 M00S02309.smfex +++|
02346 M00S02310.smfex +++|
02347 M00S02311.smfex +++|CONTROL IFEQ METERING,1;
02348 M00S02312.smfex +++|
02349 M00S02313.smfex +++| PROC BGNMETER;
02350 M00S02314.smfex +++| BEGIN
02351 M00S02315.smfex +++|#
02352 M00S02316.smfex +++|** BGNMETER - INSTRUMENT BEGINNING OF EDIT SESSION.
02353 M00S02317.smfex +++|*
02354 M00S02318.smfex +++|* BGNMETER ALLOWS THE SINGLE-USER EDITOR TO PASS DATA FROM
02355 M00S02319.smfex +++|* ITS FILE-BUILD PROCESS, INTO THE CORRESPONDING TASK IN
02356 M00S02320.smfex +++|* THE MULTI-USER EDITOR, WHICH CAN USE THIS INTERFACE TO
02357 M00S02321.smfex +++|* GLOBALLY RECORD THE DATA.
02358 M00S02322.smfex +++|*
02359 M00S02323.smfex +++|* CALLS INSTRMNT1.
02360 M00S02324.smfex +++|#
02361 M00S02325.smfex +++| INSTRMNT1(INSTST"BGNEDT");
02362 M00S02326.smfex +++| END
02363 M00S02327.smfex +++|
02364 M00S02328.smfex +++|
02365 M00S02329.smfex +++| PROC WIOSTAT(ORDINAL);
02366 M00S02330.smfex +++| BEGIN
02367 M00S02331.smfex +++|#
02368 M00S02332.smfex +++|** WIOSTAT - WORKIO STATISTICS INTERFACE.
02369 M00S02333.smfex +++|*
02370 M00S02334.smfex +++|* WIOSTAT IS CALLED BY THE WORKFILE MANAGER AT NOTEWORTHY
02371 M00S02335.smfex +++|* EVENTS SO THAT STATISTICS CAN BE INCREMENTED.
02372 M00S02336.smfex +++|*
02373 M00S02337.smfex +++|* ENTRY ORDINAL - WHICH ACCUMULATOR TO INCREMENT.
02374 M00S02338.smfex +++|*
02375 M00S02339.smfex +++|* CALLS INSTRMNT2.
02376 M00S02340.smfex +++|#
02377 M00S02341.smfex +++| ITEM ORDINAL;
02378 M00S02342.smfex +++| INSTRMNT2(INSTST"WORKIO",ORDINAL);
02379 M00S02343.smfex +++| END
02380 M00S02344.smfex +++|
02381 M00S02345.smfex +++|CONTROL FI;
02382 M00S02346.smfex +++|PAGE # FNT MANAGEMENT #
02383 M00S02347.smfex +++|
02384 M00S02348.smfex +++|
02385 M00S02349.smfex +++|PROC RTRNWRKFIL;
02386 M00S02350.smfex +++| IOBEGIN(RTRNWRKFIL)
02387 M00S02351.smfex +++|#
02388 M00S02352.smfex +++|** RTRNWRKFIL - RETURN THE WORKFILE FNT.
02389 M00S02353.smfex +++|*
02390 M00S02354.smfex +++|* BEFORE SMFEX CAN TRANSITION A USER BACK TO THE SINGLE
02391 M00S02355.smfex +++|* USER EDITOR, IT MUST GET RID OF ITS LOCAL FNT FOR THE
02392 M00S02356.smfex +++|* USERS WORKFILE. RTRNWRKFIL DOES THIS AND IS
02393 M00S02357.smfex +++|* DESIGNED TO BE CALLED BY RUNJOBS IN USER STATE JUST AFTER
02394 M00S02358.smfex +++|* THE TASK HAS TERMINATED AT THE AFTEREDIT LABEL.
02395 M00S02359.smfex +++|*
02396 M00S02360.smfex +++|* ENTRY FET - SETUP.
02397 M00S02361.smfex +++|*
02398 M00S02362.smfex +++|* EXIT CURUSDONE - TRUE.
02399 M00S02363.smfex +++|*
02400 M00S02364.smfex +++|* CALLS RETERN, SMFRCL.
02401 M00S02365.smfex +++|#
02402 M00S02366.smfex +++| RETERN(FET,0);
02403 M00S02367.smfex +++| CURUSDONE=TRUE; # ASSURE NO RECOVERY #
02404 M00S02368.smfex +++| SMFRCL(FET);
02405 M00S02369.smfex +++|
02406 M00S02370.smfex +++| IOEND # OF RTRNWRKFIL #
02407 M00S02371.smfex +++|
02408 M00S02372.smfex +++|
02409 M00S02373.smfex +++|PAGE # LOGIN/LOGOUT CONTROL #
02410 M00S02374.smfex +++|
02411 M00S02375.smfex +++|
02412 M00S02376.smfex +++|PROC SENDLOGOUT;
02413 M00S02377.smfex +++| IOBEGIN(SENDLOGOUT)
02414 M00S02378.smfex +++|#
02415 M00S02379.smfex +++|** SENDLOGOUT - TRANSMIT LAST OUTPUT AND ROLLIN SINGLE.
02416 M00S02380.smfex +++|*
02417 M00S02381.smfex +++|* SENDLOGOUT PERFORMS THE LAST PROCESSING WHEN A TASK
02418 M00S02382.smfex +++|* COMPLETES ALL MULTI-USER PROCESSING. SENDLOGOUT SHOULD
02419 M00S02383.smfex +++|* BE CALLED ONLY BY RUNJOBS AFTER THE TASK HAS EXITED
02420 M00S02384.smfex +++|* AT LABEL AFTEREDIT AND AFTER THE WORKFILE LOCAL FNT HAS
02421 M00S02385.smfex +++|* BEEN RETURNED. SENDLOGOUT ASSURES THAT ANY OUTPUT LEFT
02422 M00S02386.smfex +++|* IN OUR BUFFERS IS SEND ON TO IAF, THEN TELLS IAF THE
02423 M00S02387.smfex +++|* USER IS LEAVING MULTI-USER MODE, THEN ISSUES AN EESET
02424 M00S02388.smfex +++|* FUNCTION TO CAUSE ROLLIN OF THE SINGLE USER JOB.
02425 M00S02389.smfex +++|*
02426 M00S02390.smfex +++|* THE TLX FUNCTION USED BY THE SINGLE USER JOB TO ROLLOUT
02427 M00S02391.smfex +++|* WILL BE RECALLED TO VERIFY THAT SMFEX HAS PROPERLY
02428 M00S02392.smfex +++|* DISPENSED WITH THE WORKFILE. TLX THEN CONFORMS TO IAF
02429 M00S02393.smfex +++|* THAT THE MULTI-USER SESISON IS OVER.
02430 M00S02394.smfex +++|*
02431 M00S02395.smfex +++|* ENTRY TASKNXTTTO[CURTASK] - INDICATES RESIDUAL OUTPUT.
02432 M00S02396.smfex +++|*
02433 M00S02397.smfex +++|* EXIT TASKNXTTTO[CURTASK] - ZERO.
02434 M00S02398.smfex +++|*
02435 M00S02399.smfex +++|* CALLS TTOTRAP, TRANSMIT, EESET.
02436 M00S02400.smfex +++|*
02437 M00S02401.smfex +++|* USES TTOADDR, TTOLEN, TTOTYPE.
02438 M00S02402.smfex +++|#
02439 M00S02403.smfex +++| IF TASKNXTTTO[CURTASK] NQ 0 THEN
02440 M00S02404.smfex +++| BEGIN
02441 M00S02405.smfex +++| TTOADDR=0;
02442 M00S02406.smfex +++| TTOLEN=0;
02443 M00S02407.smfex +++| TTOTYPE=TTOST"FORCE";
02444 M00S02408.smfex +++| TTOTRAP;
02445 M00S02409.smfex +++| END
02446 M00S02410.smfex +++| TASKTYPTTO[CURTASK]=SMF2IAF"LOGOUT";
02447 M00S02411.smfex +++| TRANSMIT;
02448 M00S02412.smfex +++| EESET((TTEQ*4096)+USEREJT[CURUSER]);
02449 M00S02413.smfex +++|
02450 M00S02414.smfex +++| IOEND # OF SENDLOGOUT #
02451 M00S02415.smfex +++|PAGE # TRANSMIT TO IAFEX #
02452 M00S02416.smfex +++|
02453 M00S02417.smfex +++|
02454 M00S02418.smfex +++|PROC TRANSMIT;
02455 M00S02419.smfex +++| IOBEGIN(TRANSMIT)
02456 M00S02420.smfex +++|#
02457 M00S02421.smfex +++|** TRANSMIT - TRANSMIT A FUNCTION CODE/MESSAGE TO IAFEX.
02458 M00S02422.smfex +++|*
02459 M00S02423.smfex +++|* TRANSMIT IS USED FOR THE ISSUANCE OF ALL CODES TO IAFEX
02460 M00S02424.smfex +++|* EXCEPT FOR THE SPECIAL CASE WHERE DOINPUT NEEDS TO
02461 M00S02425.smfex +++|* DISCONNECT A TERMINAL IN SERIALIZED OPERATION FOR
02462 M00S02426.smfex +++|* OVERFLOWED TABLES. TRANSMIT EXECUTES IN USER MODE, THUS
02463 M00S02427.smfex +++|* THE EXECUTIVE HAS NO WAY TO SEND MESSAGES TO IAFEX EXCEPT
02464 M00S02428.smfex +++|* FOR THE CASE ALREADY MENTIONED.
02465 M00S02429.smfex +++|*
02466 M00S02430.smfex +++|* EACH TASK HAS ITS OWN OUTPUT BUFFER WHICH IS USED TO
02467 M00S02431.smfex +++|* ACCUMULATE AND BATCH OUTPUT TEXT TOGETHER TO MINIMIZE CALLS
02468 M00S02432.smfex +++|* TO TRANSMIT. ONCE TRANSMIT IS CALLED, IT USES THE SCP/UCP
02469 M00S02433.smfex +++|* FACILITY TO SEND THE TASK'S BUFFER TO IAF. IF THE SCP/UCP
02470 M00S02434.smfex +++|* FUNCTIONS INDICATE THAT THE MESSAGE COULD NOT BE SENT TO
02471 M00S02435.smfex +++|* IAF ON THIS RECALL CYCLE, THEN THE TASK IS DELAYED
02472 M00S02436.smfex +++|* (ALLOWING OTHER TASKS TO EXECUTE IN PARALLEL) AND THE
02473 M00S02437.smfex +++|* SCP/UCP OPERATION WILL BE TRIED AGAIN.
02474 M00S02438.smfex +++|*
02475 M00S02439.smfex +++|* ENTRY TASKTYPTTO[CURTASK] - FUNCTION CODE FOR IAFEX.
02476 M00S02440.smfex +++|* TASKNXTTO[CURTASK] - AMOUNT OF TEXT TO GO WITH
02477 M00S02441.smfex +++|* FUNCTION CODE.
02478 M00S02442.smfex +++|* CURUSIAFNUM - IAFEX TERMINAL NUMBER.
02479 M00S02443.smfex +++|* TTOWORDS, TTOBLOCKS - STATISTICAL ACCUMULATORS.
02480 M00S02444.smfex +++|* CURUSLASTIM, TIMEOFDAY - ALSO FOR STATISTICS.
02481 M00S02445.smfex +++|* CURUSRCVRY, CURUSINTRPT - INDICATE PURGE BUFFER.
02482 M00S02446.smfex +++|*
02483 M00S02447.smfex +++|* EXIT TTOWORDS, TTOBLOCKS - INCREMENTED.
02484 M00S02448.smfex +++|* CURUSLASTIM, TIMEOFDAY - UP TO DATE.
02485 M00S02449.smfex +++|*
02486 M00S02450.smfex +++|* CALLS MELT, SYSTEM, INSTRMNT2, SMFDLY.
02487 M00S02451.smfex +++|*
02488 M00S02452.smfex +++|* USES IAFHEADER, P<SSCBUFFER>.
02489 M00S02453.smfex +++|#
02490 M00S02454.smfex +++| ITEM TMP1;
02491 M00S02455.smfex +++|
02492 M00S02456.smfex +++| TRCSTR("NTR TRSMT$");
02493 M00S02457.smfex +++| CONTROL IFEQ TRACEFLAG,1;
02494 M00S02458.smfex +++| TMP1=TASKNXTTTO[CURTASK];
02495 M00S02459.smfex +++| TRACEBOTH("NXTTTO$",TMP1);
02496 M00S02460.smfex +++| TMP1=TASKTYPTTO[CURTASK];
02497 M00S02461.smfex +++| TRACEBOTH("TYPTTO$",TMP1);
02498 M00S02462.smfex +++| CONTROL FI;
02499 M00S02463.smfex +++|
02500 M00S02464.smfex +++| CONTROL IFGQ PARANOIA,2;
02501 M00S02465.smfex +++| IF TASKNXTTTO[CURTASK] GR SIZTTOBUF THEN MELT("TRANSMIT 1$");
02502 M00S02466.smfex +++| IF CURUSIAFNUM GR MAXCONNECT THEN MELT("TRANSMIT 2$");
02503 M00S02467.smfex +++| CONTROL FI;
02504 M00S02468.smfex +++|
02505 M00S02469.smfex +++| IF CURUSINTRPT OR CURUSRCVRY THEN
02506 M00S02470.smfex +++| BEGIN
02507 M00S02471.smfex +++| TASKNXTTTO[CURTASK]=0;
02508 M00S02472.smfex +++| IF SHUTDOWN EQ 2 OR TASKTYPTTO[CURTASK] EQ SMF2IAF"MSGOUT" OR
02509 M00S02473.smfex +++| TASKTYPTTO[CURTASK] EQ SMF2IAF"PROMPT" THEN
02510 M00S02474.smfex +++| BEGIN
02511 M00S02475.smfex +++| TASKTYPTTO[CURTASK]=0;
02512 M00S02476.smfex +++| IORET
02513 M00S02477.smfex +++| END
02514 M00S02478.smfex +++| END
02515 M00S02479.smfex +++|
02516 M00S02480.smfex +++| IAFFUNC=TASKTYPTTO[CURTASK];
02517 M00S02481.smfex +++| IAFLEN=TASKNXTTTO[CURTASK]+1;
02518 M00S02482.smfex +++| IAFPTR=0;
02519 M00S02483.smfex +++| IAFTERM=CURUSIAFNUM;
02520 M00S02484.smfex +++| TTOBUFF[1]=IAFHEADER;
02521 M00S02485.smfex +++| CONTROL IFEQ METERING,1;
02522 M00S02486.smfex +++| TTOWORDS=TTOWORDS+IAFLEN;
02523 M00S02487.smfex +++| TTOBLOCKS=TTOBLOCKS+1;
02524 M00S02488.smfex +++| CONTROL FI;
02525 M00S02489.smfex +++|
02526 M00S02490.smfex +++|TRYTOSEND: # BACK HERE IF RETRY NEEDED #
02527 M00S02491.smfex +++|
02528 M00S02492.smfex +++| TTOBUFF[0]=0;
02529 M00S02493.smfex +++| P<SSCBUFFER>=LOC(TTOBUFFER);
02530 M00S02494.smfex +++| SSCTYPE=O"3";
02531 M00S02495.smfex +++| SSCCOUNT=IAFLEN;
02532 M00S02496.smfex +++| SYSREQ("SSC",0,LOC(SSCBUFFER),IAFSSID);
02533 M00S02497.smfex +++| IF SSCSTATUS LAN O"7776" EQ 0 THEN # NO ERROR #
02534 M00S02498.smfex +++| BEGIN
02535 M00S02499.smfex +++| CONTROL IFEQ TRACEFLAG,1;
02536 M00S02500.smfex +++| ITEM TMP2,TMP3;
02537 M00S02501.smfex +++| IAFHEADER=TTOBUFF[1]; # SINCE MAY HAVE LOST CTL #
02538 M00S02502.smfex +++| TMP1=IAFFUNC;
02539 M00S02503.smfex +++| TMP2=IAFTERM;
02540 M00S02504.smfex +++| TMP3=IAFLEN-1;
02541 M00S02505.smfex +++| P<MOVFROM>=LOC(TTOBUFF[2]);
02542 M00S02506.smfex +++| TRACEBOTH("FUNCOUT$",TMP1);
02543 M00S02507.smfex +++| TRACEDEC(TMP2);
02544 M00S02508.smfex +++| IF IAFLEN GR 1 THEN TRACEWORDS(MOVFROM,TMP3);
02545 M00S02509.smfex +++| CONTROL FI;
02546 M00S02510.smfex +++| CONTROL IFEQ METERING,1;
02547 M00S02511.smfex +++| IF NOT CURUSOLDSND THEN
02548 M00S02512.smfex +++| BEGIN
02549 M00S02513.smfex +++| TMP1=TIMEOFDAY-CURUSLASTIM;
02550 M00S02514.smfex +++| INSTRMNT2(INSTST"RSPNS",TMP1);
02551 M00S02515.smfex +++| END
02552 M00S02516.smfex +++| CONTROL FI;
02553 M00S02517.smfex +++| IF TASKTYPTTO[CURTASK] EQ SMF2IAF"MSGOUT" THEN CURUSOLDSND=TRUE;
02554 M00S02518.smfex +++| ELSE CURUSOLDSND=FALSE;
02555 M00S02519.smfex +++| CURUSLASTIM=TIMEOFDAY;
02556 M00S02520.smfex +++| IORET
02557 M00S02521.smfex +++| END
02558 M00S02522.smfex +++| ELSE IF SSCSTATUS LAN O"7776" EQ 4 THEN # IAF BUSY NOW #
02559 M00S02523.smfex +++| BEGIN
02560 M00S02524.smfex +++| SMFDLY;
02561 M00S02525.smfex +++| GOTO TRYTOSEND;
02562 M00S02526.smfex +++| END
02563 M00S02527.smfex +++| ELSE MELT("CANT TALK TO IAFEX$");
02564 M00S02528.smfex +++|
02565 M00S02529.smfex +++| IOEND # OF TRANSMIT #
02566 M00S02530.smfex +++|PAGE # VOLUNTEER TO SURRENDER TASK #
02567 M00S02531.smfex +++|
02568 M00S02532.smfex +++|
02569 M00S02533.smfex +++|PROC VOLUNTEER;
02570 M00S02534.smfex +++| IOBEGIN(VOLUNTEER)
02571 M00S02535.smfex +++|#
02572 M00S02536.smfex +++|** VOLUNTEER - SEE IF THIS TASK SHOULD SLOW DOWN.
02573 M00S02537.smfex +++|*
02574 M00S02538.smfex +++|* VOLUNTEER IS USED TO PREVENT A TASK FROM EXCESSIVE RESOURCE
02575 M00S02539.smfex +++|* USAGE. EDITING CODE SHOULD CALL VOLUNTEER PERIODICALLY
02576 M00S02540.smfex +++|* INSIDE ANY PROCESS WHICH IS POTENTIALLY LONG-RUNNING. NOTE
02577 M00S02541.smfex +++|* THAT ANY CODE IN THE WORKFILE MANAGER (THE WORKIO MODULE)
02578 M00S02542.smfex +++|* IS A "MUST COMPLETE" FUNCTION - THAT MEANS THAT VOLUNTEER
02579 M00S02543.smfex +++|* CAN BE CALLED BY ACTUAL EDITING CODE BUT CANNOT BE CALLED
02580 M00S02544.smfex +++|* FROM WORKIO ITSELF.
02581 M00S02545.smfex +++|*
02582 M00S02546.smfex +++|* VOLUNTEER FIRST CONSIDERS WHETHER THE TASK IS USING
02583 M00S02547.smfex +++|* EXCESSIVE CPU TIME ON AN INSTANTANEOUS BASIS. THE
02584 M00S02548.smfex +++|* OPERATING SYSTEM REAL TIME MILLISECOND CLOCK IS FRESHLY
02585 M00S02549.smfex +++|* ACCESSED, AND THE CURRENT TIME IS COMPARED TO THE TIME
02586 M00S02550.smfex +++|* TAKEN AT THE START OF THE RECALL CYCLE TO SEE IF MORE THAN
02587 M00S02551.smfex +++|* A FEW MILLISECONDS OF CPU HAVE BEEN USED. A CALCULATION
02588 M00S02552.smfex +++|* ATTEMPTS TO SELECT A THRESHOLD SUCH THAT SMFEX WILL NEVER
02589 M00S02553.smfex +++|* USE MORE THAN ABOUT HALF OF THE CPU. THIS MEANS THAT FOR
02590 M00S02554.smfex +++|* AN INSTALLATION WHICH INTENDS THAT SUBSTANTIALLY ALL OF THE
02591 M00S02555.smfex +++|* CPU SHOULD BE USED FOR TEXT EDITING, SMFEX MAY BE
02592 M00S02556.smfex +++|* UNSUITABLE AND THE SINGLE-USER EDITORS MAY BE BETTER.
02593 M00S02557.smfex +++|*
02594 M00S02558.smfex +++|* IF THE TASK IS CURRENTLY USING MORE THAN A FEW MILLISECONDS
02595 M00S02559.smfex +++|* OF CPU, IT DELAYS, AND THE REMAINDER OF THE VOLUNTEER
02596 M00S02560.smfex +++|* ALGORITHM WILL CONTINUE ON A LATER RECALL CYCLE.
02597 M00S02561.smfex +++|*
02598 M00S02562.smfex +++|* THE REMAINDER OF THE VOLUNTEER ALGORITHM CONSIDERS WHETHER
02599 M00S02563.smfex +++|* A TASK HAS RESIDED IN ITS SWAPPED-IN MEMORY IMAGE FOR TOO
02600 M00S02564.smfex +++|* MUCH REAL TIME. WE CALCULATE THE REAL TIME FROM THE TIME
02601 M00S02565.smfex +++|* AT WHICH THE TASK SWAPPED IN UNTIL THE PRESENT TIME. IF
02602 M00S02566.smfex +++|* THE TIME DELTA EXCEEDS THE "VOLTIME" THRESHOLD AND THERE IS
02603 M00S02567.smfex +++|* QUEUED TERMINAL OUTPUT, THE TASK WILL SWAP OUT SO THE
02604 M00S02568.smfex +++|* OUTPUT CAN BE SENT. IF THE TIME DELTA EXCEEDS THE
02605 M00S02569.smfex +++|* THRESHOLD AND THERE ARE MORE USERS AWAITING SWAPIN THAN THE
02606 M00S02570.smfex +++|* NUMBER OF TASKS FREE TO SWAP THEM IN, THEN THIS TASK WILL
02607 M00S02571.smfex +++|* SWAPOUT SO ANOTHER USER CAN SWAPIN. IF THE NUMBER OF
02608 M00S02572.smfex +++|* TERMINAL INPUT BUFFERS IS DOWN TO APPROXIMATELY ONE FOURTH
02609 M00S02573.smfex +++|* OF THE TOTAL, THEN THIS TASK WILL SWAP OUT REGARDLESS OF
02610 M00S02574.smfex +++|* WHETHER WE HAVE EXCEEDED THE THRESHOLD.
02611 M00S02575.smfex +++|*
02612 M00S02576.smfex +++|* THUS, THE "VOLTIME" THRESHOLD REPRESENTS THE AMOUNT OF TIME
02613 M00S02577.smfex +++|* A TASK IS ASSURED THAT IT CAN REMAIN SWAPPED IN. IF THE
02614 M00S02578.smfex +++|* TASK IS NOT PRODUCING OUTPUT AND THERE IS NO EXCESS QUEUE
02615 M00S02579.smfex +++|* FOR SWAPIN, THE TASK CAN EXCEED THE TRESHOLD. BUT IF THERE
02616 M00S02580.smfex +++|* IS A CRITICAL RESOURCE SHORTAGE (INPUT BUFFERS) THEN ALL
02617 M00S02581.smfex +++|* BETS ARE OFF AND WE SWAP THIS TASK AS SOON AS IT HAS
02618 M00S02582.smfex +++|* VOLUNTEERED, WITHOUT ALLOWING THE NORMAL GUARANTEED TIME.
02619 M00S02583.smfex +++|*
02620 M00S02584.smfex +++|* ENTRY TIMEOFDAY - TIME AT WHICH THIS RECALL CYCLE STARTED.
02621 M00S02585.smfex +++|* OLDTIMEDAY - TIME FOR START OF PREVIOUS RECALL CYCLE,
02622 M00S02586.smfex +++|* OR TIME OF VOLUNTEER EXECUTION WITHIN PREVIOUS
02623 M00S02587.smfex +++|* RECALL CYCLE IF VOLUNTEER WAS CALLED.
02624 M00S02588.smfex +++|* TASKTIME[CURTASK] - WHEN THIS TASK SWAPPED IN.
02625 M00S02589.smfex +++|* TASKNXTTTO[CURTASK] - WHETHER OUTPUT IS PENDING.
02626 M00S02590.smfex +++|* TASKSAVAIL - TOTAL USABLE TASKS.
02627 M00S02591.smfex +++|* TASKSBUSY - NUMBER OF TASKS USED NOW.
02628 M00S02592.smfex +++|* SWPQSIZE - NUMBER OF USERS AWAITING SWAPIN.
02629 M00S02593.smfex +++|* REMAINTTI - NUMBER OF UNUSED INPUT BUFFERS.
02630 M00S02594.smfex +++|*
02631 M00S02595.smfex +++|* EXIT TIMEOFDAY - UP TO DATE.
02632 M00S02596.smfex +++|* TASKNXTTTO[CURTASK] - CLEARED IF SWAPPED.
02633 M00S02597.smfex +++|* TASKTIME[CURTASK] - NEW VALUE IF SWAPPED.
02634 M00S02598.smfex +++|* CURUSCRUNCH - TRUE IF SWAP FOR OVERTIME BUT NO OUTPUT.
02635 M00S02599.smfex +++|* TASKREQUE[CURTASK] - TRUE IF SWAP NOT FOR OUTPUT.
02636 M00S02600.smfex +++|*
02637 M00S02601.smfex +++|* CALLS RTIME, MIN, MAX, SMFDLY, INSTRMNT1, INSTRMNT2,
02638 M00S02602.smfex +++|* TTSYNC, TTOTRAP.
02639 M00S02603.smfex +++|*
02640 M00S02604.smfex +++|* USES TTOADDR, TTOLEN, TTOTYPE.
02641 M00S02605.smfex +++|#
02642 M00S02606.smfex +++| ITEM DELTA, SURRENDER;
02643 M00S02607.smfex +++|
02644 M00S02608.smfex +++| RTIME(NEWTIMEDAY);
02645 M00S02609.smfex +++| NEWTIMEDAY=B<24,36>NEWTIMEDAY;
02646 M00S02610.smfex +++| DELTA=MAX(50,MIN(10,(TIMEOFDAY-OLDTIMEDAY)/2));
02647 M00S02611.smfex +++| IF NEWTIMEDAY-TIMEOFDAY GR DELTA THEN
02648 M00S02612.smfex +++| BEGIN
02649 M00S02613.smfex +++| SMFDLY;
02650 M00S02614.smfex +++| CONTROL IFEQ METERING,1;
02651 M00S02615.smfex +++| INSTRMNT1(INSTST"DROPCPU");
02652 M00S02616.smfex +++| CONTROL FI;
02653 M00S02617.smfex +++| END
02654 M00S02618.smfex +++|
02655 M00S02619.smfex +++| # NEXT CODE IS NON-REENTRANT, MUST RUN INSTANTANEOUSLY #
02656 M00S02620.smfex +++|
02657 M00S02621.smfex +++| DELTA=TIMEOFDAY-TASKTIME[CURTASK];
02658 M00S02622.smfex +++| SURRENDER=0;
02659 M00S02623.smfex +++|
02660 M00S02624.smfex +++| # TRY TO MOVE IF SITTING ON TYPABLE OUTPUT FOR A LONG TIME #
02661 M00S02625.smfex +++| IF TASKNXTTTO[CURTASK] NQ 0 AND DELTA GQ VOLTIME*4
02662 M00S02626.smfex +++| THEN SURRENDER=1;
02663 M00S02627.smfex +++|
02664 M00S02628.smfex +++| # ALSO TRY TO MOVE IF SHORT ON TASKS FOR A SHORT TIME #
02665 M00S02629.smfex +++| IF TASKSAVAIL-TASKSBUSY LS SWPQSIZE AND DELTA GQ VOLTIME
02666 M00S02630.smfex +++| THEN SURRENDER=2;
02667 M00S02631.smfex +++|
02668 M00S02632.smfex +++| # MOVE IF CRITICAL RESOURCE SHORTAGE REGARDLESS OF TIME #
02669 M00S02633.smfex +++| IF REMAINTTI LQ (NUMTTIBUF+3)/4
02670 M00S02634.smfex +++| THEN SURRENDER=3;
02671 M00S02635.smfex +++|
02672 M00S02636.smfex +++| # END OF INSTANTANEOUS ALGORITHM #
02673 M00S02637.smfex +++|
02674 M00S02638.smfex +++| IF SURRENDER NQ 0 THEN # FACE WRITING ON WALL #
02675 M00S02639.smfex +++| BEGIN
02676 M00S02640.smfex +++| TRCBOTH("PREEMPT$",CURUSER);
02677 M00S02641.smfex +++| CONTROL IFEQ METERING,1;
02678 M00S02642.smfex +++| INSTRMNT2(INSTST"PREEMPT",SURRENDER);
02679 M00S02643.smfex +++| CONTROL FI;
Line S02644 Modification History |
M01 (Removed by) | smfex3 |
Seq # *Modification Id* Act
----------------------------+
02680 M01S02644.smfex3 ---| IF TASKNXTTTO[CURTASK] EQ 0 THEN
02681 M01S02645.smfex3 ---| BEGIN
02682 M01S02646.smfex3 ---| IF DELTA GQ 0 THEN CURUSCRUNCH=TRUE;
02683 M01S02647.smfex3 ---| TASKREQUE[CURTASK]=TRUE;
02684 M01S02648.smfex3 ---| END
02685 M01S02649.smfex3 ---| # NEED FOR INSTANTANEOUS COMPUTATION ENDS HERE #
02686 M01S02650.smfex3 ---| IF SCREENMODE THEN VDSYNCH;
02687 M01S02651.smfex3 ---| ELSE TTSYNC;
Line S00001 Modification History |
M01 (Added by) | smfex3 |
Seq # *Modification Id* Act
----------------------------+
02688 M01S00001.smfex3 +++| IF SCREENMODE THEN
02689 M01S00002.smfex3 +++| BEGIN # IF IN SCREEN MODE #
02690 M01S00003.smfex3 +++| VDSYNCH; # MUST PRECEED TASKNXTTTO CHECK #
02691 M01S00004.smfex3 +++| END # SINCE OUTPUT MAY BE FLUSHED #
02692 M01S00005.smfex3 +++| ELSE
02693 M01S00006.smfex3 +++| BEGIN # LINE MODE #
02694 M01S00007.smfex3 +++| TTSYNC; # MUST PRECEED TASKNXTTTO CHECK #
02695 M01S00008.smfex3 +++| END # SINCE OUTPUT MAY BE FLUSHED #
02696 M01S00009.smfex3 +++| IF TASKNXTTTO[CURTASK] EQ 0 THEN
02697 M01S00010.smfex3 +++| BEGIN # IF NO OUTPUT QUEUED FOR USER #
02698 M01S00011.smfex3 +++| CURUSCRUNCH=TRUE; # NO OUTPUT, JUST CRUNCHING #
02699 M01S00012.smfex3 +++| TASKREQUE[CURTASK]=TRUE; # SHOULD BE REQUEUED #
02700 M01S00013.smfex3 +++| END
02701 M00S02652.smfex +++| TTOADDR=0;
02702 M00S02653.smfex +++| TTOLEN=0;
02703 M00S02654.smfex +++| TTOTYPE=TTOST"FORCE";
02704 M00S02655.smfex +++| TTOTRAP;
02705 M00S02656.smfex +++| END
02706 M00S02657.smfex +++|
02707 M00S02658.smfex +++| IOEND # OF VOLUNTEER #
02708 M00S02659.smfex +++|PAGE # TTY INPUT HOOK #
02709 M00S02660.smfex +++|
02710 M00S02661.smfex +++|
02711 M00S02662.smfex +++|PROC TTITRAP;
02712 M00S02663.smfex +++| IOBEGIN(TTITRAP)
02713 M00S02664.smfex +++|#
02714 M00S02665.smfex +++|** TTITRAP - PROVIDE EDITOR CODE WITH INPUT TEXT.
02715 M00S02666.smfex +++|*
02716 M00S02667.smfex +++|* TTITRAP IS CALLED BY THE EDITOR IN LIEU OF CIO READ
02717 M00S02668.smfex +++|* FUNCTIONS AGAINST AN INPUT FET. CALLING TTITRAP INSTEAD OF
02718 M00S02669.smfex +++|* CIO IS DONE BY CONDITIONAL COMPILATION OF CODE IN THE
02719 M00S02670.smfex +++|* TERMIO MODULE. THE EDITOR IS NOT ALLOWED TO OBTAIN INPUT
02720 M00S02671.smfex +++|* BY ANY MEANS EXCEPT TO CALL TERMIO AND LET IT DECIDE WHICH
02721 M00S02672.smfex +++|* MECHANISM IS APPROPRIATE FOR THE VERSION OF THE EDITOR.
02722 M00S02673.smfex +++|*
02723 M00S02674.smfex +++|* IN ADDITION TO PROVIDING INPUT, TTITRAP ALSO PROVIDES A
02724 M00S02675.smfex +++|* MEANS TO PURGE ANY UNUSED INPUT FROM THE BUFFERS CHAINS.
02725 M00S02676.smfex +++|* THIS IS INDICATED BY A NEGATIVE VALUE IN THE TTILEN
02726 M00S02677.smfex +++|* PARAMETER.
02727 M00S02678.smfex +++|*
02728 M00S02679.smfex +++|* WHEN INPUT IS DESIRED, TERMIO USES A POSITIVE VALUE IN THE
02729 M00S02680.smfex +++|* TTILEN PARAMETER TO INDICATE THE MAXIMUM NUMBER OF WORDS IT
02730 M00S02681.smfex +++|* CAN ACCEPT. THE WORKING BUFFER IS POINTED TO BY THE
02731 M00S02682.smfex +++|* TTIADDR PARAMETER. THE TTINEXT PARAMETER IS MAINTAINED BY
02732 M00S02683.smfex +++|* THIS ROUTINE TO KEEP TRACK OF WHAT PORTIONS OF THE CURRENT
02733 M00S02684.smfex +++|* BUFFER CHAIN HAVE ALREADY BEEN TRANSMITTED.
02734 M00S02685.smfex +++|*
02735 M00S02686.smfex +++|* INPUT FROM IAFEX IS MAINTAINED BY SMFEX, UNTIL TTITRAP IS
02736 M00S02687.smfex +++|* READY TO PASS ON TO THE EDITING CODE, IN A CHAIN OF ONE OR
02737 M00S02688.smfex +++|* MORE TERMINAL INPUT BUFFERS. ONE BUFFER IS CHAINED FOR
02738 M00S02689.smfex +++|* EACH MESSAGE FRAGMENT SENT BY IAFEX. TTITRAP MAINTAINS THE
02739 M00S02690.smfex +++|* TTILAST PARAMETER, WHICH IS THE TEXT OF THE LAST WORD
02740 M00S02691.smfex +++|* PASSED TO TERMIO, TO KNOW WHETHER THE PREVIOUS TTITRAP
02741 M00S02692.smfex +++|* CYCLE ENCOUNTERED A ZERO BYTE TERMINATOR. THIS ENABLES
02742 M00S02693.smfex +++|* TTITRAP TO KNOW WHETHER THE EDITING TASK IS IN THE MIDDLE
02743 M00S02694.smfex +++|* OF A SERIES OF FRAGMENTS OR IS AWAITING THE FIRST FRAGMENT
02744 M00S02695.smfex +++|* OF A MESSAGE.
02745 M00S02696.smfex +++|*
02746 M00S02697.smfex +++|* IF TTITRAP DETERMINES THAT THE TASK IS IN THE MIDDLE OF A
02747 M00S02698.smfex +++|* SERIES OF FRAGMENTS, BUT DOES NOT YET HAVE THE NEXT
02748 M00S02699.smfex +++|* FRAGMENT FROM IAFEX, TTITRAP WILL ATTEMPT TO KEEP THE TASK
02749 M00S02700.smfex +++|* DELAYING IN MEMORY, USING THE SPINWHEELS FUNCTION. THIS IS
02750 M00S02701.smfex +++|* DONE BECAUSE THERE IS AN EXCELLENT PROBABILITY THAT THE
02751 M00S02702.smfex +++|* NEXT INPUT FRAGMENT WILL ARRIVE FROM IAFEX WITHIN A FEW
02752 M00S02703.smfex +++|* MILLISECONDS. ON THE OTHER HAND, WHEN THE EDITING TASK
02753 M00S02704.smfex +++|* ASKS FOR THE FIRST FRAGMENT OF A MESSAGE AND NO TEXT HAS
02754 M00S02705.smfex +++|* ARRIVED YET FROM IAFEX, IT IS LIKELY THAT SEVERAL SECONDS
02755 M00S02706.smfex +++|* WILL PASS BEFORE THE INPUT ARRIVES, SO THAT TASK IS ALLOWED
02756 M00S02707.smfex +++|* TO SWAPOUT.
02757 M00S02708.smfex +++|*
02758 M00S02709.smfex +++|* ONCE THE TASK ADVANCES THRU TTITRAP BEYOND ANY WHEELSPIN OR
02759 M00S02710.smfex +++|* ANY SWAPOUT, TTITRAP ASSEMBLES AS MUCH INPUT TEXT AS IT
02760 M00S02711.smfex +++|* CAN, UNTIL EITHER THE TTILEN PARAMETER IS EXHAUSTED OR THE
02761 M00S02712.smfex +++|* END OF ONE BUFFER IS REACHED. TEXT FROM THE NEXT BUFFER OF
02762 M00S02713.smfex +++|* A CHAIN OF SEVERAL FRAGMENTS CANNOT BE PROCESSED UNTIL THE
02763 M00S02714.smfex +++|* NEXT CALL TO TTITRAP. THIS MEANS THAT THE SIZE OF EACH
02764 M00S02715.smfex +++|* FRAGMENT ALLOWED BY IAFEX AND SMFEX MUST BE ADEQUATE FOR
02765 M00S02716.smfex +++|* COMPLETE INPUTS WHEN THE EDITOR IS USED IN LINE MODE. THIS
02766 M00S02717.smfex +++|* RESTRICTION IS IN EFFECT BECAUSE THE LINE EDITOR REQUESTS
02767 M00S02718.smfex +++|* INPUT IN COMPLETE LINE IMAGES. THE SCREEN EDITOR, HOWEVER,
02768 M00S02719.smfex +++|* ASKS FOR INPUT ONE WORD AT A TIME, SO MULTIPLE FRAGMENTS
02769 M00S02720.smfex +++|* CAN BE PROCESSED WITH MULTIPLE TTITRAP CALLS.
02770 M00S02721.smfex +++|*
02771 M00S02722.smfex +++|* WHEN TTITRAP DECIDES TO SWAP THE TASK OUT, IT CALLS PAUSEIO
02772 M00S02723.smfex +++|* IN THE WORKFILE MANAGER. THIS IS DONE BECAUSE WORKIO HOLDS
02773 M00S02724.smfex +++|* SOME TRANSIENT RESOURCES, SUCH AS ITS CIRCULAR BUFFER, AND
02774 M00S02725.smfex +++|* NEEDS THE OPPORTUNITY TO COMPLETE ITS USAGE OF THESE
02775 M00S02726.smfex +++|* RESOURCES.
02776 M00S02727.smfex +++|*
02777 M00S02728.smfex +++|*
02778 M00S02729.smfex +++|* ENTRY TTILEN - NEGATIVE MEANS PURGE UNUSED INPUT.
02779 M00S02730.smfex +++|* POSITIVE IS TASKS CAPACITY FOR TEXT.
02780 M00S02731.smfex +++|* TTIADDR - WHERE THE TEXT SHOULD GO.
02781 M00S02732.smfex +++|* CURUSTTIBUF - FIRST BUFFER LINKAGE.
02782 M00S02733.smfex +++|* TTINEXT - WHERE TTITRAP PREVIOUS EXTRACTED TEXT.
02783 M00S02734.smfex +++|* TTILAST - LAST WORD OF TEXT FROM PREVIOUS TTITRAP.
02784 M00S02735.smfex +++|* RUNTIME - FOR STATISTICS.
02785 M00S02736.smfex +++|* TIMEOFDAY, TASKTIME[CURTASK] - FOR STATISTICS.
02786 M00S02737.smfex +++|* ACCTCIO, ACCTTRANS - STATISTICS/ACCOUNTING.
02787 M00S02738.smfex +++|* TTOWORDS, TTOBLOCKS - FOR STATISTICS.
02788 M00S02739.smfex +++|* TTIBUFADDR[ALL] - SETUP.
02789 M00S02740.smfex +++|* TTIBUFLNK[ALL] - LINKAGES.
02790 M00S02741.smfex +++|* TTIBUFLEN[ALL] - FRAGMENT SIZES.
02791 M00S02742.smfex +++|* TTIBITS - ALLOCATION BITMASK FOR BUFFERS.
02792 M00S02743.smfex +++|*
02793 M00S02744.smfex +++|* EXIT TTINEXT - INCREMENTED.
02794 M00S02745.smfex +++|* CURUSTTIBUF - ADVANCED/CLEARED VIA LINKAGE.
02795 M00S02746.smfex +++|* TIMEOFDAY - UP TO DATE.
02796 M00S02747.smfex +++|* TASKTIME[CURTASK] - TIME OF SWAPOUT IF ANY.
02797 M00S02748.smfex +++|* RUNTIME, ACCTCIO, ACCTTRANS - INCREMENTED.
02798 M00S02749.smfex +++|* SPINTIME, RUNTIME, CIOCOUNT - CLEARED IF SWAPPED.
02799 M00S02750.smfex +++|* CURUSOKOUT - TRUE.
02800 M00S02751.smfex +++|* TTILEN - DECREMENTED.
02801 M00S02752.smfex +++|* TTILAST - UPDATED.
02802 M00S02753.smfex +++|* REMAINTTI - INCREMENTED IF BUFFER EMPTIED.
02803 M00S02754.smfex +++|* TTOWORDS, TTOBLOCKS - CLEARED IF SWAPPED.
02804 M00S02755.smfex +++|*
02805 M00S02756.smfex +++|* CALLS PURGETTI, SPINWHEELS, CLEARQUE, PAUSEIO, INSTRMNT1,
02806 M00S02757.smfex +++|* INSTRMNT2, INSTRMNT3, TTOTRAP, MIN, MOVEWD, DEALLOC.
02807 M00S02758.smfex +++|*
02808 M00S02759.smfex +++|* USES TTOLEN, TTOTYPE.
02809 M00S02760.smfex +++|#
02810 M00S02761.smfex +++| ITEM TMP1, TMP2, TMP3;
Line S02762 Modification History |
M01 (Removed by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02811 M01S02762.smfex1 ---| ITEM QUESTION1=O"71000013000000000000";
02812 M01S02763.smfex1 ---| ITEM QUESTION2=O"71550002000000000000";
02813 M01S02764.smfex1 ---| ITEM XPTINCTL=O"00064704001500000000";
Line S00001 Modification History |
M01 (Added by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02814 M01S00001.smfex1 +++| ITEM QUESTION1 I=O"7100 0013 0000 0000 0000"; # PROMPT ONE #
02815 M01S00002.smfex1 +++| ITEM QUESTION2 I=O"7155 0013 0000 0000 0000"; # PROMPT TWO #
02816 M01S00003.smfex1 +++| ITEM XPTINCTL I=O"0006 4704 0015 0000 0000"; # XPARENT INPUT #
02817 M00S02765.smfex +++|
02818 M00S02766.smfex +++| TRCSTR("NTR ITRP$");
02819 M00S02767.smfex +++|
02820 M00S02768.smfex +++| IF TTILEN LS 0 THEN # PURGE ANY BUFFERS #
02821 M00S02769.smfex +++| BEGIN
02822 M00S02770.smfex +++| IF CURUSTTIBUF NQ 0 THEN PURGETTI;
02823 M00S02771.smfex +++| TTINEXT=0;
02824 M00S02772.smfex +++| IORET
02825 M00S02773.smfex +++| END
02826 M00S02774.smfex +++|
02827 M00S02775.smfex +++| IF CURUSTTIBUF EQ 0 AND B<48,12>TTILAST NQ 0 THEN
02828 M00S02776.smfex +++| BEGIN # DELAY SINCE MORE INPUT DUE ASAP #
02829 M00S02777.smfex +++| SPINWHEELS; # DELAY TILL INPUT ARRIVES OR TIMEOUT #
02830 M00S02778.smfex +++| CLEARQUE;
02831 M00S02779.smfex +++| END
02832 M00S02780.smfex +++|
02833 M00S02781.smfex +++| IF NOT CURUSOKOUT THEN # FIRST TRANSACTION #
02834 M00S02782.smfex +++| BEGIN
02835 M00S02783.smfex +++| CURUSOKOUT=TRUE;
Line S02784 Modification History |
M01 (Removed by) | ns2186 |
Seq # *Modification Id* Act
----------------------------+
02836 M01S02784.ns2186 ---| IF NOT SCREENMODE THEN
Line S00002 Modification History |
M01 (Added by) | ns2186 |
Seq # *Modification Id* Act
----------------------------+
02837 M01S00002.ns2186 +++| IF SCREENMODE THEN
02838 M01S00003.ns2186 +++| BEGIN
02839 M01S00004.ns2186 +++| ROWPAINT[COMMANDROW]=TRUE;
02840 M01S00005.ns2186 +++| END
02841 M01S00006.ns2186 +++| ELSE
02842 M00S02785.smfex +++| BEGIN
02843 M00S02786.smfex +++| TTOADDR=LOC(QUESTION1);
02844 M00S02787.smfex +++| TTOLEN=1;
02845 M00S02788.smfex +++| TTOTYPE=TTOST"NORMAL";
02846 M00S02789.smfex +++| TTOTRAP;
02847 M00S02790.smfex +++| END
02848 M00S02791.smfex +++| END
02849 M00S02792.smfex +++|
02850 M00S02793.smfex +++| IF CURUSTTIBUF EQ 0 THEN # NORMAL TRANSACTION SO SWAPOUT #
02851 M00S02794.smfex +++| BEGIN
02852 M00S02795.smfex +++| PAUSEIO; # LET WORKIO PP'S DROP #
02853 M00S02796.smfex +++| RUNTIME=TIMEOFDAY-TASKTIME[CURTASK]+RUNTIME;
02854 M00S02797.smfex +++| TASKTIME[CURTASK]=TIMEOFDAY;
02855 M00S02798.smfex +++| ACCTCIO=ACCTCIO+CIOCOUNT;
02856 M00S02799.smfex +++| ACCTTRANS=ACCTTRANS+1;
02857 M00S02800.smfex +++| CONTROL IFEQ METERING,1;
02858 M00S02801.smfex +++| INSTRMNT2(INSTST"TASKUTIL",RUNTIME);
02859 M00S02802.smfex +++| INSTRMNT3(INSTST"EDTCIO",RUNTIME-SPINTIME,CIOCOUNT);
02860 M00S02803.smfex +++| INSTRMNT1(INSTST"TRANS");
02861 M00S02804.smfex +++| CONTROL FI;
02862 M00S02805.smfex +++| IF NOT CURUSINTRPT THEN
02863 M00S02806.smfex +++| BEGIN # NO FRESH BREAK, CAN PROMPT #
02864 M00S02807.smfex +++| TTOADDR=LOC(QUESTION2);
Line S02808 Modification History |
M01 (Removed by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
02865 M01S02808.v23l617 ---| IF SCREENMODE THEN TTOADDR=LOC(XPTINCTL);
02866 M00S02809.smfex +++| TTOLEN=1;
Line S00006 Modification History |
M01 (Added by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
02867 M01S00006.v23l617 +++| IF SCREENMODE THEN # IF SCREEN MODE #
02868 M01S00007.v23l617 +++| BEGIN
02869 M01S00008.v23l617 +++| IF TABTYPHEAD[0] THEN TTOLEN=0; # IF TYPEAHEAD USED #
02870 M01S00009.v23l617 +++| ELSE TTOADDR=LOC(XPTINCTL); # NO TYPEAHEAD #
02871 M01S00010.v23l617 +++| END
02872 M00S02810.smfex +++| TTOTYPE=TTOST"PROMPT";
02873 M00S02811.smfex +++| TTOTRAP;
02874 M00S02812.smfex +++| END
02875 M00S02813.smfex +++| SPINTIME=0;
02876 M00S02814.smfex +++| RUNTIME=0;
02877 M00S02815.smfex +++| CIOCOUNT=0;
02878 M00S02816.smfex +++| CONTROL IFEQ METERING,1;
02879 M00S02817.smfex +++| INSTRMNT3(INSTST"XMIT",TTOWORDS,TTOBLOCKS);
02880 M00S02818.smfex +++| TTOBLOCKS=0;
02881 M00S02819.smfex +++| TTOWORDS=0;
02882 M00S02820.smfex +++| CONTROL FI;
02883 M00S02821.smfex +++| END
02884 M00S02822.smfex +++| # NOW WE KNOW WE HAVE SOMETHING #
02885 M00S02823.smfex +++|
02886 M00S02824.smfex +++| MEM[TTIADDR]=0; # ASSURE DEFAULT NULL LINE #
02887 M00S02825.smfex +++| WHYLE CURUSTTIBUF NQ 0 AND TTILEN GR 0 DO
02888 M00S02826.smfex +++| BEGIN
02889 M00S02827.smfex +++| TMP1=CURUSTTIBUF;
02890 M00S02828.smfex +++| P<MOVFROM>=TTIBUFADDR[TMP1]+TTINEXT;
02891 M00S02829.smfex +++| P<MOVTO>=TTIADDR;
02892 M00S02830.smfex +++| TMP2=TTIBUFLEN[TMP1]-TTINEXT;
02893 M00S02831.smfex +++| TMP3=MIN(TMP2,TTILEN);
02894 M00S02832.smfex +++| MOVEWD(TMP3,MOVFROM,MOVTO);
02895 M00S02833.smfex +++| TTINEXT=TTINEXT+TMP3; # INCREMENT SOURCE ADDR #
02896 M00S02834.smfex +++| TTILEN=TTILEN-TMP3; # DECREMENT CALLERS COUNT #
02897 M00S02835.smfex +++| TTILAST=MEM[LOC(MOVFROM)+TMP3-1]; # SHOWS WHETHER EOL SEEN #
02898 M00S02836.smfex +++| IF TTINEXT GQ TTIBUFLEN[TMP1] THEN
02899 M00S02837.smfex +++| BEGIN # RELEASE THIS BUFFER, POINT NEXT #
02900 M00S02838.smfex +++| TTINEXT=0;
02901 M00S02839.smfex +++| DEALLOC(TTIBITS,TMP1,NUMTTIBIT);
02902 M00S02840.smfex +++| REMAINTTI=REMAINTTI+1;
02903 M00S02841.smfex +++| CURUSTTIBUF=TTIBUFLNK[TMP1];
02904 M00S02842.smfex +++| END
02905 M00S02843.smfex +++| END
02906 M00S02844.smfex +++|
02907 M00S02845.smfex +++| IOEND # OF TTITRAP #
02908 M00S02846.smfex +++|PAGE # TTY OUTPUT AND SWAPOUT HOOK #
02909 M00S02847.smfex +++|
02910 M00S02848.smfex +++|
02911 M00S02849.smfex +++|PROC TTOTRAP;
02912 M00S02850.smfex +++| IOBEGIN(TTOTRAP)
02913 M00S02851.smfex +++|#
02914 M00S02852.smfex +++|** TTOTRAP - QUEUE/ISSUE OUTPUT, SWAP AS NEEDED.
02915 M00S02853.smfex +++|*
02916 M00S02854.smfex +++|* TTOTRAP IS CALLED BY EDITOR CODE IN LIEU OF CIO WRITE
02917 M00S02855.smfex +++|* FUNCTIONS AGAINST AN OUTPUT FET. EDITING CODE IS REQUIRED
02918 M00S02856.smfex +++|* TO INTERFACE ALL OUTPUT THRU THE TERMIO MODULE, WHICH USES
02919 M00S02857.smfex +++|* CONDITIONAL COMPILATION TO SELECT THE RIGHT TECHNIQUE OF
02920 M00S02858.smfex +++|* OUTPUT FOR THE VERSION OF THE EDITOR.
02921 M00S02859.smfex +++|*
02922 M00S02860.smfex +++|* TTOTRAP IS ALSO USED BY THE VOLUNTEER AND TTITRAP ROUTINES
02923 M00S02861.smfex +++|* OF SMFEX. TTOTRAP PROVIDES SWAPOUT LOGIC FOR THOSE CALLERS
02924 M00S02862.smfex +++|* TOGETHER WITH ISSUANCE OF RESIDUAL OUTPUT.
02925 M00S02863.smfex +++|*
02926 M00S02864.smfex +++|* TTOTRAP IS CONTROLLED PRIMARILY BY THE TTOTYPE PARAMETER.
02927 M00S02865.smfex +++|* THE "NORMAL" VALUE INDICATES THAT THE CALLER'S INTENT IS TO
02928 M00S02866.smfex +++|* OFFER SOME OUTPUT TEXT. TTOTRAP QUEUES THIS TEXT INTO THE
02929 M00S02867.smfex +++|* TASK'S UNIQUE OUTPUT BUFFER AS POSSIBLE, CALLING THE
02930 M00S02868.smfex +++|* TRANSMIT ROUTINE TO SEND TO IAFEX WHENEVER THE BUFFER IS
02931 M00S02869.smfex +++|* FULL. FOR THIS TYPE OF COMMUNICATION TO IAFEX, TTOTRAP
02932 M00S02870.smfex +++|* THEN USES THE SPINWHEELS FUNCTION TO HOLD ONTO THE TASK FOR
02933 M00S02871.smfex +++|* A FEW EXTRA MILLISEONDS, SINCE THERE IS ABOUT AN EVEN
02934 M00S02872.smfex +++|* CHANCE THAT IAFEX WILL QUICKLY RESPOND AND ASK SMFEX TO
02935 M00S02873.smfex +++|* CONTINUE TASK EXECUTION. IF IAFEX FAILS TO RESPOND WITHIN
02936 M00S02874.smfex +++|* THE LIMITATIONS OF THE SPINWHEELS ROUTINE, THEN TTOTRAP
02937 M00S02875.smfex +++|* ASSUMES IT WILL BE SEVERAL SECONDS BEFORE IAFEX AND THE
02938 M00S02876.smfex +++|* NETWORK CAN ACCEPT ANY OTHER OUTPUT FOR THIS USER, AND
02939 M00S02877.smfex +++|* TTOTRAP SWAPS THE TASK OUT.
02940 M00S02878.smfex +++|*
02941 M00S02879.smfex +++|* THE SECOND BASIC VALUE FOR THE TTOTYPE PARAMETER IS
02942 M00S02880.smfex +++|* "PROMPT". THIS IS USED WHEN TTITRAP CALLS TTOTRAP.
02943 M00S02881.smfex +++|* TTOTRAP IS EXPECTED TO IMMEDIATELY TRANSMIT ANY RESIDUAL
02944 M00S02882.smfex +++|* QUEUE OF OUTPUT TEXT TO IAFEX, THEN SWAP THE TASK OUT.
02945 M00S02883.smfex +++|* TTOTRAP ASSUMES THAT THE CALLER (TTITRAP) HAS ALREADY MADE
02946 M00S02884.smfex +++|* A DETERMINATION AS TO LOW PROBABILITY OF RAPID REPLY FROM
02947 M00S02885.smfex +++|* IAFEX.
02948 M00S02886.smfex +++|*
02949 M00S02887.smfex +++|* THE THIRD AND LAST BASIC FUNCTION OF TTOTRAP IS THE "FORCE"
02950 M00S02888.smfex +++|* VALUE OF THE TTOTYPE PARAMETER. THIS IS USED BY VOLUNTEER
02951 M00S02889.smfex +++|* WHEN IT IS DETERMINED THAT SOME RESIDUAL TEXT HAS BEEN
02952 M00S02890.smfex +++|* QUEUED IN THE TASK'S OUTPUT BUFFER FOR AN EXCESSIVE REAL
02953 M00S02891.smfex +++|* TIME DELAY, AND OUGHT TO BE SENT TO THE USER'S TERMINAL.
02954 M00S02892.smfex +++|* WHEN TTOTRAP PROCESSES THE "FORCE" FUNCTION, IT TRANSMITS
02955 M00S02893.smfex +++|* THE BUFFER CONTENT TO IAF AND PROCEEDS TO SWAP THE TASK
02956 M00S02894.smfex +++|* WITHOUT ANY USAGE OF THE SPINWHEELS FUNCTION.
02957 M00S02895.smfex +++|*
02958 M00S02896.smfex +++|* WHEN TTOTRAP DECIDES TO SWAPOUT, IT MUST CALL PAUSEIO IN
02959 M00S02897.smfex +++|* THE WORKFILE MANAGER. THIS IS BECAUSE WORKIO DEALS WITH
02960 M00S02898.smfex +++|* SOME TRANSIENT RESOURCE, SUCH AS ITS CIRCULAR BUFFER, AND
02961 M00S02899.smfex +++|* NEEDS THE OPPORTUNITY TO COMPLETE ITS USAGE OF SUCH
02962 M00S02900.smfex +++|* RESOURCES.
02963 M00S02901.smfex +++|*
02964 M00S02902.smfex +++|* ENTRY TTOTYPE - FUNCTION CODE.
02965 M00S02903.smfex +++|* TTOADDR - ADDRESS OF TEXT.
02966 M00S02904.smfex +++|* TTOLEN - LENGTH OF TEXT.
02967 M00S02905.smfex +++|* TASKNXTTTO[CURTASK] - AMOUNT OF TEXT ALREADY QUEUED.
02968 M00S02906.smfex +++|* TTOBUFFER - ADDRESS OF THIS TASK'S BUFFER.
02969 M00S02907.smfex +++|* ALL SPINWHEELS PARAMETERS SETUP.
02970 M00S02908.smfex +++|*
02971 M00S02909.smfex +++|* EXIT TTOLEN - DECREMENTED.
02972 M00S02910.smfex +++|* TTOADDR - INCREMENETED.
02973 M00S02911.smfex +++|* TASKNXTTTO[CURTASK] - AMOUNT OF TEXT NOW IN BUFFER.
02974 M00S02912.smfex +++|* RUNTIME - INCREMENTED IF SWAPOUT.
02975 M00S02913.smfex +++|* ACCTOUT - INCREMENTED.
02976 M00S02914.smfex +++|*
02977 M00S02915.smfex +++|* CALLS MIN, MOVEWD, MELT, INSTRMNT1, TRANSMIT,
02978 M00S02916.smfex +++|* SPINWHEELS, CLEARQUE, PAUSEIO, ENDTRANS.
02979 M00S02917.smfex +++|*
02980 M00S02918.smfex +++|* USES TTOQUIT, TASKTYPTTO[CURTASK].
02981 M00S02919.smfex +++|#
Line S02920 Modification History |
M01 (Removed by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02982 M01S02920.smfex1 ---| ITEM TMP1, TMP2;
Line S00004 Modification History |
M01 (Added by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02983 M01S00004.smfex1 +++| ITEM TMP1 I; # TEMPORARY STORAGE #
02984 M01S00005.smfex1 +++| ITEM TMP2 I; # TEMPORARY STORAGE #
02985 M01S00006.smfex1 +++| ITEM ENDBLOCK I=O"0014 0000 0000 0000 0000"; # BLOCK TERMINATOR #
02986 M00S02921.smfex +++|
02987 M00S02922.smfex +++| TRCSTR("NTR OTRP$");
02988 M00S02923.smfex +++|
02989 M00S02924.smfex +++| IF NOT CURUSOKOUT THEN IORET # FIRST TRANS ONLY #
02990 M00S02925.smfex +++|
02991 M00S02926.smfex +++| P<MOVFROM>=TTOADDR;
02992 M00S02927.smfex +++| ACCTOUT=ACCTOUT+TTOLEN; # ACCOUNT FOR OUTPUT #
02993 M00S02928.smfex +++|
02994 M00S02929.smfex +++| TTOQUIT=FALSE;
02995 M00S02930.smfex +++| WHYLE NOT TTOQUIT DO # SEND ALL TEXT #
02996 M00S02931.smfex +++| BEGIN
Line S02932 Modification History |
M01 (Removed by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02997 M01S02932.smfex1 ---| TMP1=SIZTTOBUF-TASKNXTTTO[CURTASK]; # ROOM AVAIL #
Line S00007 Modification History |
M01 (Added by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
02998 M01S00007.smfex1 +++| TMP1=SIZTTOBUF-TASKNXTTTO[CURTASK]-1; # AVAILABLE ROOM #
02999 M00S02933.smfex +++| TMP2=MIN(TMP1,TTOLEN); # AMOUNT TO SEND #
03000 M00S02934.smfex +++| P<MOVFROM>=TTOADDR;
03001 M00S02935.smfex +++| P<MOVTO>=LOC(TTOBUFFER)+2+TASKNXTTTO[CURTASK];
03002 M00S02936.smfex +++| MOVEWD(TMP2,MOVFROM,MOVTO);
03003 M00S02937.smfex +++| TTOLEN=TTOLEN-TMP2;
03004 M00S02938.smfex +++| TTOADDR=TTOADDR+TMP2;
03005 M00S02939.smfex +++| TASKNXTTTO[CURTASK]=TASKNXTTTO[CURTASK]+TMP2;
03006 M00S02940.smfex +++| TASKTYPTTO[CURTASK]=0; # DETERMINE TRANSMIT #
03007 M00S02941.smfex +++| CONTROL IFGQ PARANOIA,4;
03008 M00S02942.smfex +++| IF TASKNXTTTO[CURTASK] GR SIZTTOBUF THEN MELT("TTOTRAP 1$");
03009 M00S02943.smfex +++| CONTROL FI;
03010 M00S02944.smfex +++| CONTROL IFEQ METERING,1;
Line S02945 Modification History |
M01 (Removed by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
03011 M01S02945.v23l617 ---| IF TASKNXTTTO[CURTASK] GQ SIZTTOBUF
Line S00011 Modification History |
M01 (Added by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
03012 M01S00011.v23l617 +++| IF TASKNXTTTO[CURTASK] GQ SIZTTOBUF-1
03013 M00S02946.smfex +++| THEN INSTRMNT1(INSTST"XSTTO");
03014 M00S02947.smfex +++| CONTROL FI;
03015 M00S02948.smfex +++| IF (TTOTYPE EQ TTOST"FORCE" AND TASKNXTTTO[CURTASK] NQ 0)
Line S02949 Modification History |
M01 (Removed by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
03016 M01S02949.smfex1 ---| OR TASKNXTTTO[CURTASK] GQ SIZTTOBUF
Line S00008 Modification History |
M01 (Added by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
03017 M01S00008.smfex1 +++| OR TASKNXTTTO[CURTASK] GQ (SIZTTOBUF-1)
03018 M00S02950.smfex +++| THEN TASKTYPTTO[CURTASK]=SMF2IAF"MSGOUT";
03019 M00S02951.smfex +++| IF TTOTYPE EQ TTOST"PROMPT" AND TTOLEN EQ 0
03020 M00S02952.smfex +++| THEN TASKTYPTTO[CURTASK]=SMF2IAF"PROMPT";
03021 M00S02953.smfex +++| IF TASKTYPTTO[CURTASK] NQ 0 THEN # TRANSMIT #
03022 M00S02954.smfex +++| BEGIN
Line S02955 Modification History |
M01 (Removed by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
03023 M01S02955.smfex1 ---| TRANSMIT;
Line S00009 Modification History |
M01 (Added by) | smfex1 |
Seq # *Modification Id* Act
----------------------------+
03024 M01S00009.smfex1 +++| P<MOVFROM>=LOC(ENDBLOCK); # ADD 0014 CONTROL BYTE #
03025 M01S00010.smfex1 +++| P<MOVTO>=LOC(TTOBUFFER)+2+TASKNXTTTO[CURTASK];
03026 M01S00011.smfex1 +++| MOVEWD(1,MOVFROM,MOVTO);
03027 M01S00012.smfex1 +++| TASKNXTTTO[CURTASK]=TASKNXTTTO[CURTASK]+1;
03028 M01S00013.smfex1 +++| TRANSMIT; # TRANSMIT BUFFER TO IAFEX #
03029 M00S02956.smfex +++| TASKNXTTTO[CURTASK]=0;
03030 M00S02957.smfex +++| IF TTOTYPE NQ TTOST"FORCE" AND TASKTYPTTO[CURTASK]
03031 M00S02958.smfex +++| EQ SMF2IAF"MSGOUT" THEN # ATTEMPT CONTINUE #
03032 M00S02959.smfex +++| BEGIN
03033 M00S02960.smfex +++| SPINWHEELS; # LOOK FOR QUICK ACKNOWLEGE #
03034 M00S02961.smfex +++| IF TASKREQUE[CURTASK] THEN # CAN CONTINUE #
03035 M00S02962.smfex +++| BEGIN
03036 M00S02963.smfex +++| TRCSTR("KWIK TOCIN$");
03037 M00S02964.smfex +++| CLEARQUE; # ACKNOWLEDGE #
03038 M00S02965.smfex +++| TASKTYPTTO[CURTASK]=0; # AVOID SWAPOUT #
03039 M00S02966.smfex +++| CONTROL IFEQ METERING,1;
03040 M00S02967.smfex +++| INSTRMNT1(INSTST"KWIKTOC");
03041 M00S02968.smfex +++| CONTROL FI;
03042 M00S02969.smfex +++| END
03043 M00S02970.smfex +++| END
03044 M00S02971.smfex +++| END
03045 M00S02972.smfex +++| IF TASKTYPTTO[CURTASK] NQ 0 OR TTOTYPE NQ TTOST"NORMAL" THEN
03046 M00S02973.smfex +++| BEGIN
03047 M00S02974.smfex +++| PAUSEIO;
03048 M00S02975.smfex +++| RUNTIME=RUNTIME+TIMEOFDAY-TASKTIME[CURTASK];
03049 M00S02976.smfex +++| ENDTRANS;
03050 M00S02977.smfex +++| END
03051 M00S02978.smfex +++| IF TTOLEN LQ 0 THEN TTOQUIT=TRUE;
03052 M00S02979.smfex +++| END
03053 M00S02980.smfex +++|
03054 M00S02981.smfex +++| IOEND # OF TTOTRAP #
03055 M00S02982.smfex +++|PAGE # SWAPPING ROUTINE #
03056 M00S02983.smfex +++|
03057 M00S02984.smfex +++|
03058 M00S02985.smfex +++|PROC SWAP;
03059 M00S02986.smfex +++| IOBEGIN(SWAP)
03060 M00S02987.smfex +++|#
03061 M00S02988.smfex +++|** SWAP - SWAP THIS TASK IN OR OUT.
03062 M00S02989.smfex +++|*
03063 M00S02990.smfex +++|* THE SWAP ROUTINE READS OR WRITE THE SWAP PAGE FOR THE
03064 M00S02991.smfex +++|* CURRENTLY EXECUTING TASK. FOR A SWAPIN, WE READ THE PAGE
03065 M00S02992.smfex +++|* ALREADY ASSIGNED TO THE USER. FOR A SWAPOUT, WE ASSIGN A
03066 M00S02993.smfex +++|* PAGE. THE FIRST PRIORITY IN PAGE SELECTION IS EXTENDED
03067 M00S02994.smfex +++|* MEMORY IF AVAILABLE, HEALTHY, AND NOT YET FILLED UP. THE
03068 M00S02995.smfex +++|* LOWER PRIORITY IS TO SELECT A DISK PAGE. DISK PAGES ARE
03069 M00S02996.smfex +++|* PHASED OR INTERLEAVED ROUND-ROBIN ACROSS THE SEVERAL SWAP
03070 M00S02997.smfex +++|* DATABASES.
03071 M00S02998.smfex +++|*
03072 M00S02999.smfex +++|* THE SWAP ROUTINE CAN RECOVER FROM A PARITY ERROR IN AN
03073 M00S03000.smfex +++|* EXTENDED MEMORY TRANSFER, BUT DOES NOT ATTEMPT TO HANDLE
03074 M00S03001.smfex +++|* DEVICE ERRORS ON DISKS. WHEN AN ERROR IS DETECTED FROM
03075 M00S03002.smfex +++|* EXTENDED MEMORY, A USER BEING SWAPPED IN WILL HAVE HIS TASK
03076 M00S03003.smfex +++|* ABORTED, WHILE A USER BEING SWAPPED IS UNHARMED. ERROR
03077 M00S03004.smfex +++|* RECOVERY INCLUDES THE FAULT-OUT OF THE BAD PAGE,
03078 M00S03005.smfex +++|* DETERMINATION WHETHER THE ENTIRE EXTENDED MEMORY FIELD
03079 M00S03006.smfex +++|* LENGTH SHOULD BE ABANDONED DUE TO WIDESPREAD ERRORS, AND
03080 M00S03007.smfex +++|* FOR SWAPOUT WE ALSO ALLOCATE ANOTHER PAGE AND TRY THE SWAP
03081 M00S03008.smfex +++|* AGAIN.
03082 M00S03009.smfex +++|*
03083 M00S03010.smfex +++|* WHILE SWAP IS EXECUTING, THE DISPATCHING AREA IN THE COMMON
03084 M00S03011.smfex +++|* BLOCK IS CONSIDERED TO BE IRRELEVANT. THEREFORE, THE
03085 M00S03012.smfex +++|* ROUTINE WHICH MANAGES THE BRUTE-FORCE SHUFFLING OF THE
03086 M00S03013.smfex +++|* COMMON BLOCK (SUBROUTINE GETCOMON) NEEDS TO KNOW WHEN
03087 M00S03014.smfex +++|* SWAPPING IS IN EFFECT. THIS SWAP ROUTINE IS THUS REQUIRED
03088 M00S03015.smfex +++|* TO TURN THE TASKSWPNOW FLAG ON AT ENTRY TIME AND TO TURN IT
03089 M00S03016.smfex +++|* OFF AT EXIT TIME. NO REENTRANT EVENTS CAN OCCUR BETWEEN
03090 M00S03017.smfex +++|* THE ACTUAL ENTRY OR EXIT AND THE SETTING OF THE TASKSWPNOW
03091 M00S03018.smfex +++|* FLAG.
03092 M00S03019.smfex +++|*
03093 M00S03020.smfex +++|* ENTRY TASKSWPIN[CURTASK] - DIRECTION OF SWAP.
03094 M00S03021.smfex +++|* TIMEOFDAY - CURRENT.
03095 M00S03022.smfex +++|* SWAPBITS - ALLOCATION BITMASK.
03096 M00S03023.smfex +++|* P<SWAPMASK> - ENABLES/DISABLES EXTENDED MEMORY PAGES.
03097 M00S03024.smfex +++|* CURUSSWPPAG - USERS PAGE FOR SWAPIN.
03098 M00S03025.smfex +++|* TASKADDR[CURTASK] - MEMORY ADDRESS FOR SWAP PAGE.
03099 M00S03026.smfex +++|* SWAPLEN - LENGTH OF A PAGE IN WORDS.
03100 M00S03027.smfex +++|* SWAPPRUS - LENGTH OF A PAGE IN SECTORS.
03101 M00S03028.smfex +++|* ECSERRORS - PREVIOUS EXTENDED MEMORY ERRORS.
03102 M00S03029.smfex +++|* SWPFETDONE[ALL] - INTERLOCKS ON DISK FILES.
03103 M00S03030.smfex +++|* SWPFET[ALL] - THE DISK FET'S.
03104 M00S03031.smfex +++|* MAXSWPPAG - HIGHEST DISK PAGE CREATED TO DATE.
03105 M00S03032.smfex +++|*
03106 M00S03033.smfex +++|* EXIT TIMEOFDAY - CURRENT.
03107 M00S03034.smfex +++|* SWAPBITS - UPDATED.
03108 M00S03035.smfex +++|* SWAPGOOD - EXTENDED MEMORY ERRORS FAULTED HERE.
03109 M00S03036.smfex +++|* ECSERRORS - INCREMENTED IF ERRORS.
03110 M00S03037.smfex +++|* MAXSWPPAG - INCREMENTED IF HIGHWATERMARK RAISED.
03111 M00S03038.smfex +++|* TASKTIME[CURTASK] - TIMEOFDAY.
03112 M00S03039.smfex +++|* STATUSMSG - MAY CONTAIN ERROR MSG.
03113 M00S03040.smfex +++|* CURUSSWPPAG - PAGE SELECTED FOR SWAPOUT.
03114 M00S03041.smfex +++|* CURUSVICTIM - TRUE IF ECS PARITY ERROR ON SWAPIN.
03115 M00S03042.smfex +++|*
03116 M00S03043.smfex +++|* CALLS ALLOC, MELT, INSTRMNT1, READECS, WRITECS,
03117 M00S03044.smfex +++|* FORCEALLOC, SMFDLY, MAKEFET, READ, WRITER, REWRITR,
03118 M00S03045.smfex +++|* SMFRCL, INSTRMNT2.
03119 M00S03046.smfex +++|*
03120 M00S03047.smfex +++|* USES TASKSWPNOW[CURTASK], TASKSWPFIL[CURTASK],
03121 M00S03048.smfex +++|* TASKSWPPRU[CURTASK], P<MOVFROM>, P<MOVTO>, SWPFET.
03122 M00S03049.smfex +++|#
03123 M00S03050.smfex +++| ITEM TMP1,TMP2;
03124 M00S03051.smfex +++|
03125 M00S03052.smfex +++| # SWAP IS REQUIRED TO SET TASKSWPNOW BEFORE ANY DELAYS OCCUR #
03126 M00S03053.smfex +++|
03127 M00S03054.smfex +++| TRCSTR("NTR SWP$");
03128 M00S03055.smfex +++| TASKSWPNOW[CURTASK]=TRUE;
03129 M00S03056.smfex +++| TASKTIME[CURTASK]=TIMEOFDAY;
03130 M00S03057.smfex +++|
03131 M00S03058.smfex +++|SWAPSTART:
03132 M00S03059.smfex +++|
03133 M00S03060.smfex +++| IF NOT TASKSWPIN[CURTASK] THEN # ALLOC PAGE #
03134 M00S03061.smfex +++| BEGIN
03135 M00S03062.smfex +++| ALLOC(SWAPBITS,SWAPMASK,TMP1,NUMSWPBIT);
03136 M00S03063.smfex +++| IF TMP1 EQ 0 THEN MELT("SWPO 2$");
03137 M00S03064.smfex +++| CURUSSWPPAG=TMP1; # SAVE INVIOLATE #
03138 M00S03065.smfex +++| END
03139 M00S03066.smfex +++|
03140 M00S03067.smfex +++| TRCBOTH("PAGE$",CURUSSWPPAG);
03141 M00S03068.smfex +++|
03142 M00S03069.smfex +++| IF CURUSSWPPAG LQ NUMSWPECS THEN # ECS SWAP #
03143 M00S03070.smfex +++| BEGIN
03144 M00S03071.smfex +++| TRCSTR("SWPECS$");
03145 M00S03072.smfex +++| CONTROL IFEQ ECSCODE,0;
03146 M00S03073.smfex +++| CONTROL IFGQ PARANOIA,1;
03147 M00S03074.smfex +++| MELT("SWP 3$");
03148 M00S03075.smfex +++| CONTROL FI;
03149 M00S03076.smfex +++| CONTROL FI;
03150 M00S03077.smfex +++| CONTROL IFEQ ECSCODE,1;
03151 M00S03078.smfex +++| CONTROL IFEQ METERING,1;
03152 M00S03079.smfex +++| INSTRMNT1(INSTST"SWPE");
03153 M00S03080.smfex +++| CONTROL FI;
03154 M00S03081.smfex +++| P<MOVFROM>=TASKADDR[CURTASK];
03155 M00S03082.smfex +++| P<MOVTO>=(CURUSSWPPAG-1)*SWAPLEN;
03156 M00S03083.smfex +++| IF TASKSWPIN[CURTASK] THEN READECS(SWAPLEN,MOVTO,MOVFROM,TMP1);
03157 M00S03084.smfex +++| ELSE WRITECS(SWAPLEN,MOVFROM,MOVTO,TMP1);
03158 M00S03085.smfex +++| CONTROL IFGQ ECSERRMAX,0;
03159 M00S03086.smfex +++| IF TMP1 NQ 0 THEN # ECS ERROR, RETRY OR KILL #
03160 M00S03087.smfex +++| BEGIN
03161 M00S03088.smfex +++| ECSERRORS=ECSERRORS+TMP1;
03162 M00S03089.smfex +++| IF ECSERRORS GQ ECSERRMAX THEN
03163 M00S03090.smfex +++| BEGIN
03164 M00S03091.smfex +++| ECSDOWN=TRUE;
03165 M00S03092.smfex +++| C<22,6>STATUSMSG="EM OFF";
03166 M00S03093.smfex +++| END
03167 M00S03094.smfex +++| # FAULT OUT THIS PAGE TO PROTECT FUTURE USERS #
03168 M00S03095.smfex +++| FORCEALLOC(SWAPGOOD,CURUSSWPPAG,NUMSWPBIT);
03169 M00S03096.smfex +++| IF TMP1 GQ 3 AND TASKSWPIN[CURTASK] THEN CURUSVICTIM=TRUE;
03170 M00S03097.smfex +++| IF NOT TASKSWPIN[CURTASK] THEN GOTO SWAPSTART;
03171 M00S03098.smfex +++| END
03172 M00S03099.smfex +++| CONTROL FI;
03173 M00S03100.smfex +++| CONTROL IFLS ECSERRMAX,0;
03174 M00S03101.smfex +++| IF TMP1 NQ 0 THEN MELT("ECS HARDWARE$");
03175 M00S03102.smfex +++| CONTROL FI;
03176 M00S03103.smfex +++| CONTROL FI;
03177 M00S03104.smfex +++| END
03178 M00S03105.smfex +++| ELSE # DISK SWAPPING #
03179 M00S03106.smfex +++| BEGIN
03180 M00S03107.smfex +++| TASKSWPFIL[CURTASK]=1+MOD(CURUSSWPPAG-1-NUMSWPECS,NUMSWPFET);
03181 M00S03108.smfex +++| TASKSWPPRU[CURTASK]=1+(CURUSSWPPAG-1-NUMSWPECS)/NUMSWPFET*SWAPPRUS;
03182 M00S03109.smfex +++| TRCBOTH("SWPDSK$",TASKSWPFIL[CURTASK]);
03183 M00S03110.smfex +++| TRCDEC(TASKSWPPRU[CURTASK]);
03184 M00S03111.smfex +++| CONTROL IFEQ METERING,1;
03185 M00S03112.smfex +++| INSTRMNT1(INSTST"SWPD");
03186 M00S03113.smfex +++| CONTROL FI;
03187 M00S03114.smfex +++| WHYLE NOT SWPFETDONE[TASKSWPFIL[CURTASK]] DO SMFDLY;
03188 M00S03115.smfex +++| TMP1=TASKSWPFIL[CURTASK]; # VALID TILL SMFRCL #
03189 M00S03116.smfex +++| C<0,6>TMP2="SMFSWP";
03190 M00S03117.smfex +++| C<6,1>TMP2=O"33"+TMP1-1;
03191 M00S03118.smfex +++| P<ANYFET>=LOC(SWPFET[TMP1]);
03192 M00S03119.smfex +++| P<MOVFROM>=TASKADDR[CURTASK];
03193 M00S03120.smfex +++| MAKEFET(ANYFET,TMP2,MOVFROM,SWAPBUFLEN);
03194 M00S03121.smfex +++| SWPFETR[TMP1]=TRUE;
03195 M00S03122.smfex +++| SWPFETRR[TMP1]=TASKSWPPRU[CURTASK];
03196 M00S03123.smfex +++| IF TASKSWPIN[CURTASK] THEN READ(ANYFET,0);
03197 M00S03124.smfex +++| ELSE
03198 M00S03125.smfex +++| BEGIN
03199 M00S03126.smfex +++| SWPFETIN[TMP1]=SWPFETIN[TMP1]+SWAPLEN;
03200 M00S03127.smfex +++| IF CURUSSWPPAG GR MAXSWPPAG THEN
03201 M00S03128.smfex +++| BEGIN
03202 M00S03129.smfex +++| MAXSWPPAG=CURUSSWPPAG;
03203 M00S03130.smfex +++| SWPFETRR[TMP1]=LOC(DUMB);
03204 M00S03131.smfex +++| WRITER(ANYFET,0);
03205 M00S03132.smfex +++| END
03206 M00S03133.smfex +++| ELSE REWRITR(ANYFET,0);
03207 M00S03134.smfex +++| END
03208 M00S03135.smfex +++| SMFRCL(ANYFET);
03209 M00S03136.smfex +++| END
03210 M00S03137.smfex +++|
03211 M00S03138.smfex +++| # ONCE TASKSWPNOW IS CLEARED, SWAP CANNOT DELAY ANYMORE #
03212 M00S03139.smfex +++|
03213 M00S03140.smfex +++| TASKSWPNOW[CURTASK]=FALSE;
03214 M00S03141.smfex +++| CONTROL IFEQ METERING,1;
03215 M00S03142.smfex +++| TMP1=TIMEOFDAY-TASKTIME[CURTASK];
03216 M00S03143.smfex +++| INSTRMNT2(INSTST"SWPTIM",TMP1);
03217 M00S03144.smfex +++| CONTROL FI;
03218 M00S03145.smfex +++| TASKTIME[CURTASK]=TIMEOFDAY;
03219 M00S03146.smfex +++|
03220 M00S03147.smfex +++| IOEND # OF SWAP #
03221 M00S03148.smfex +++|PAGE # USER/SYSTEM-STATE CHANGING CODE #
03222 M00S03149.smfex +++|
03223 M00S03150.smfex +++|
03224 M00S03151.smfex +++|PROC PAUSE;
03225 M00S03152.smfex +++| IOBEGIN(PAUSE)
03226 M00S03153.smfex +++|#
03227 M00S03154.smfex +++|** PAUSE - INTERFACE TO EXECUTIVE TO START/END TIME SLICE.
03228 M00S03155.smfex +++|*
03229 M00S03156.smfex +++|* PAUSE IS THE ROUTINE USED BY USER-MODE ROUTINES TO END A
03230 M00S03157.smfex +++|* SLICE ON THE CPU, AND BY THE EXECUTIVE TO RESUME EXECUTION
03231 M00S03158.smfex +++|* WHERE THE PREVIOUS TIME SLICE ENDED. THUS, PAUSE EXITS TO
03232 M00S03159.smfex +++|* LABEL AFTERSLICE AND PROVIDES THE LABEL RESUME, WHICH
03233 M00S03160.smfex +++|* RUNJOBS WILL JUMP TO JUST IN FRONT OF THE DEFINITION OF THE
03234 M00S03161.smfex +++|* AFTERSLICE LABEL.
03235 M00S03162.smfex +++|#
03236 M00S03163.smfex +++| XDEF LABEL RESUME;
03237 M00S03164.smfex +++| XREF LABEL AFTERSLICE;
03238 M00S03165.smfex +++| GOTO AFTERSLICE;
03239 M00S03166.smfex +++|
03240 M00S03167.smfex +++|RESUME: # HERE FOR NEW TIMESLICE #
03241 M00S03168.smfex +++|
03242 M00S03169.smfex +++| IOEND # OF PAUSE #
03243 M00S03170.smfex +++|
03244 M00S03171.smfex +++|
03245 M00S03172.smfex +++|PROC TRANSACT;
03246 M00S03173.smfex +++| BEGIN
03247 M00S03174.smfex +++|#
03248 M00S03175.smfex +++|** TRANSACT - TRANSITION FROM EXECUTIVE TO USER FOR SWAPIN.
03249 M00S03176.smfex +++|*
03250 M00S03177.smfex +++|* TRANSACT IS USED BY THE RUNJOBS EXECUTIVE, JUST BEFORE
03251 M00S03178.smfex +++|* RUNJOBS DEFINES THE AFTERTRANS LABEL, TO SWITCH FROM
03252 M00S03179.smfex +++|* EXECUTIVE MODE TO USER MODE AND PERFORM SWAPINS. TRANSACT
03253 M00S03180.smfex +++|* THEN REPAIRS THE COMMON BLOCK DISPATCHING AREA, REPAIRS THE
03254 M00S03181.smfex +++|* RETURN JUMP WORDS IN ALL ACTIVE SUBROUTINE ENTRY POINTS,
03255 M00S03182.smfex +++|* CHECKS FOR CERTAIN INTERRUPT CONDITIONS, AND EXITS VIA A
03256 M00S03183.smfex +++|* JUMP TO THE MORETRANS LABEL IN THE ENDTRANS ROUTINE. THIS
03257 M00S03184.smfex +++|* TYPE OF EXIT IS USED BECAUSE THE TASK IS PRESUMED TO HAVE
03258 M00S03185.smfex +++|* HAVE COMPLETED ITS PREVIOUS SWAPPED-IN TRANSACTION BY
03259 M00S03186.smfex +++|* CALLING ENDTRANS, AND ENDTRANS IS RESUMED TO HAVE JUMPED TO
03260 M00S03187.smfex +++|* THE EXECUTIVE JUST IN FRONT OF THE DEFINITION OF LABEL
03261 M00S03188.smfex +++|* MORETRANS.
03262 M00S03189.smfex +++|*
03263 M00S03190.smfex +++|* ENTRY MAY BE CALLED ONLY BY RUNJOBS TRANSACTION SECTION.
03264 M00S03191.smfex +++|* CURUSINTRPT - AN INTERRUPT MUST BE COMMUNICATED TO
03265 M00S03192.smfex +++|* USER-MODE CODE AFTER SWAPIN IS COMPLETE.
03266 M00S03193.smfex +++|* SHUTDOWN - CAUSES SYNTHESIS OF INTERRUPTS.
03267 M00S03194.smfex +++|* CURUSRCVRY - FSE JOB DETACHING.
03268 M00S03195.smfex +++|* RSTKPTR - SIZE OF REENTRANCY STACK.
03269 M00S03196.smfex +++|*
03270 M00S03197.smfex +++|* EXIT VIA LABEL MORETRANS.
03271 M00S03198.smfex +++|* RENTSTK - REENTRANCY STACK.
03272 M00S03199.smfex +++|* COMMON BLOCK AND SUBROUTINE ENTRIES REBUILT.
03273 M00S03200.smfex +++|* USRBRK - 1 IF ANY INTERRUPT PASSED TO USER.
03274 M00S03201.smfex +++|* CURUSVICTIM - TRUE IF SWAPIN RUINED USER DATA.
03275 M00S03202.smfex +++|* FORCESINGLE, FORCENULL - ADDITIONAL INTERRUPTS.
03276 M00S03203.smfex +++|* WORKFILE CHECKPOINTED AND EXIT VIA LABEL AFTEREDIT
03277 M00S03204.smfex +++|* IF CURUSRCVRY IS ON.
03278 M00S03205.smfex +++|*
03279 M00S03206.smfex +++|* CALLS SWAP, DEALLOC, GETCOMMON, CHECKIO, MOVEWD, SPREAD.
03280 M00S03207.smfex +++|*
03281 M00S03208.smfex +++|* USES SWAPRSTK, TASKSWPIN[CURTASK].
03282 M00S03209.smfex +++|#
03283 M00S03210.smfex +++| XREF LABEL AFTEREDIT;
03284 M00S03211.smfex +++| XREF LABEL AFTERTRANS;
03285 M00S03212.smfex +++| XREF LABEL MORETRANS;
03286 M00S03213.smfex +++|
03287 M00S03214.smfex +++| TRCSTR("NTR TRNSCT$");
03288 M00S03215.smfex +++| TASKSWPIN[CURTASK]=TRUE;
03289 M00S03216.smfex +++|
03290 M00S03217.smfex +++| SWAP;
03291 M00S03218.smfex +++| # ONCE SWAP RETURNS, WE CANNOT REENTER UNTIL AFTER GETCOMMON #
03292 M00S03219.smfex +++| IF SHUTDOWN NQ 2 THEN DEALLOC(SWAPBITS,CURUSSWPPAG,NUMSWPBIT);
03293 M00S03220.smfex +++| CURUSSWPPAG=0;
03294 M00S03221.smfex +++| LASTTASK=0; # RECONSTRUCT COMMON AFTER SWAP #
03295 M00S03222.smfex +++| GETCOMMON;
03296 M00S03223.smfex +++| # END OF TIME-CRITICAL SEQUENCE #
03297 M00S03224.smfex +++|
03298 M00S03225.smfex +++| IF CURUSINTRPT THEN USRBRK=1;
03299 M00S03226.smfex +++| IF CURUSVICTIM THEN
03300 M00S03227.smfex +++| BEGIN
03301 M00S03228.smfex +++| SMFVICTIM=TRUE;
03302 M00S03229.smfex +++| ERRSTRING="ECS HARDWARE$";
03303 M00S03230.smfex +++| END
03304 M00S03231.smfex +++| IF SHUTDOWN NQ 0 THEN FORCESINGLE=TRUE;
03305 M00S03232.smfex +++| IF SHUTDOWN GR 1 THEN
03306 M00S03233.smfex +++| BEGIN
03307 M00S03234.smfex +++| CURUSINTRPT=TRUE;
03308 M00S03235.smfex +++| USRBRK=1;
03309 M00S03236.smfex +++| FORCENULL=TRUE;
03310 M00S03237.smfex +++| END
03311 M00S03238.smfex +++| IF CURUSRCVRY THEN # CHKPT AND END EDIT #
03312 M00S03239.smfex +++| BEGIN
03313 M00S03240.smfex +++| FORCENULL=TRUE;
Line S03241 Modification History |
M01 (Removed by) | ns2136 |
Seq # *Modification Id* Act
----------------------------+
03314 M01S03241.ns2136 ---| #VFYWRKFIL#
Line S00005 Modification History |
M01 (Added by) | ns2136 |
M02 (Removed by) | ns2186 |
Seq # *Modification Id* Act
----------------------------+
03315 M02S00005.ns2186 ---| IF NOT CURUSDROP THEN USRBRK=0;
Line S00007 Modification History |
M01 (Added by) | ns2186 |
Seq # *Modification Id* Act
----------------------------+
03316 M01S00007.ns2186 +++| IF SHUTDOWN EQ 2 THEN
03317 M01S00008.ns2186 +++| BEGIN
03318 M01S00009.ns2186 +++| USRBRK=0;
03319 M01S00010.ns2186 +++| CURUSINTRPT=FALSE;
03320 M01S00011.ns2186 +++| END
Line S03242 Modification History |
M01 (Removed by) | smfex2 |
Seq # *Modification Id* Act
----------------------------+
03321 M01S03242.smfex2 ---| CHECKIO;
Line S00001 Modification History |
M01 (Added by) | smfex2 |
Seq # *Modification Id* Act
----------------------------+
03322 M01S00001.smfex2 +++| IF NOT CURUSDONE THEN
03323 M01S00002.smfex2 +++| BEGIN # IF WORKFILE NOT YET CHECKPOINTED #
03324 M01S00003.smfex2 +++| CHECKIO; # CHECKPOINT WORKFILE #
03325 M01S00004.smfex2 +++| END
03326 M00S03243.smfex +++| GOTO AFTEREDIT;
03327 M00S03244.smfex +++| END
03328 M00S03245.smfex +++| MOVEWD(RSTKPTR-1,SWAPRSTK,RENTSTK);
03329 M00S03246.smfex +++| SPREAD(RSTKPTR,RENTSTK);
03330 M00S03247.smfex +++|
03331 M00S03248.smfex +++| # OUR RETURN GOES NOT TO CALLER BUT TO USER #
03332 M00S03249.smfex +++| GOTO MORETRANS; # LET GATHERED CODE RETURN TO USER #
03333 M00S03250.smfex +++|
03334 M00S03251.smfex +++| END # OF TRANSACT #
03335 M00S03252.smfex +++|
03336 M00S03253.smfex +++|
03337 M00S03254.smfex +++|PROC ENDTRANS;
03338 M00S03255.smfex +++| IOBEGIN(ENDTRANS)
03339 M00S03256.smfex +++|#
03340 M00S03257.smfex +++|** ENDTRANS - END A TRANSACTION WITH SWAPOUT.
03341 M00S03258.smfex +++|*
03342 M00S03259.smfex +++|* ENDTRANS IS CALLED ONLY BY TTOTRAP, FOR THE PURPOSE OF
03343 M00S03260.smfex +++|* SWAPPING THE CURRENT TASK OUT. ENDTRANS CONSOLIDATES DATA
03344 M00S03261.smfex +++|* FROM SUBROUTINE ENTRY POINTS AND FROM THE DISPATCHABLE
03345 M00S03262.smfex +++|* COMMON BLOCK, THEN SWAPS THE MEMORY IMAGE OUT. ENDTRANS
03346 M00S03263.smfex +++|* THEN EXITS BY JUMPING TO LABEL AFTERTRANS IN THE RUNJOBS
03347 M00S03264.smfex +++|* EXECUTIVE. ENDTRANS PROVIDES THE DEFINITION OF LABEL
03348 M00S03265.smfex +++|* MORETRANS SO THAT WHEN RUNJOBS CALLS TRANSACT TO SWAP THIS
03349 M00S03266.smfex +++|* USER BACK IN, TRANSACT CAN JUMP TO THE ADDRESS AT WHICH THE
03350 M00S03267.smfex +++|* TASK HAD FORFEITED CONTROL.
03351 M00S03268.smfex +++|*
03352 M00S03269.smfex +++|* ENDTRANS IS ALLOWED TO BE CALLED ONLY BY TTOTRAP BECAUSE
03353 M00S03270.smfex +++|* THE TASK CANNOT SWAPOUT WITH ANY RESIDUAL OUTPUT LEFT IN
03354 M00S03271.smfex +++|* THE BUFFER OWNED BY THE TASK.
03355 M00S03272.smfex +++|*
03356 M00S03273.smfex +++|* ENTRY ONLY FROM TTOTRAP.
03357 M00S03274.smfex +++|* RSTKPTR - DEPTH OF REENTRANCY STACK.
03358 M00S03275.smfex +++|* RENTSTK - THE REENTRANCY STACK.
03359 M00S03276.smfex +++|*
03360 M00S03277.smfex +++|* EXIT VIA LABEL AFTERTRANS.
03361 M00S03278.smfex +++|*
03362 M00S03279.smfex +++|* CALLS GATHER, MOVEWD, PUTCOMMON, SWAP, MELT.
03363 M00S03280.smfex +++|*
03364 M00S03281.smfex +++|* USES SWAPRSTK, TASKSWPIN[CURTASK].
03365 M00S03282.smfex +++|#
03366 M00S03283.smfex +++| XREF LABEL AFTERTRANS;
03367 M00S03284.smfex +++| XDEF LABEL MORETRANS;
03368 M00S03285.smfex +++|
03369 M00S03286.smfex +++| TRCSTR("NTR NDTRNS$");
03370 M00S03287.smfex +++| GATHER(RSTKPTR,RENTSTK);
03371 M00S03288.smfex +++| MOVEWD(RSTKPTR-1,RENTSTK,SWAPRSTK);
03372 M00S03289.smfex +++|
03373 M00S03290.smfex +++| # MUST EXECUTE INSTANTLY FROM PUTCOMMON INTO START OF SWAP #
03374 M00S03291.smfex +++| PUTCOMMON; # MAKE COMMON SWAPPABLE #
03375 M00S03292.smfex +++| TASKSWPIN[CURTASK]=FALSE;
03376 M00S03293.smfex +++| SWAP;
03377 M00S03294.smfex +++| # END OF TIME-CRITICAL SEQUENCE #
03378 M00S03295.smfex +++|
03379 M00S03296.smfex +++| CONTROL IFGQ PARANOIA,3;
03380 M00S03297.smfex +++| IF TASKNXTTTO[CURTASK] NQ 0 THEN MELT("NTRNS 2$");
03381 M00S03298.smfex +++| CONTROL FI;
03382 M00S03299.smfex +++| GOTO AFTERTRANS;
03383 M00S03300.smfex +++|
03384 M00S03301.smfex +++| # RETURN GOES BACK TO USER #
03385 M00S03302.smfex +++|MORETRANS:
03386 M00S03303.smfex +++|
03387 M00S03304.smfex +++| IOEND # OF ENDTRANS #
03388 M00S03305.smfex +++|PAGE # INITIALIZATION AND TERMINATION #
03389 M00S03306.smfex +++|
03390 M00S03307.smfex +++|
03391 M00S03308.smfex +++|PROC INITMON;
03392 M00S03309.smfex +++| BEGIN
03393 M00S03310.smfex +++|#
03394 M00S03311.smfex +++|** INITMON - INITIALIZE SMFEX.
03395 M00S03312.smfex +++|*
03396 M00S03313.smfex +++|* INITMON IS THE PRESET ROUTINE FOR SMFEX. THE FOLLOWING
03397 M00S03314.smfex +++|* FUNCTIONS ARE PERFORMED --
03398 M00S03315.smfex +++|*
03399 M00S03316.smfex +++|* THE PARAMETERS CRACKED BY THE OPERATING SYSTEM AT RA+2 ARE
03400 M00S03317.smfex +++|* CHECKED FOR RECOVERY MODE OR FOR A NUMBER OF TASKS TO BE
03401 M00S03318.smfex +++|* FORMATTED. THE SHUTDOWN FLAG IS SET FOR RECOVERY MODE, AND
03402 M00S03319.smfex +++|* THE TASKSAVAIL FLAG IS SET AND FORCED WITHIN REASONABLE
03403 M00S03320.smfex +++|* BOUNDS FOR A NUMERIC PARAMETER.
03404 M00S03321.smfex +++|*
03405 M00S03322.smfex +++|* MISCELLANEOUS POINTERS AND LENGTH FIELDS ARE COMPUTED. THE
03406 M00S03323.smfex +++|* FIELD LENGTH IS THEN INCREASED TO MAKE ROOM FOR THE MODEL
03407 M00S03324.smfex +++|* FORMAT OF THE COMMON BLOCK. THE FIELD LENGTH IS INCREASED
03408 M00S03325.smfex +++|* TO ALLOCATE THE TERMINAL INPUT BUFFERS. THE BITMAPS USED
03409 M00S03326.smfex +++|* FOR ALLOCATION OF SMFEX RESOURCES ARE INITIALIZED. THEN
03410 M00S03327.smfex +++|* EACH TASK IS BUILT OUT OF INCREASED FIELD LENGTH.
03411 M00S03328.smfex +++|*
03412 M00S03329.smfex +++|* TASK CONSTRUCTION IS DELEGATED TO THE BUILDTASK ROUTINE.
03413 M00S03330.smfex +++|* THE COMMON BLOCK IS USED TO CONSTRUCT THIS TASK'S POINTERS
03414 M00S03331.smfex +++|* FOR A NUMBER OF PER-TASK ARRAYS. THEN COMMON BLOCK IS THEN
03415 M00S03332.smfex +++|* COPIED INTO THE EXTENDED FIELD LENGTH SO EACH TASK CAN
03416 M00S03333.smfex +++|* CONTAIN ITS OWN BASE ADDRESSES FOR ARRAYS.
03417 M00S03334.smfex +++|*
03418 M00S03335.smfex +++|* THE EXTENDED MEMORY FIELD LENGTH IS DETERMINED BY SEEING
03419 M00S03336.smfex +++|* HOW MUCH MEMORY IS DESIRED FOR THE COMPILE-TIME
03420 M00S03337.smfex +++|* CONFIGURATION AND HOW MUCH IS ACTUALLY AVAILABLE FROM THE
03421 M00S03338.smfex +++|* RUNNING SYSTEM. THE ALLOCATION BITMAPS ARE MODIFIED IF
03422 M00S03339.smfex +++|* NEEDED TO ALLOW FOR THE NUMBER OF ECS SWAP PAGES ACTUALLY
03423 M00S03340.smfex +++|* OBTAINED. EXTENDED MEMORY SWAPPING IS COMPLETELY DISABLED
03424 M00S03341.smfex +++|* IF THE RUNNING SYSTEM CANNOT PROVIDE ANY SECONDARY FIELD
03425 M00S03342.smfex +++|* LENGTH AT ALL.
03426 M00S03343.smfex +++|*
03427 M00S03344.smfex +++|* FOR SUBSYSTEM RECOVERY, A SHORTENED INITMON ALGORITHM TAKES
03428 M00S03345.smfex +++|* EFFECT. WE ASSUME THE PREVIOUS SMFEX JOB STEP EXECUTED AN
03429 M00S03346.smfex +++|* IDENTICAL VERSION OF THIS PROGRAM (I.E., SMFEX HAS NOT BEEN
03430 M00S03347.smfex +++|* SYSEDITED WHILE RUNNING) AND THAT THE TERMINATION OF THE
03431 M00S03348.smfex +++|* PREVIOUS SMFEX JOB STEP EXITED INTO A "DMB" FORMAT DUMP
03432 M00S03349.smfex +++|* FILE. THE DUMP FILE IS SCANNED TO OBTAIN THE USER TABLE.
03433 M00S03350.smfex +++|* WE CHECK ALL USER TABLE ENTRIES FOR RECOVERABLE TASKS AND
03434 M00S03351.smfex +++|* QUEUE THOSE USERS FOR SWAPIN. RECOVERABLE TASKS ARE THOSE
03435 M00S03352.smfex +++|* WHICH EXIST ON A SWAP PAGE BUT NOT IN MEMORY. FOR
03436 M00S03353.smfex +++|* SUBSYSTEM RECOVERY, THE INITMON ALGORITHM TERMINATES AT
03437 M00S03354.smfex +++|* THIS POINT IN THE FLOW.
03438 M00S03355.smfex +++|*
03439 M00S03356.smfex +++|* FOR TRUE SUBSYSTEM INITIATION, THE REMAINDER OF THE INITMON
03440 M00S03357.smfex +++|* ALGORITHM IS AS FOLLOWS --
03441 M00S03358.smfex +++|*
03442 M00S03359.smfex +++|* ALL DISK SWAP FILES ARE EVICTED.
03443 M00S03360.smfex +++|*
03444 M00S03361.smfex +++|* THE NEGATIVE FIELD LENGTH IS BOOSTED TO ITS ANTICIPATED
03445 M00S03362.smfex +++|* HIGH WATER MARK BY ALLOCATING THEN RETURNING A LARGE GROUP
03446 M00S03363.smfex +++|* OF TOKEN FILES. THIS IS DONE BECAUSE THE TLX PP ROUTINE
03447 M00S03364.smfex +++|* WHICH TRANSITIONS USERS FROM SINGLE USER MODE TO MULTI USER
03448 M00S03365.smfex +++|* MODE IS UNABLE TO INCREASE OUR NEGATIVE FIELD LENGTH TO
03449 M00S03366.smfex +++|* MAKE ROOM FOR LOCAL FNT'S FOR THE TRANSFERRED WORKFILES.
03450 M00S03367.smfex +++|* TLX TREATS OUR PRE-ALLOCATED NEGATIVE FIELD LENGTH AS A
03451 M00S03368.smfex +++|* LIMITATION AS TO WHETHER A PARTICULAR SINGLE USER EDITOR
03452 M00S03369.smfex +++|* JOB WILL BE ACCEPTED INTO MULTI USER MODE.
03453 M00S03370.smfex +++|*
03454 M00S03371.smfex +++|* FINALLY, COMMUNICATIONS ARE ESTABLISHED WITH IAFEX VIA THE
03455 M00S03372.smfex +++|* SCP/UCP FACILITY. SMFEX IS THE UCP AND IAFEX IS THE SCP.
03456 M00S03373.smfex +++|#
03457 M00S03374.smfex +++| ITEM TMP1,TMP2,TMP3,TMP4;
03458 M00S03375.smfex +++|
03459 M00S03376.smfex +++| P<CORE>=0;
Line S00001 Modification History |
M01 (Added by) | ns2167 |
Seq # *Modification Id* Act
----------------------------+
03460 M01S00001.ns2167 +++| IF B<00,01>MEM[CSMR] EQ 0 THEN # IF SYSTEM CHARACTER SET = 63 #
03461 M01S00002.ns2167 +++| BEGIN
03462 M01S00003.ns2167 +++| XLTINTXP[O"00"]=O"4045"; # COLON = PERCENT #
03463 M01S00004.ns2167 +++| XLTINTXP[O"63"]=O"4072"; # PERCENT = COLON #
03464 M01S00005.ns2167 +++| XLTDSPXP[O"00"]=O"4045"; # COLON = PERCENT #
03465 M01S00006.ns2167 +++| XLTDSPXP[O"63"]=O"4072"; # PERCENT = COLON #
03466 M01S00007.ns2167 +++| XLTDSPINT[O"00"]=O"0063"; # COLON = PERCENT #
03467 M01S00008.ns2167 +++| XLTDSPINT[O"63"]=O"0000"; # PERCENT = COLON #
03468 M01S00009.ns2167 +++| XLTXPINT[O"45"]=O"0000"; # PERCENT = COLON #
03469 M01S00010.ns2167 +++| XLTXPINT[O"72"]=O"0063"; # COLON = PERCENT #
03470 M01S00011.ns2167 +++| XLTINTDSP[O"00"]=O"0055"; # COLON = BLANK #
03471 M01S00012.ns2167 +++| END
03472 M00S03377.smfex +++|
03473 M00S03378.smfex +++| SFMCSTF;
03474 M00S03379.smfex +++|
03475 M00S03380.smfex +++| IF C<0,7>MEM[2] EQ "RECOVER" THEN SHUTDOWN=2;
03476 M00S03381.smfex +++| ELSE
03477 M00S03382.smfex +++| BEGIN
03478 M00S03383.smfex +++| TMP1=0;
03479 M00S03384.smfex +++| TMP2=0;
03480 M00S03385.smfex +++| TMP3=C<0,1>MEM[2]-O"33";
03481 M00S03386.smfex +++| WHYLE TMP2 LQ 6 AND TMP3 GQ 0 AND TMP3 LQ 9 DO
03482 M00S03387.smfex +++| BEGIN
03483 M00S03388.smfex +++| TMP1=TMP1*10+TMP3;
03484 M00S03389.smfex +++| TMP2=TMP2+1;
03485 M00S03390.smfex +++| TMP3=C<TMP2,1>MEM[2]-O"33";
03486 M00S03391.smfex +++| END
Line S03392 Modification History |
M01 (Removed by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
03487 M01S03392.v23l617 ---| TASKSAVAIL=MAX(MIN(TMP1,NUMTASKS),2);
Line S00012 Modification History |
M01 (Added by) | v23l617 |
Seq # *Modification Id* Act
----------------------------+
03488 M01S00012.v23l617 +++| IF TMP1 GQ 2 AND TMP1 LQ NUMTASKS THEN TASKSAVAIL=TMP1;
03489 M00S03393.smfex +++| END
03490 M00S03394.smfex +++|
03491 M00S03395.smfex +++| P<SWAPMASK>=LOC(SWAPGOOD);
03492 M00S03396.smfex +++| SWAPLEN=LOC(SWAPEND)-LOC(DATASTART);
03493 M00S03397.smfex +++| DISPATLEN=LOC(DISPATEND)-LOC(DATASTART);
03494 M00S03398.smfex +++| FIELDLEN=B<42,18>MEM[O"65"];
03495 M00S03399.smfex +++| MODELPTR=FIELDLEN;
03496 M00S03400.smfex +++| MODELLEN=LOC(SWAPEND)-LOC(DATAEND);
03497 M00S03401.smfex +++| FIELDLEN=MODELPTR+MODELLEN;
03498 M00S03402.smfex +++| FLDLEN(FIELDLEN+4);
03499 M00S03403.smfex +++| P<MOVTO>=MODELPTR;
03500 M00S03404.smfex +++| MOVEWD(MODELLEN,DATAEND,MOVTO);
03501 M00S03405.smfex +++| FOR TMP3=1 STEP 1 UNTIL NUMTTIBUF DO
03502 M00S03406.smfex +++| BEGIN
03503 M00S03407.smfex +++| TTIBUFADDR[TMP3]=FIELDLEN;
03504 M00S03408.smfex +++| FIELDLEN=FIELDLEN+SIZTTIBUF;
03505 M00S03409.smfex +++| FLDLEN(FIELDLEN+4);
03506 M00S03410.smfex +++| END
03507 M00S03411.smfex +++| FOR TMP1=1 STEP 1 UNTIL MAXREENT DO RSTK[TMP1]=LOC(RSTK[TMP1]);
03508 M00S03412.smfex +++| INITBITMAP(SWAPBITS,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03509 M00S03413.smfex +++| INITBITMAP(TTIBITS,NUMTTIBIT,NUMTTIBUF);
03510 M00S03414.smfex +++| INITBITMAP(SWAPGOOD,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03511 M00S03415.smfex +++| INITBITMAP(SWAPBAD,NUMSWPBIT,NUMSWPECS+NUMSWPDSK);
03512 M00S03416.smfex +++| INITBITMAP(TTIGOOD,NUMTTIBIT,NUMTTIBUF);
03513 M00S03417.smfex +++| KILLECSBITS(SWAPBAD);
03514 M00S03418.smfex +++| MEM[USRBASE]=LOC(USERTAB); # FOR EASY C DISPLAY #
03515 M00S03419.smfex +++| MEM[SLTBASE]=LOC(TASKTAB);
03516 M00S03420.smfex +++| CONTROL IFEQ METERING,1;
03517 M00S03421.smfex +++| MEM[STTBASE]=LOC(INSTDATA);
03518 M00S03422.smfex +++| CONTROL FI;
03519 M00S03423.smfex +++| FOR CURTASK=1 STEP 1 UNTIL TASKSAVAIL DO BUILDTASK(CURTASK);
03520 M00S03424.smfex +++| SWAPLEN=SWAPLEN+TASKDSPADR[1]-TASKADDR[1];
03521 M00S03425.smfex +++| SWAPPRUS=((SWAPLEN+O"100")/O"100");
03522 M00S03426.smfex +++| SWAPBUFLEN=1+SWAPPRUS*O"100";
03523 M00S03427.smfex +++| FLDLEN(FIELDLEN+4);
03524 M00S03428.smfex +++|
03525 M00S03429.smfex +++| CONTROL IFEQ ECSCODE,1;
03526 M00S03430.smfex +++| # REQUEST ECS FIELD LENGTH/ SEE IF IT IS THERE #
03527 M00S03431.smfex +++| GETFLCE(ECSFIELD); # GET VALIDATION LIMIT #
03528 M00S03432.smfex +++| TESTECS(TMP1); # GET EXISTENCE/ENABLED #
03529 M00S03433.smfex +++| IF B<0,12>ECSFIELD NQ 0 AND TMP1 NQ 0 THEN
03530 M00S03434.smfex +++| BEGIN
03531 M00S03435.smfex +++| # ALLOCATE DESIRED OR AVAILABLE ECS FIELD LENGTH #
03532 M00S03436.smfex +++| ECSFIELD=MIN(NUMSWPECS*SWAPLEN,512*B<0,12>ECSFIELD);
03533 M00S03437.smfex +++| FLDLENE(ECSFIELD);
03534 M00S03438.smfex +++| SETRFLE((ECSFIELD+511)/512);
03535 M00S03439.smfex +++| PROTEON; # SINCE ABORT RECOVERY ADVANCES #
03536 M00S03440.smfex +++| # TURN OFF ANY SWAP PAGES BEYOND AVAILABLE FIELD LENGTH #
03537 M00S03441.smfex +++| TMP1=ECSFIELD/SWAPLEN;
03538 M00S03442.smfex +++| FOR TMP2=TMP1+1 STEP 1 UNTIL NUMSWPECS
03539 M00S03443.smfex +++| DO FORCEALLOC(SWAPGOOD,TMP2,NUMSWPBIT);
03540 M00S03444.smfex +++| END
03541 M00S03445.smfex +++| ELSE KILLECSBITS(SWAPGOOD); # TURN OFF ALL ECS SWAP PAGES #
03542 M00S03446.smfex +++| CONTROL FI;
03543 M00S03447.smfex +++| CONTROL IFEQ ECSCODE,0;
03544 M00S03448.smfex +++| KILLECSBITS(SWAPGOOD);
03545 M00S03449.smfex +++| CONTROL FI;
03546 M00S03450.smfex +++|
03547 M00S03451.smfex +++| IF SHUTDOWN EQ 2 THEN
03548 M00S03452.smfex +++| BEGIN
03549 M00S03453.smfex +++| TERMMON; # SHUT OFF ANY INPUT #
03550 M00S03454.smfex +++| P<MOVFROM>=FIELDLEN;
03551 M00S03455.smfex +++| MAKEFET(DMBFET,"ZZZZDMB",MOVFROM,O"1001");
03552 M00S03456.smfex +++| FIELDLEN=FIELDLEN+O"1001";
03553 M00S03457.smfex +++| FLDLEN(FIELDLEN+4);
03554 M00S03458.smfex +++| REWIND(DMBFET,1);
03555 M00S03459.smfex +++| READ(DMBFET,0);
03556 M00S03460.smfex +++| TMP1=0;
03557 M00S03461.smfex +++| TMP4=0;
03558 M00S03462.smfex +++| FOR TMP2=0 STEP 1 UNTIL O"61" DO
03559 M00S03463.smfex +++| BEGIN # UNTIL RIGHT (CM) CONTROL WORD #
03560 M00S03464.smfex +++| READO(DMBFET,TMP1,TMP4); # ACCESS NEXT CONTROL WORD #
03561 M00S03465.smfex +++| IF TMP4 NQ 0 THEN MELT("RCVR 1$");
03562 M00S03466.smfex +++| END
03563 M00S03467.smfex +++| IF C<0,2>TMP1 NQ "CM" THEN MELT("RCVR 2$");
03564 M00S03468.smfex +++| FOR TMP2=1 STEP 1 UNTIL LOC(USERTAB) DO
03565 M00S03469.smfex +++| BEGIN # CONSUME LOWER FIELD LENGTH #
03566 M00S03470.smfex +++| READO(DMBFET,TMP1,TMP4);
03567 M00S03471.smfex +++| IF TMP4 NQ 0 THEN MELT("RCVR 3$");
03568 M00S03472.smfex +++| END
03569 M00S03473.smfex +++| # FINALLY READ IN THE USER TABLE #
03570 M00S03474.smfex +++| FOR TMP2=1 STEP 1 UNTIL 3*NUMSMFUSR DO
03571 M00S03475.smfex +++| BEGIN
03572 M00S03476.smfex +++| P<MOVTO>=LOC(USERTAB)+TMP2-1;
03573 M00S03477.smfex +++| READO(DMBFET,MOVTO,TMP4);
03574 M00S03478.smfex +++| IF TMP4 NQ 0 THEN MELT("RCVR 4$");
03575 M00S03479.smfex +++| END
03576 M00S03480.smfex +++| REWIND(DMBFET,1); # IN CASE TAKE ANOTHER DUMP #
03577 M00S03481.smfex +++| FOR CURUSER=1 STEP 1 UNTIL NUMSMFUSR DO
03578 M00S03482.smfex +++| BEGIN # UPDATE AND QUEUE CHECKPT #
03579 M00S03483.smfex +++| GETUSER;
03580 M00S03484.smfex +++| IF CURUSINTASK THEN CURUSDONE=TRUE;
03581 M00S03485.smfex +++| CURUSINQUE=FALSE;
03582 M00S03486.smfex +++| CURUSTTIBUF=0;
03583 M00S03487.smfex +++| CURUSQUELNK=0;
03584 M00S03488.smfex +++| CURUSINTASK=FALSE;
03585 M00S03489.smfex +++| IF CURUSLOGGED AND CURUSSWPPAG NQ 0 AND NOT CURUSDONE THEN
03586 M00S03490.smfex +++| BEGIN
03587 M00S03491.smfex +++| TRCBOTH("RECOVER$",CURUSER);
03588 M00S03492.smfex +++| CURUSRCVRY=TRUE;
03589 M00S03493.smfex +++| CURUSINTRPT=TRUE;
03590 M00S03494.smfex +++| PUTINQ;
03591 M00S03495.smfex +++| END
03592 M00S03496.smfex +++| PUTUSER;
03593 M00S03497.smfex +++| END
03594 M00S03498.smfex +++| FOR TMP1=1 STEP 1 UNTIL NUMSWPFET DO SWPFETDONE[TMP1]=TRUE;
03595 M00S03499.smfex +++| TRCSTR("END INITMON RCVR$");
03596 M00S03500.smfex +++| RETURN; # SO THAT NOTHING ELSE IS DONE #
03597 M00S03501.smfex +++| END
03598 M00S03502.smfex +++|
03599 M00S03503.smfex +++| FOR TMP1=1 STEP 1 UNTIL NUMSWPFET DO
03600 M00S03504.smfex +++| BEGIN
03601 M00S03505.smfex +++| CONTROL IFGR NUMSWPFET,8; BADSTUFF; CONTROL FI; # CODE DEPENDENT #
03602 M00S03506.smfex +++| C<0,6>TMP2="SMFSWP";
03603 M00S03507.smfex +++| C<6,1>TMP2=TMP1+O"32";
03604 M00S03508.smfex +++| P<ANYFET>=LOC(SWPFET[TMP1]);
03605 M00S03509.smfex +++| P<MOVFROM>=TASKADDR[1];
03606 M00S03510.smfex +++| MAKEFET(ANYFET,TMP2,MOVFROM,SWAPBUFLEN);
03607 M00S03511.smfex +++| READ(ANYFET,1); # ASSURE FNT ALLOCATE #
03608 M00S03512.smfex +++| EVICT(ANYFET,1); # ASSURE NO OLD DATA #
03609 M00S03513.smfex +++| END
03610 M00S03514.smfex +++|
03611 M00S03515.smfex +++|
03612 M00S03516.smfex +++| PROC GENNULL;
03613 M00S03517.smfex +++| BEGIN
03614 M00S03518.smfex +++| C<0,2>TMP2="NE";
03615 M00S03519.smfex +++| TMP3=TMP1;
03616 M00S03520.smfex +++| FOR TMP4=6 STEP -1 UNTIL 2 DO
03617 M00S03521.smfex +++| BEGIN
03618 M00S03522.smfex +++| C<TMP4,1>TMP2=O"33"+MOD(TMP3,10);
03619 M00S03523.smfex +++| TMP3=TMP3/10;
03620 M00S03524.smfex +++| END
03621 M00S03525.smfex +++| MAKEFET(NULLFET,TMP2,CORE,O"101");
03622 M00S03526.smfex +++| END # OF GENNULL #
03623 M00S03527.smfex +++|
03624 M00S03528.smfex +++|
03625 M00S03529.smfex +++| FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
03626 M00S03530.smfex +++| BEGIN # MANY NULL FILES TO ENLARGEN NFL #
03627 M00S03531.smfex +++| GENNULL;
03628 M00S03532.smfex +++| READ(NULLFET,1); # ASSURE FNT ALLOCATE #
03629 M00S03533.smfex +++| END
03630 M00S03534.smfex +++| FOR TMP1=1 STEP 1 UNTIL NUMSMFUSR DO
03631 M00S03535.smfex +++| BEGIN # THEN RELEASE THE FNT SPACE #
03632 M00S03536.smfex +++| GENNULL;
03633 M00S03537.smfex +++| RETERN(NULLFET,1);
03634 M00S03538.smfex +++| END
03635 M00S03539.smfex +++| IAFPTR=LOC(SSCINP[0]);
03636 M00S03540.smfex +++| INITSSCWORD[1]=IAFHEADER;
03637 M00S03541.smfex +++|
03638 M00S03542.smfex +++| P<SSCBUFFER>=LOC(INITSSC);
03639 M00S03543.smfex +++| SSCSTATUS=-1;
03640 M00S03544.smfex +++| # DELAY UNTIL IAF HANDSHAKE WORKS OR IDLE COMMAND DETECTED #
03641 M00S03545.smfex +++| WHYLE SSCSTATUS LAN O"7776" NQ 0 AND MEM[0] LAN O"100000" EQ 0 DO
03642 M00S03546.smfex +++| BEGIN
03643 M00S03547.smfex +++| SSCWORD=O"0000 0000 0000 0103 0000";
03644 M00S03548.smfex +++| SYSREQ("SSC",0,LOC(SSCBUFFER),IAFSSID);
03645 M00S03549.smfex +++| RECALL(0);
03646 M00S03550.smfex +++| END
03647 M00S03551.smfex +++|
03648 M00S03552.smfex +++| SFMSSTF;
03649 M00S03553.smfex +++| TRCSTR("END INITMON$");
03650 M00S03554.smfex +++|
03651 M00S03555.smfex +++| END # OF INITMON #
03652 M00S03556.smfex +++|
03653 M00S03557.smfex +++|
03654 M00S03558.smfex +++|PROC TERMMON;
03655 M00S03559.smfex +++| BEGIN
03656 M00S03560.smfex +++|#
03657 M00S03561.smfex +++|** TERMMON - TERMINATE SMFEX NORMALLY.
03658 M00S03562.smfex +++|*
03659 M00S03563.smfex +++|* CALLS SFMCSTF.
03660 M00S03564.smfex +++|#
03661 M00S03565.smfex +++| SFMCSTF;
03662 M00S03566.smfex +++| TRCSTR("COMPLETE$");
03663 M00S03567.smfex +++| TRCFRC;
03664 M00S03568.smfex +++| END # OF TERMMON #
03665 M00S03569.smfex +++|
03666 M00S03570.smfex +++|
03667 M00S03571.smfex +++|PROC MELT(STR);
03668 M00S03572.smfex +++| BEGIN
03669 M00S03573.smfex +++|#
03670 M00S03574.smfex +++|** MELT - TERMINATE SMFEX ABNORMALLY.
03671 M00S03575.smfex +++|*
03672 M00S03576.smfex +++|* ENTRY STR - ERROR MESSAGE FOR INTERNAL ABORT CONDITION.
03673 M00S03577.smfex +++|* COMPLETE - IF ALREADY SET, THEN MELT FUNCTIONS AS
03674 M00S03578.smfex +++|* AN INTERFACE TO PRODUCE A DAYFILE MESSAGE THEN
03675 M00S03579.smfex +++|* ALLOW NORMAL TERMINATION. NORMALLY, COMPLETE
03676 M00S03580.smfex +++|* IS FALSE AND MELT ABORTS THE JOB STEP.
03677 M00S03581.smfex +++|*
03678 M00S03582.smfex +++|* EXIT VIA LABELS ABORT OR ENDRUN.
03679 M00S03583.smfex +++|*
03680 M00S03584.smfex +++|* CALLS MESSAGE, TERMMON.
03681 M00S03585.smfex +++|#
03682 M00S03586.smfex +++| ITEM STR C(30);
03683 M00S03587.smfex +++| ITEM STR2 C(30);
03684 M00S03588.smfex +++| ITEM TMP1,TMP2;
03685 M00S03589.smfex +++|
03686 M00S03590.smfex +++| TRCSTR(STR);
03687 M00S03591.smfex +++| TRCFRC;
03688 M00S03592.smfex +++| STR2=STR;
03689 M00S03593.smfex +++| TMP2=0;
03690 M00S03594.smfex +++| FOR TMP1=0 STEP 1 UNTIL 29 DO
03691 M00S03595.smfex +++| BEGIN
03692 M00S03596.smfex +++| IF TMP2 EQ 0 AND C<TMP1,1>STR2 EQ "$" THEN TMP2=TMP1+1;
03693 M00S03597.smfex +++| END
03694 M00S03598.smfex +++| FOR TMP1=29 STEP -1 UNTIL TMP2 DO C<TMP1,1>STR2=0;
03695 M00S03599.smfex +++| MESSAGE(STR2,0,1);
03696 M00S03600.smfex +++| TERMMON;
03697 M00S03601.smfex +++| IF COMPLETE THEN ENDRUN;
03698 M00S03602.smfex +++| ELSE ABORT;
03699 M00S03603.smfex +++|
03700 M00S03604.smfex +++| END # OF MELT #
03701 M00S03605.smfex +++|PAGE
03702 M00S03606.smfex +++|
03703 M00S03607.smfex +++|#
03704 M00S03608.smfex +++|** SMFEX - MAIN ALGORITHM.
03705 M00S03609.smfex +++|*
03706 M00S03610.smfex +++|* THE SMFEX MAIN ALGORITHM INITIALIZES THE SUBSYSTEM, THEN
03707 M00S03611.smfex +++|* LOOPS ON THE THREE MAIN PROCESSES UNTIL A COMPLETION FLAG
03708 M00S03612.smfex +++|* IS DETECTED. THE SUBSYSTEM IS THEN TERMINATED.
03709 M00S03613.smfex +++|*
03710 M00S03614.smfex +++|* THE THREE PROCESSING PHASES PERFORM TIME-DEPENDENT FUNCTIONS,
03711 M00S03615.smfex +++|* RECEIVE AND QUEUE MESSAGES FROM IAFEX, AND EXECUTE TASKS AND
03712 M00S03616.smfex +++|* REPLY TO IAFEX.
03713 M00S03617.smfex +++|*
03714 M00S03618.smfex +++|* CALLS INITMON, DOTIMER, DOINPUT, RUNJOBS, INITMON.
03715 M00S03619.smfex +++|#
03716 M00S03620.smfex +++|ITEM TMP1;
03717 M00S03621.smfex +++|
03718 M00S03622.smfex +++|INITMON; # GET EVERYTHING SET UP #
03719 M00S03623.smfex +++|
03720 M00S03624.smfex +++|WHYLE NOT COMPLETE DO # MAIN LOOP #
03721 M00S03625.smfex +++| BEGIN
03722 M00S03626.smfex +++| DOTIMER; # RECALL CPU, HANDLE TIMER AND OPERATOR #
03723 M00S03627.smfex +++| DOINPUT; # PROCESS INPUT FROM IAFEX #
03724 M00S03628.smfex +++| RUNJOBS; # EXECUTE ANY TASKS THAT CAN #
03725 M00S03629.smfex +++| END # OF MAIN LOOP #
03726 M00S03630.smfex +++|
03727 M00S03631.smfex +++|TERMMON; # CLOSE UP SHOP #
03728 M00S03632.smfex +++|ENDRUN;
03729 M00S03633.smfex +++|
03730 M00S03634.smfex +++|
03731 M00S03635.smfex +++|END TERM