A BIT MORE USEFUL " P O O L M O N I T O R " ============================================= The POOL program, as published in The Multitasker (even a great tool) requires more than skilled operator to come out from the Pool-lock. It is usually very dificult to discover the task, which consumed Pool and forced the system to freeze. Help is simple to add a few code and POOL will (at the system fatal state) display also active tasks and their memmory state: 12-FEB-81 18:41:30 POOL -- FATAL STATE -- FREE POOL EXHAUSTED ACTIVE: TT0: IN MCR... CO0: IN F11ACP TT2: OUT LPP0 CO0: OUT QMG... TT4: IN TT4 - probbably the "POOL CONSUMER" CO0: IN POOL POOL -- PLEASE, ENTER TASK TO ABORT: This makes system recovery (especially for larger systems) much more probbably. I note, POOL works very good with STSE$ and 30 sec pause between the Pool-checks. Since there are too many hand-typed versions of POOL, I don't include SLP correction file, but example of the part of code: FATMSG: .BYTE 7,15,12,12 .BLKB 9. .BYTE 40 .BLKB 8. .BYTE 40 .ASCII /POOL -- FATAL STATE -- FREE POOL EXHAUSTED/<7> .ASCIZ <15><12><15><12>/ACTIVE:/<15><12> TSKMSG: TSKTTI: .ASCII /TT7 / TSKMEM: .ASCII /OUT / TSKNAM: .ASCIZ /TTTTTT/ ABOMSG: .ASCIZ <15><12>/POOL -- PLEASE, ENTER TASK TO ABORT:/ INVNAM: .ASCIZ <177><177>/POOL -- INVALID TASKNAME, TRY AGAIN:/ NOTABO: .ASCIZ <177><177>/POOL -- TASK NOT ABORTED, TRY AGAIN:/ ............ ; NOT ENOUGH FREE POOL TO QUEUE A LINE TO MCR. ; TAKE OVER THE SYSTEM, ASK TO ABORT TASKS UNTIL POOL RETURNS. ; 120$: MOV #FATMSG+4,R3 CALL DATSUB CALL $SWSTK,160$ MOV @#TTISTA,-(SP) MOV @#TTOSTA,-(SP) CLR @#TTISTA CLR @#TTOSTA MOV #FATMSG,R0 CALL TTYOUT ; ; FIND ACTIVE TASKS AND TELL THEIR NAME, TI AND MEMORY STATE PAGE 2 ; MOV #$TSKHD-T.TCBL,R4 ;FIRST POINTER 122$: MOV T.TCBL(R4),R3 ;GET NEXT TCB ADDRESS MOV R3,R4 ;SAVE IT FOR NEXT LOOP CMP #$HEADR,R3 ;IS IT NULL TASK BEQ 126$ ;EQ=YES, ALL DONE BIT #TS.EXE,T.STAT(R3) ;IS TASK ACTIVE? BNE 122$ ;NE=NOT, TRY NEXT ONE CMP R3,$LDRPT ;IS IT LOADR? BEQ 122$ ;EQ=YES, SKIP IT MOV #TSKNAM,R0 ;GET TASK STRING ADDR MOV T.NAM(R3),R1 ;R50 TASKNAME 1-3 CALL $C5TA ;CONVERT IT TO ASCII MOV T.NAM+2(R3),R1 ;R50 TASKNAME 4-6 CALL $C5TA ;CONVERT IT TO ASCII MOV #TSKMEM,R0 ;GET MEMMORY ATR. ADDR MOVB #'O,(R0) ;AND MOVB #'U,1(R0) ;PREPARE TASK OUT MOVB #'T,2(R0) ;MESSAGE BIT #TS.OUT,T.STAT(R3) ;IS TASK IN MEMORY? BNE 124$ ;NE=NOT=OUT MOVB #'I,(R0)+ ;REPLACE MOVB #'N,(R0)+ ;OUT MESSAGE BY MOVB #' ,(R0) ;IN MESSAGE MOV #TSKTTI,R0 ;TT-NUM STRING ADDR MOV T.UCB(R3),R3 ;TASK'S TI: UCB ADDR CALL $FMTDV ;FORM DEVICE IDENT 124$: MOV #TSKMSG,R0 ;PREPARE AND OUTPUT CALL TTYOUT ;ACTIVE TASK MESSAGE BR 122$ ;REPEAT 126$: MOV #ABOMSG,R0 ;PREPARE AND OUTPUT CALL TTYOUT ;ABORT MESSAGE SEQUENCE ....... Ing.Martin Brunecky Drobneho 28a 60000 BRNO Czechoslovakia