.TITLE TTKGB .IDENT /V01.0/ ; EDIT # 0029 18 Mar 1981 14:03:10 DR0:[7,7]TTKGB.MAC;42 ; PREVIOUS EDIT 17 Mar 1981 16:15:58 DR0:[7,7]TTKGB.MAC;40 ; BY RAY VAN TASSLE 7 Jan 1981 ; MOTOROLA INC. ; 1301 E. ALGONGUIN RD ; SHAUMBURG, ILL ; ; (312)-576-6017 ; LOG OFF IDLE TERMINALS, DEFINED AS LOGGED IN TERMINALS WITH: ; 1) NO TASK ACTIVE ON IT FOR A PERIOD OF TIME ; 2) ALL TASKS WHICH ARE ON IT ARE WAITING FOR TERMINAL I/O ; OR ARE OUT OF MEMORY ; AND HAVE NOT DONE ANY I/O OPERATIONS FOR A WHILE ; THIS RUNS EVERY 10 SECONDS, WHICH IS THE TIME QUANTUM. ; FOR #2 ABOVE, SYSLOG TERMINAL QIO ACCOUNTING HAS TO BE ENABLED. ; AFTER STARTING IT UP, YOU CAN ABORT SYSLOG IF YOU WANT TO. ; THE ONLY THING TTKGB NEEDS IS FOR THE QIO COUNT TO BE DIFFERENT ; WHENEVER THE TASK ISSUES QIO'S .IFNDF D$$H11&D$$J11&D$$M11&D$$ZMD&D$$Z11 U.PRV1=U.CW3 ; FOR SYSTEMS WITH ONLY DL11'S .IFF .IFNDF M$$CLI ; IF NO SUPPORT FOR MULTIPLE CLI'S U.PRV1=U.LUIC-2 ; FOR SYSTEMS WITH MULTIPLEXERS .ENDC ; END CONDITIONAL - M$$CLI .IFDF M$$CLI ; IF SUPPORT FOR MULTIPLE CLI'S U.PRV1=U.CLI-2 ; THEN U.PRV1 SITS ABOVE IT .ENDC ; END CONDITIONAL - M$$CLI .ENDC ; END - D$$H11..ETC .IF DF M$$MUP ; MULTI USER PROTECTION BETTER BE PRESENT FOR ; THE OFFSETS TO WORK .IF DF R$$PRV ; IF KMS DATA STRUCTRURE ADDED TO UCB .IFNDF M$$CLI ; IF MULTIPLE CLI SUPPORT NOT PRESENT U.ACN=U.LUIC-4 ; OFFSET INTO EXPANDED UCB FOR ACCOUNT NUMBER .IFF ; IF M$$CLI IS DEFINED U.ACN=U.LUIC-6 ; IF M$$CLI THEN U.ACN BUMPED UP ONE .ENDC ; END CONDITIONAL M$$CLI .ENDC ; R$$PRV .IF DF T$$CPU ; IF CPU TIME ACCOUNTING DEFINED U.TIC2=U.ACN-2 ; HIGH ORDER CPU TIME IN TICS U.TIC1=U.TIC2-2 ; LOW ORDER CPU TIME IN TICS U.RNCT=U.TIC1-2 ; NUMBER OF TASK RUN U.INCT=U.RNCT-2 ; NUMBER OF TIMES INS IS USED U.ATCT=U.INCT-2 ; NUMBER OF TIME @ IS RUN .ENDC ; T$$CPU .IF DF Q$$CNT ; IF QIO ACCOUNTING IS DEFINED U.QIO2=U.ATCT-2 ; QIO COUNTER HIGH VAL U.QIO1=U.QIO2-2 ; QIO COUNTER LO VAL .ENDC ; Q$$CNT .ENDC ; M$$MUP TLUN=1 ; THE TERMINAL LUN TWARN1=9.*6 ; 1ST WARNING-----9 MINUTES ;TWARN1=2. TWARN2=TWARN1+3. ; 2ND WARNING 30 SECONDS LATER TKILL=TWARN2+3. ; KILL HIM 30 SECONDS AFTER THAT ; THIS DEFINES THE TERMINAL STATUS TABLE .ASECT .=0 TS.UIC: .BLKW 1 ; LOGIN UIC (IF TERMINAL IS LOGGED IN) TS.CNT: .BLKW 1 ; THE TIME COUNTER TS.QCT: .BLKW 1 ; TASK QIO COUNT TS.LEN: ; SIZE OF AN ENTRY .=0 .PSECT .MCALL ALUN$S,MRKT$S,ERR$,STSE$S,DCBDF$,TCBDF$,UCBDF$,PKTDF$ .MCALL SPWN$S,QIOW$S,QIO$S,CMKT$S,ABRT$S,HDRDF$ DCBDF$ TCBDF$ UCBDF$ PKTDF$ HDRDF$ .PAGE ; R0 HAVE THE UNIT NUMBER OF THE TERMINAL ; R1 POINTS TO THE TERMINAL STATUS TABLE ENTRY START: CLR R0 ; DEVICE # MOV #TTSTAT,R1 MOV #"TT,TRMDEV ; DEVICE TYPE FOR LATER 10$: ALUN$S #TLUN,#"TT,R0 ; HOOK UP TO THE DEVICE BCS 40$ ; ALL DONE CALL CHKTRM ; GO CHECK IT OUT INC R0 ; STEP TO NEXT DEVICE ADD #TS.LEN,R1 BR 10$ 40$: CLR R0 ;;;;;;; MAYBE CHECK FOR OTHER TYPES (VT, ETC) ; ALL DONE WITH THIS QUANTUM, GO TO SLEEP MRKT$S #1,#10.,#2. ERR$ AHSHIT STSE$S #1 ERR$ AHSHIT BR START .PAGE .SBTTL CHKTRM -- EXAMINE ONE TERMINAL CHKTRM: CALL $SAVAL ; SAVE REGISTERS ; GET UCB ADDR OF TERMINAL TO R2 CALL $SWSTK,2$ ;; SWITCH TO SYSTEM STATE MOV $HEADR,R2 ; GET MY TASK HEADER ADDR MOV H.LUN+<*4>(R2),UCBA ;; GET UCB ADDR OF TERM RETURN 2$: MOV UCBA,R2 BIT #U2.LOG,U.CW2(R2) ; LOGGED ON? BEQ 10$ 5$: CLR TS.UIC(R1) ; NO--CLEAN UP THE ENTRY CLR TS.CNT(R1) RETURN ; IT IS LOGGED ON. IF NEWLY DONE, INIT THE ENTRY 10$: TST TS.UIC(R1) BEQ 15$ CMP TS.UIC(R1),U.LUIC(R2) BEQ 100$ ; A FAST LOGOFF/ON !!!!! 15$: MOV U.LUIC(R2),TS.UIC(R1) CLR TS.CNT(R1) ; IF THERE IS A TASK RUNNING ON THE TERMINAL THAT ; IS REALLY DOING SOMETHING, RESET THE COUNTER 100$: INC TS.CNT(R1) ; BUMP THE COUNTER ; TRY TO SEE IF ANY I/O HAS BEEN DONE ON BEHALF OF THIS TI: .IF DF R$$PRV ; KMS ACCOUNTING UCB CHANGES .IF DF Q$$CNT ; QIO COUNTER BIT #1000,$ACMSK ; FORGET THIS IF QIO COUNTING NOT ACTIVE BEQ 120$ CMP TS.QCT(R1),U.QIO1(R2) ; IF HE HAS DONE I/O, HE IS WORKING BEQ 120$ ; BR IF HE HASN'T MOV U.QIO1(R2),TS.QCT(R1) ; HE HAS DONE I/O, GOOD BOY!!! BR 190$ .ENDC ; Q$$CNT .ENDC ; R$$PRV ; HE HASN'T DONE ANY I/O. IF HE HAS A TASK WHICH IS NOT BLOCKED, ; HE IS WORKING, SO RESET HIS COUNTER. ; NOTE THAT WE ONLY HAVE TO GO TO ALL THIS TROUBLE IF HE HASN'T DONE ANY I/O. 120$: CALL $SWSTK,200$ ;; GO TO SYSTEM STATE MOV $ACTHD,R4 ;; SCAN THRU THE ATL 110$: BEQ 199$ ;; ALL DONE CMP T.UCB(R4),R2 BNE 119$ ;; TASK NOT ON THIS TERMINAL ;; FOUND A TASK. SEE IF IT IS WORKING ; IF IS NOT BLOCKED, IT MIGHT BE A CPU BOUND TASK, SO COUNT IT AS ; WORKING. BIT #,T.ST2(R4) ; TASK BLOCKED?? BEQ 190$ ;; BR IF NOT BLOCKED 119$: MOV T.ACTL(R4),R4 ;; STEP TO NEXT TASK ON THE ATL BR 110$ 190$: CLR TS.CNT(R1) ;; IT IS--START TIMING IT ALL OVER AGAIN 199$: RETURN ; BACK TO USER STATE .PAGE ; CHECK AND SEND MESSAGES 200$: CMP TS.CNT(R1),#TKILL BNE 220$ MOV #MSGK,R4 ; LOG HIM OFF MOV #MSGKL,R5 CALL SNDMSG SPWN$S #MCR,,,,,,,,#BYECMD,#BYEL,R0,TRMDEV ERR$ AHSHIT CLR TS.CNT(R1) RETURN 220$: CMP TS.CNT(R1),#TWARN2 BNE 230$ MOV #MSG2,R4 ; 2ND WARNING MESSAGE MOV #MSG2L,R5 CALL SNDMSG RETURN 230$: CMP TS.CNT(R1),#TWARN1 BNE 240$ MOV #MSG1,R4 ; 1ST WARNING MESSAGE MOV #MSG1L,R5 CALL SNDMSG 240$: RETURN .PAGE .SBTTL SNDMSG -- TYPE A MESSAGE ; R4 & R5 HAVE THE BUFFER ADDR & LENGTH SNDMSG: MRKT$S #1,#2,#2 ; GIVE IT 2 SECONDS TO GET OUT ERR$ AHSHIT QIO$S #IO.WBT,#TLUN,#1,,,, ERR$ AHSHIT STSE$S #1 ERR$ AHSHIT CMKT$S ; KILL THE TIMER QIO$S #IO.KIL,#TLUN ; KILL THE MESSAGE RETURN ; A DIRECTIVE FAILED AHSHIT: MOV (SP),R3 ; SEE WHERE WE WERE CALLED FROM ABRT$S IOT .PAGE .SBTTL DATA TRMDEV: .ASCII 'TT' ; DEVICE TYPE BYECMD: .ASCII 'BYE' BYEL=.-BYECMD .ENABLE LC MSG1: .ASCII <15><12><07>'Are you still there? '<07> .ascii 'Get busy or be logged off!!!!!'<07> msg1l=.-msg1 MSG2: .ASCII <15><12><07>'You are about to be logged off ' .ascii 'for inactivity'<07> MSG2L=.-MSG2 MSGK: .ASCII <15><12><07>'Terminal logged off due to inactivity'<07> MSGKL=.-MSGK .EVEN MCR: .RAD50 /MCR.../ UCBA: .BLKW 1 ; THE TERMINAL UCB ADDR ; ALLOW FOR 64 TERMINALS TTSTAT:: .BLKW 64.* .END START