Command procedure to set up input file for KILL_LNM$JOB_TABLE.EXE $!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ $! $! RECLAIM_MEMORY.COM $! $! Reclaims orphaned logical job tables. $! $! The Boeing Company 1994 $! $!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ $ $! Generate a list of all (i.e., owned and orphaned) JIB $! addresses $ $ Show Logical /Table = LNM$JOB* - /Out = ALL_LNM$JOB_TABLES.DAT $ Purge /Nolog ALL_LNM$JOB_TABLES.DAT $ $! Extract only the JIB address from the records $! in ALL_LNM$JOB_TABLES.DAT and write them to the $! file JIBADDR.DAT. $ $ Open /Read in ALL_LNM$JOB_TABLES.DAT $ Open /Write out JIBADDR.DAT $ $ READ_LOOP: $ Read /End = Done in rec $ If F$Locate ("_8", rec) .GE. F$Length (rec) - then Goto Read_loop $ Jnum = F$Extract (9, 8, rec) $ Write out "''jnum'" $ Goto Read_loop $ $ DONE: $ Close in $ Close out $ $ Run KILL_LNM$JOB_TABLE $ $ Exit = Source code for the KILL_LNM$JOB_TABLE program ;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+; ; ; ; Program: KILL_LNM$JOB_TABLE.MAR ; ; ; ; Usage: Called by RECLAIM_JIBS.COM. ; ; ; ; Inputs: Implicit file JIBADDR.DAT (created by RECLAIM_JIBS.COM). ; ; ; ; Description: Compares JIB addresses from JIBADDR.DAT with those ; ; from the PCB vector, deleting any LNM$JOB_xxxxxxxx ; ; table for which there is no owner. ; ; ; ; Note: The executing process must have CMKRNL privilege. ; ; ; ; ) The Boeing Company 1994 ; ; ; ;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+; .TITLE KILL_LNM$JOB_TABLE.MAR .LINK /SYS$SYSTEM:SYS.STB/ .LIBRARY /SYS$SHARE:LIB/ $IPLDEF $SPLDEF $PCBDEF $PSLDEF $RMSDEF .psect DATA_AREA, WRT, SHR, NOEXE, PIC, LONG ; ; Lock data and executable kernel code into process working set ; LOCK_CODE: .ADDRESS CODE_START .ADDRESS CODE_END LOCK_DATA: .ADDRESS DATA_START .ADDRESS DATA_END DATA_START: MAX_MAXPROCESSCNT: .LONG 8192 ;Max. value in SYSGEN MAXPROCESSCNT: .LONG 0 ;Current MAXPROCESSCNT JIB_TABLE: .BLKL 8193 DATA_END: LNMSTR: .BLKB 16 BAD_ADDR: .ASCII /LNM$JOB_/ LNM_TABLE: .ASCID /LNM$SYSTEM_DIRECTORY/ JIBSTR: .BLKB 8 JIBADDR: .LONG 0 FACTOR: .LONG 0 DIGIT: .LONG 0 SHOW_ADDR: .LONG 0 .ADDRESS LNMSTR INFAB: $FAB FNM = , FAC = GET INRAB: $RAB FAB = INFAB BLANK = ^X20 ;---------------------------------------- .MACRO CHECK_STATUS, ?GOOD BLBS R0, GOOD $EXIT_S R0 GOOD: .ENDM CHECK_STATUS ;---------------------------------------- .PSECT CODE_AREA, NOWRT, EXE, NOSHR, LONG .ENTRY MAIN, ^M<> ; ; Lock kernel mode code and data into working set so VMS won't crash ; if paging occurs. $LKWSET_S INADR = LOCK_DATA CHECK_STATUS $LKWSET_S INADR = LOCK_CODE CHECK_STATUS $CMKRNL_S ROUTIN = GET_JIB_DATA CHECK_STATUS BRKPT: NOP MOVAL JIB_TABLE, R9 $OPEN FAB = INFAB BLBS R0, 50$ $EXIT_S R0 50$: $CONNECT RAB = INRAB BLBS R0, 55$ $EXIT_S R0 55$: $RAB_STORE RAB = INRAB,- UBF = JIBSTR,- USZ = #8 BRW READ_LOOP DONE_JMP: BRW DONE READ_LOOP: CLRL R8 $GET RAB = INRAB CMPL R0, #RMS$_EOF BLBC R0, DONE_JMP CLRL R5 CLRL JIBADDR MOVL #268435456, FACTOR ; 10000000 in Hexadecimal CONVERT_LOOP: CVTBL JIBSTR[R5], DIGIT SUBL2 #48, DIGIT CMPL DIGIT, #10 BLSS NOHEX SUBL2 #7, DIGIT NOHEX: MULL2 FACTOR, DIGIT ADDL2 DIGIT, JIBADDR DIVL2 #16, FACTOR ; Shift right one place INCL R5 CMPL R5, #7 BLEQ CONVERT_LOOP 60$: INCL R8 CMPL (R9)[R8], JIBADDR BEQL READ_LOOP CMPL R8, MAXPROCESSCNT BLSS 60$ ; ; Found a bad JIB address, so get rid of it ; CLRL R7 FILLSTR: MOVB #BLANK, LNMSTR[R7] INCL R7 CMPL R7, #16 BLSS FILLSTR MOVL #16, SHOW_ADDR CLRL R7 MOVC3 #8, BAD_ADDR, LNMSTR[R7] MOVL #8, R7 MOVC3 #8, JIBSTR, LNMSTR[R7] PUSHAQ SHOW_ADDR CALLS #1, G^LIB$PUT_OUTPUT ; ; Delete the orphaned logical name table ; $DELLNM_S - TABNAM = LNM_TABLE,- LOGNAM = SHOW_ADDR,- ACMODE = #PSL$C_KERNEL BLBC R0, READ_LOOP $EXIT_S R0 DONE: $CLOSE FAB = INFAB $EXIT_S R0 ; ;--------------------------------------------------------------- ; Traverse through the PCB vector looking for all valid JIB ; addresses. The valid addresses will be stored in JIB_TABLE. ; CODE_START: .ENTRY GET_JIB_DATA, ^M<> MOVL MAX_MAXPROCESSCNT, R8 MOVAL JIB_TABLE, R9 5$: CLRL (R9)+ ;Clear all JIB_TABLE entries SOBGEQ R8, 5$ MOVZWL G^SGN$GW_MAXPRCCT, MAXPROCESSCNT MOVL #1, R8 MOVL G^SCH$GL_PCBVEC, R9 LOCK SCHED ;Lock the SCHED spinlock GET_INFO: INCL R8 CMPL R8, MAXPROCESSCNT BLEQ 10$ BRW 99$ 10$: MOVL (R9)[R8], R4 ;Next PCB address CMPL G^SCH$AR_NULLPCB, R4 BEQL GET_INFO MOVL PCB$L_JIB(R4), JIB_TABLE[R8] BRW GET_INFO 99$: UNLOCK SCHED MOVL #SS$_NORMAL, R0 RET CODE_END: .END MAIN =======================================================================