.TITLE CPTASK .IDENT /V7.1/ ;************************************************************************ ; ; CPTASK.TSK ; ; THIS ROUTINE IMPLEMENTS THE ACCOUNTING SYSTEM TASK "CPTASK", WHICH ; ACTS AS THE INTERFACE BETWEEN THE LOGGING TASK LOG... AND THE ; USER SUBROUTINE CALLS "CALL CPTIME(T1,T2)". ; THE CPTIME ROUTINE DOES A CONNECT TO THIS TASK AND WAITS ON THE ; CONNECTION UNTIL WE EXIT, THEREBY SYNCHRONISING ITSELF WITH ; THE ACCOUNTING SYSTEM SERVICE. THE USER TASK, VIA THE CPTIME ; ROUTINE, DOES A SEND DATA TO US (WITH NO DATA) SO THAT WE CAN ; CAN FIND OUT ITS TASK NAME. ; ; VERSION: V7 MAY 1981 ; ; STEVE THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA ; NY 14853 ; ;*********************************************************************** .MCALL RCVX$S,SDAT$S,RSUM$S ACCDF$ ; DEFINE ACCOUNTING SYSTEM OFFSETS BITDF$ ; DEFINE ACCOUNTING SYSTEM BIT MASKS RBUF: .BLKW 15. ; RECEIVE DATA PACKET LOGNAM: .RAD50 /LOG.../ ; NAME OF LOGGING TASK LOGPTR: .WORD 0 ; TCB ADDRESS OF LOGGING TASK DSRPKT: .WORD 0 ; ADDRESS OF COMMUNICATIONS BLOCK $CPTEP: ; XFR ADDRESS RCVX$S ,#RBUF ; GET REQUEST DATA FROM USER TASK ; AND EXIT IF NOTHING THERE BCS $CPTEP ; JUST IN CASE MOV #LOGNAM,R3 ; GET LOGGING TASK NAME CALL $SRSTD ; LOOK IN THE STD FOR IT BCS 30$ ; IF CS, NOT THERE SO JUST RESTART TASK BIT #TS.EXE,T.STAT(R0) ; OK, BUT IS IT ACTIVE? BNE 30$ ; IF NE NO, JUST RESTART TASK MOV R0,LOGPTR ; SAVE LOG...'S TCB ADDRESS CLR DSRPKT ; SET NO COMMUNICATIONS BLOCK CALL $SWSTK,20$ ; SWITCH TO SYSTEM STACK MOV #B.LTSF,R1 ;; SET LENGTH OF CORE BLOCK NEEDED CALL $ALOCB ;; ALLOCATE IT FROM POOL BCS 10$ ;; IF CS WE COULDN'T MOV R0,DSRPKT ;; SAVE ITS ADDRESS FOR LATER MOV #,B.MASK(R0) ;; SET COMMAND MASK MOV $TKTCB,R1 ;; GET OUR TCB ADDRESS MOV R1,B.TTCB(R0) ;; INSERT OUR TCB ADDRESS MOV #,B.TTYP(R0) ;; TELL LOG... WHAT WE WANT MOV T.UCB(R1),B.UCB(R0) ;; INSERT UCB ADDRESS OF TERMINAL FROM ;; WHICH THE REQUEST CAME (WE ARE SLAVED) MOV R0,R1 ;; COPY PACKET ADDRESS TO R1 MOV LOGPTR,R0 ;; GET LOG...'S TCB ADDRESS CALL $EXRQF ;; QUEUE PACKET AND START LOG... CALLR $STPCT ;; STOP US UNTIL LOG... REPLIES 10$: RETURN ;; BACK TO USER STATE 20$: MOV DSRPKT,R5 ; GET DSR BLOCK ADDRESS BEQ 30$ ; IF EQ WE COULDN'T GET ONE MOV B.CSF(R5),RBUF+4 ; SAVE CPU TIME IN SEND BUFFER MOV B.CSF+2(R5),RBUF+6 ; MOV B.TCON(R5),RBUF+10 ; SAVE CONNECT TIME IN SEND BUFFER MOV B.TCON+2(R5),RBUF+12 ; SDAT$S #RBUF,#RBUF+4 ; QUEUE THE RESULTS TO THE TASK 30$: RSUM$S #RBUF ; AND RESTART IT TST DSRPKT ; DSR PACKET TO DEALLOCATE? BEQ $CPTEP ; IF EQ NO, TRY FOR MORE REQUESTS CALL $SWSTK,$CPTEP ; SWITCH TO SYSTEM STACK MOV R5,R0 ;; COPY DSR PACKET ADDRESS TO R0 MOV #B.LTSF,R1 ;; SET ITS LENGTH CALLR $DEACB ;; DEALLOCATE THE DSR PACKET AND RETURN ;; TO USER STATE AT THE ENTRY POINT TO ;; PROCESS ANY OTHER QUEUED REQUESTS. .END $CPTEP