.TITLE AUTOBY .SBTTL /MRH001/ ; ; PROGRAM TO RUN EVERY 5 MINUTES TO LOG USERS OFF THE SYSTEM ; SO THAT CONNECT TIME IS A BETTER INDICATION OF ACTUAL USE BY ; MOST OF OUR USERS ; ; AT EACH CALL ; ; 1/ SCANS ATL FOR TIME-SHARING TASKS, AND ACCOUNTS THEM TO PROPER ; TERMINAL ; THUS HANDLERS, F11ACP, ETC ARE EXCLUDED ; ; ; 2/ FINDS TT1 PUD AND THEN SCANS TI PUDS FOR EACH TERMINAL ; ; A/ IF NOT HOSTILE, SKIPS IT ; ; B/ IF NOT LOGGED ON, SKIPS IT ; ; C/ IF HOSTILE AND SOMETHING RUNNING, FORGETS IT ; ; D/ IF HOSTILE AND NOTHING RUNNING, CHECKS ACTIVITY BIT ; IN TI PUD (SET EACH TIME MCR IS EVOKED) ; ; E/ IF ACTIVITY BIT IS SET, JUST CLEARS IT ; ; F/ IF ACTIVITY BIT IS CLEAR, LOGS USER OFF ; UT.HO=10 ;DEFINE "HOSTILE" TERMINAL BIT UT.AC=20 ;DEFINE ACTIVITY BIT IN TI PUD TTYNUM=46 ;OCTAL NUMBER OF TERMINALS, (NOT INCL TT0:) ; .MCALL DIR$,SPWN$,EXIT$S,WTSE$ .SBTTL COUNT ACTIVE TASKS START: MOV .CRTSK,R0 ;GET MY ATL POINTER -> R0 MOV #.ATLLH,R1 ;AND ATL LISTHEAD -> R1 MOV PS.EXP,-(SP) ;SAVE PROCESSOR STATUS WORD BIS #140,PS.EXP ;INHIBIT TASK SWITCHING 24$: MOV (R1),R1 ;START (CONTINUE) GOING THROUGH ATL CMP R1,.ATLLH+2 ;THROUGH ATL YET ? BEQ CHECK ;BR IF WE FELL THROUGH BIT #AF.IA,A.TF(R1) ;IS THIS SCHEDULER CONTROLLED TASK ? BEQ 242$ ;BRANCH IF NOT MOV A.TI(R1),R2 ;GET TI PUD IN R2 CMP U.DN(R2),#"TT ;IS IT A TERMINAL ? BNE 242$ ;IF NOT, SKIP IT MOVB U.UN(R2),R3 ;GET TI UNIT NUMBER IN R3 BEQ 242$ ;SKIP TT0 DEC R3 ;MAKE HIM A TABLE OFFSET INCB ACTIVE(R3) ;COUNT ONE TASK ACTIVE HERE 242$: BR 24$ ;CONTINUE THRU ATL CHECK: JSR PC,..ENB0 ;RE-ENABLE TASK SWITCHING .SBTTL SCAN EACH TERMINAL ; ;SCAN PUDS FOR TT1 (HE'S THE LAST ONE, NOT THE FIRST) ; CLR R5 ;USE R5 AS INDEX INTO ACTIVITY TABLE MOV .PUDBA,R1 ;START OF PUDS 300$: CMP U.DN(R1),#"TT ;IS IT TT ? BNE 301$ ;BR IF NOT CMPB U.UN(R1),#1 ;IS IT TT1 ? BEQ 303$ ;IF SO, START SCAN 301$: ADD #U.SZ,R1 ;BUMP TO NEXT PUD BR 300$ ;AND LOOK AGAIN ; ; FOUND TT1 PUD, CHECK EACH ONE ; 303$: BITB #UT.HO,U.TF(R1) ;HOSTILE TERMINAL ? BEQ 310$ ;IF NOT HOSTILE, SKIP BITB #UT.LG,U.TF(R1) ;IS IT LOGGED ON ? BEQ 310$ ;IF NOT, SKIP TSTB ACTIVE(R5) ;IS SOME TASK ACTIVE HERE ? BNE 310$ ;IF SO, SKIP IT BITB #UT.AC,U.TF(R1) ;OK, IS MCR ACTIVITY BIT SET ? BNE 305$ ;BR IF IT IS MOV A.TI(R0),-(SP) ;SAVE MY TI INDICATOR MOV R1,A.TI(R0) ;CHANGE MY TI SO BYE RUNS AT HIS TERMINAL DIR$ #SPWDPB ;EVOKE ...BYE DIR$ #WAIT ;AND WAIT FOR IT MOV (SP)+,A.TI(R0) ;RESTORE MY TI INDICATOR BR 310$ ;AND CONTINUE THE SCAN 305$: BICB #UT.AC,U.TF(R1) ;DON'T LOG OFF, JUST CLEAR MCR ACTIVITY BIT 310$: SUB #U.SZ,R1 ;BUMP R1 TO NEXT HIGHER TT PUD INC R5 ;PUSH ACTIVITY TABLE INDEX TO NEXT PUD CMP R5,#TTYNUM ;DONE ALL 36 ? BLT 303$ ;IF NOT, DO ANOTHER EXIT$S ;ELSE EXIT .SBTTL DATA AREAS ; ;TABLE OF TASK ACTIVITY BYTES ; ACTIVE: .BLKB TTYNUM ;ONE BYTE FOR EACH TERMINAL ; ;SPAWN DPB FOR ...BYE ; SPWDPB: SPWN$ ...BYE,,,1,1,5 ;SPAWN BYE UNDER 1,1 ; ;WAIT DPB FOR THE SPAWN ; WAIT: WTSE$ 5 ;WAIT FOR EVENT 5 ; .END START