Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XULMUI1

XULMUI1.m

Go to the documentation of this file.
  1. XULMUI1 ;IRMFO-ALB/CJM/SWO/RGG - KERNEL LOCK MANAGER ;11/29/2012
  1. ;;8.0;KERNEL;**608**;JUL 10, 1995;Build 84
  1. ;;Per VA Directive 6402, this routine should not be modified
  1. ;
  1. ; ******************************************************************
  1. ; * *
  1. ; * The Kernel Lock Manager is based on the VistA Lock Manager *
  1. ; * developed by Tommy Martin. *
  1. ; * *
  1. ; ******************************************************************
  1. ;
  1. ;
  1. ;
  1. INIT ; Build list for displaying a single lock = XULMLOCK
  1. N OWNER,LOCK,PID
  1. K @VALMAR
  1. S VALMCNT=0
  1. D ADD("Node: "_XULMNODE),CNTRL^VALM10(VALMCNT,1,5,IOINHI,IOINORM)
  1. D ADD("Lock: "_XULMLOCK),CNTRL^VALM10(VALMCNT,1,5,IOINHI,IOINORM)
  1. D ADD("Full Reference: "_@LOCKS@(XULMLOCK,XULMNODE)),CNTRL^VALM10(VALMCNT,1,15,IOINHI,IOINORM)
  1. S PID=@LOCKS@(XULMLOCK,XULMNODE,"PID")
  1. D ADD("Process ID (decimal): "_PID),CNTRL^VALM10(VALMCNT,1,21,IOINHI,IOINORM)
  1. D ADD("Process ID (hex): "_$$HEX^XULMU(PID)),CNTRL^VALM10(VALMCNT,1,17,IOINHI,IOINORM)
  1. S OWNER=@LOCKS@(XULMLOCK,XULMNODE,"OWNER")
  1. I $P(OWNER,"^",2)="{?}" S $P(OWNER,"^",2)="unavailable"
  1. D ADD("User Name: "_$$LJ($P(OWNER,"^",2),40)_" DUZ: "_$S(+OWNER:$P(OWNER,"^"),1:"")),CNTRL^VALM10(VALMCNT,1,10,IOINHI,IOINORM),CNTRL^VALM10(VALMCNT,55,4,IOINHI,IOINORM)
  1. D TASK(@LOCKS@(XULMLOCK,XULMNODE,"TASK"))
  1. D TEMPLATE($G(@LOCKS@(XULMLOCK,XULMNODE,"TEMPLATE")))
  1. D FILES(XULMLOCK)
  1. I @IDX@("PID",PID)<2 D
  1. .D ADD(" "),ADD("Other locks held by process: none"),CNTRL^VALM10(VALMCNT,1,28,IOINHI,IOINORM),ADD(" ")
  1. E D
  1. .D ADD(" "),ADD("Other locks held by process:"),CNTRL^VALM10(VALMCNT,1,28,IOINHI,IOINORM)
  1. .S LOCK=""
  1. .F S LOCK=$O(@IDX@("PID",PID,LOCK)) Q:LOCK="" I LOCK'=XULMLOCK D ADD(" "_LOCK)
  1. Q
  1. FILES(XULMLOCK) ;
  1. N FILES,FILE,VARS,TEMPLATE
  1. S TEMPLATE=$G(@LOCKS@(XULMLOCK,XULMNODE,"TEMPLATE"))
  1. I 'TEMPLATE D ADD("File References: unavailable"),CNTRL^VALM10(VALMCNT,1,16,IOINHI,IOINORM) QUIT
  1. D ADD("File References:"),CNTRL^VALM10(VALMCNT,1,16,IOINHI,IOINORM)
  1. S FILE=0
  1. M VARS=@LOCKS@(XULMLOCK,XULMNODE,"VARIABLES"),FILES=@LOCKS@(XULMLOCK,XULMNODE,"FILES")
  1. D GETREFS^XULMLD(@LOCKS@(XULMLOCK,XULMNODE,"TEMPLATE"),.FILES,.VARS)
  1. F S FILE=$O(FILES(FILE)) Q:'FILE D
  1. .N LABEL,I
  1. .S LABEL=$P($G(^DIC(FILE,0)),"^")
  1. .Q:'$L(LABEL)
  1. .S LABEL=" "_LABEL_" FILE RECORD:"
  1. .D ADD(LABEL),CNTRL^VALM10(VALMCNT,4,($L(LABEL)-3),IOINHI,IOINORM)
  1. .S I=0
  1. .F S I=$O(FILES(FILE,I)) Q:'I D
  1. ..S LABEL=$P(FILES(FILE,I),":")_":"
  1. ..D ADD(" "_LABEL_" "_$P(FILES(FILE,I),":",2,5))
  1. ..D CNTRL^VALM10(VALMCNT,7,$L(LABEL),IOINHI,IOINORM)
  1. Q
  1. ;
  1. TEMPLATE(TEMPLATE,OFFSET) ;
  1. S OFFSET=$$RJ("",+$G(OFFSET))
  1. I 'TEMPLATE D ADD(OFFSET_"Lock Usage: unavailable"),CNTRL^VALM10(VALMCNT,$L(OFFSET)+1,11,IOINHI,IOINORM) Q
  1. D ADD(OFFSET_"Lock Usage:"),CNTRL^VALM10(VALMCNT,1+$L(OFFSET),11,IOINHI,IOINORM)
  1. N NODE,SUB,FILE
  1. S SUB=0
  1. F S SUB=$O(^XLM(8993,TEMPLATE,4,SUB)) Q:'SUB D ADD(OFFSET_$G(^XLM(8993,TEMPLATE,4,SUB,0)))
  1. Q
  1. ;
  1. TASK(TASK) ;
  1. N NODE
  1. I 'TASK D ADD("Task Information: unavailable"),CNTRL^VALM10(VALMCNT,1,17,IOINHI,IOINORM) Q
  1. S NODE=$G(^%ZTSK(TASK,0))
  1. D ADD("Task Information:"),CNTRL^VALM10(VALMCNT,1,17,IOINHI,IOINORM)
  1. D ADD(" Task#: "_$$LJ(TASK,30)),CNTRL^VALM10(VALMCNT,5,6,IOINHI,IOINORM)
  1. D ADD(" Started: "_$$HTE^XLFDT($P(NODE,"^",5))),CNTRL^VALM10(VALMCNT,5,8,IOINHI,IOINORM)
  1. D ADD(" Option: "_$P(NODE,"^",9)),CNTRL^VALM10(VALMCNT,5,7,IOINHI,IOINORM)
  1. D ADD(" Description: "_$G(^%ZTSK(TASK,.03))),CNTRL^VALM10(VALMCNT,5,13,IOINHI,IOINORM)
  1. Q
  1. ;
  1. KILLPROC ;
  1. N PID,RETURN,ERROR
  1. D FULL^VALM1
  1. S RETURN=0
  1. S PID=$G(@LOCKS@(XULMLOCK,XULMNODE,"PID"))
  1. I PID=$J D PAUSE^XULMU("You cannot kill your own process!") Q
  1. I $G(@LOCKS@(XULMLOCK,XULMNODE,"SYSTEM")) W !,"You selected a system lock! Releasing a systems lock can have a",!,"widespread affect!"
  1. I '$$ASKYESNO^XULMU("Are you sure you want to terminate this process","NO") S VALMBCK="R" Q
  1. ;
  1. ;
  1. S XUPARMS("KILL")=1
  1. I $$SAMENODE^XULMU(XULMNODE) D
  1. .S RETURN=$$KILLPROC^XULMRPC(.RETURN,PID)
  1. E D
  1. .N $ETRAP,$ESTACK S $ETRAP="G ERROR2^XULM"
  1. .N IP,PORT
  1. .S IP=$G(XUPARMS("NODES",XULMNODE,"IP ADDRESS"))
  1. .S PORT=$G(XUPARMS("NODES",XULMNODE,"PORT"))
  1. .S RETURN=0
  1. .I (IP="")!(PORT="") D Q
  1. ..S RETURN=-1
  1. ..W !,"Unable to execute the KILL RPC!"
  1. ..W !,"The XULM LOCK MANAGER PARAMETERS file is missing the IP address/port"
  1. ..D PAUSE^XULMU("for "_XULMNODE_".")
  1. .S RETURN=$$KILLRPC^XULM(XUPARMS("NODES",XULMNODE,"IP ADDRESS"),XUPARMS("NODES",XULMNODE,"PORT"),XUPARMS("LOGIN"),PID,.ERROR)
  1. ;
  1. S VALMBCK="Q"
  1. I RETURN>0 D
  1. .;clean task from TaskMan
  1. .K:@LOCKS@(XULMLOCK,XULMNODE,"TASK") ^%ZTSCH("TASK",@LOCKS@(XULMLOCK,XULMNODE,"TASK"))
  1. .;
  1. .;log the process termination event
  1. .N LOG,DATA
  1. .S DATA(.01)=$$NOW^XLFDT,DATA(.02)=$G(DUZ)
  1. .S LOG=$$ADD^XULMU(8993.2,,.DATA) I LOG M ^XLM(8993.2,LOG,1)=@VALMAR
  1. .;
  1. .;check that the lock really is gone
  1. .L +@XULMLOCK:2
  1. .I $T D
  1. ..L -@XULMLOCK
  1. ..I $$ASKYESNO^XULMU("Process TERMINATED! Do you want to quit Lock Manager","YES") S XULMEXIT=1
  1. .E D
  1. ..S XUPARMS("KILL")=0
  1. ..W !,"The RPC to terminate the process was executed."
  1. ..D PAUSE^XULMU("However, it appears there may still be a lock blocking access.")
  1. .;
  1. I RETURN=0 D
  1. .L +@XULMLOCK:0
  1. .I $T D
  1. ..L -@XULMLOCK
  1. ..I $$ASKYESNO^XULMU("The lock was released! Do you want to quit Lock Manager","YES") S XULMEXIT=1
  1. .E D
  1. ..N CNT
  1. ..S VALMBCK="R"
  1. ..S XUPARMS("KILL")=0
  1. ..I $D(ERROR) W !,ERROR,!,$G(ERROR(1))
  1. ..W !,"The RPC to terminate the process was called, but its return value"
  1. ..D PAUSE^XULMU("indicates failure!")
  1. Q
  1. ;
  1. ;
  1. HELP ; -- help code
  1. N COUNT,LINE
  1. D CLEAR^VALM1
  1. F COUNT=1:1:24 S LINE=$P($T(HELPTEXT+COUNT),";;",2) Q:LINE="END" W !,LINE
  1. D PAUSE^XULMU
  1. D RE^VALM4
  1. Q
  1. ;
  1. EXIT ; -- exit code
  1. S VALMBCK="R"
  1. Q
  1. ADD(LINE) ;
  1. S @VALMAR@($$I,0)=LINE
  1. S:$G(XUENTRY) @VALMAR@("IDX1",VALMCNT)=XUENTRY
  1. Q
  1. ;
  1. LJ(STRING,LEN) ;
  1. Q $$LJ^XLFSTR(STRING,LEN)
  1. RJ(STRING,LEN) ;
  1. Q $$RJ^XLFSTR(STRING,LEN)
  1. ;
  1. I() ;
  1. S VALMCNT=VALMCNT+1
  1. Q VALMCNT
  1. ;
  1. ;
  1. HELPTEXT ;
  1. ;; ** USE EXTREME CAUTION **
  1. ;;
  1. ;;You can terminate a process and release all of its locks by selecting the
  1. ;;KILL action. Do NOT do so unless you are sure that the process is not for
  1. ;;an active user.
  1. ;;
  1. ;;Additionally, you need to exercise extreme caution if terminating a
  1. ;;system process, such as MailMan or TaskManager, because doing so could
  1. ;;impact multiple users.
  1. ;;
  1. ;;If you do terminate the process, an entry will be made in the
  1. ;;XULM LOCK MANAGER LOG file.
  1. ;;
  1. HLPEND ;;END