- %ZTM2 ;SEA/RDS-TaskMan: Manager, Part 4 (Link Handling 1) ;22 May 2003 10:17 am
- ;;8.0;KERNEL;**23,118,275**;JUL 10, 1995
- ;
- XLINK ;SEND^%ZTM--determine routing of XCPU task
- S ZTJOBIT=0
- S ZTI=$O(^%ZIS(14.5,"B",ZTDVOL,""))
- S ZTS=^%ZIS(14.5,ZTI,0)
- I $P(ZTS,U,4)="Y" G DOWN
- S ZTM=$P(ZTS,U,6)
- S ZTN=$P(ZTS,U,7) I ZTN S ZTN=$P(^%ZIS(14.5,ZTN,0),U)
- I ZTN="" S ZTN=ZTDVOL
- I ZTN=%ZTVOL S ZTJOBIT=1 Q
- I $D(^%ZTSCH("LINK",ZTDVOL)) G DOWN
- I ZTYPE="C" S ZTJOBIT=1 Q
- ;
- OCPU ;XLINK--send task to manager on another volume set
- ;First check how many jumps to other volume sets we have done.
- I $P(^%ZTSK(ZTSK,.02),"^",3)>2 D REJCT^%ZTM1("Too many hops") Q
- S $P(^%ZTSK(ZTSK,.02),"^",3)=$P($G(^%ZTSK(ZTSK,.02)),"^",3)+1
- S X="EROCPU^%ZTM2",@^%ZOSF("TRAP")
- I '$D(^[ZTM,ZTN]%ZTSCH("RUN")) S ZTT=$H G O1
- S ZTT=^[ZTM,ZTN]%ZTSCH("RUN")
- ;
- O1 L +^[ZTM,ZTN]%ZTSK(-1):5
- S ZTS=^[ZTM,ZTN]%ZTSK(-1)+1
- F ZT=0:0 Q:'$D(^[ZTM,ZTN]%ZTSK(ZTS)) S ZTS=ZTS+1
- S ^[ZTM,ZTN]%ZTSK(-1)=ZTS
- ;
- L -^[ZTM,ZTN]%ZTSK(-1),+^[ZTM,ZTN]%ZTSK(ZTS)
- D TSKSTAT^%ZTM1(1,"Ready to Move") ;S $P(^%ZTSK(ZTSK,.1),U,1,3)=1_U_ZTT_U
- S %X="^%ZTSK(ZTSK,",%Y="^[ZTM,ZTN]%ZTSK(ZTS," D %XY^%RCR
- ;Now schedule task.
- S $P(^[ZTM,ZTN]%ZTSK(ZTS,0),U,6)=ZTT,^[ZTM,ZTN]%ZTSCH($$H3^%ZTM(ZTT),ZTS)=""
- L -^[ZTM,ZTN]%ZTSK(ZTS)
- ;
- S X="",@^%ZOSF("TRAP")
- K ^%ZTSK(ZTSK,.3)
- D TSKSTAT^%ZTM1(6,"^Moved to "_ZTM_","_ZTN_" as task number "_ZTS)
- K ZT,ZT1,ZTD,ZTI,ZTM,ZTN,ZTR,ZTS,ZTT,ZTREP Q
- ;
- EROCPU ;OCPU--trap dropped link and reroute task
- S X="",@^%ZOSF("TRAP")
- I $D(^%ZTSCH("LINK"))[0 S ^("LINK")=$H
- S ^%ZTSCH("LINK",ZTDVOL)=1
- ;
- DOWN ;XLINK/EROCPU--reroute XCPU task whose link is down
- D REQRD I $D(ZTREQUIR) G ORIGNL
- I ZTIO]"",$D(IOCPU)#2,IOCPU]"" G LIST
- S ZTREP(ZTDVOL)=""
- S ZTREP=$P(^%ZIS(14.5,ZTI,0),U,8)
- I ZTREP S ZTREP=$P(^%ZIS(14.5,ZTREP,0),U)
- I ZTREP="" G ORIGNL
- I $D(ZTREP(ZTREP))#2 G ORIGNL
- D1 ;
- I $D(^%ZTSK(ZTSK,.01))[0 S ^%ZTSK(ZTSK,.01)=ZTUCI_U_ZTDVOL
- S Y=$O(^%ZIS(14.6,"AT",ZTUCI,ZTDVOL,ZTREP,""))
- I Y="" S Y=ZTUCI
- S ZTUCI=Y,ZTDVOL=ZTREP
- I ZTDVOL=%ZTVOL S X=ZTUCI_","_ZTDVOL X ^%ZOSF("UCICHECK") S:0'[Y ZTUCI=Y I 0[Y S %ZTREJCT=1
- S $P(^%ZTSK(ZTSK,.02),U)=ZTUCI
- I ZTDVOL'=%ZTVOL S $P(^%ZTSK(ZTSK,.02),U,2)=ZTDVOL
- E S $P(^%ZTSK(ZTSK,.02),U,2)=""
- I %ZTREJCT D TSKSTAT^%ZTM1("B","BAD DESTINATION UCI") Q
- I ZTDVOL=%ZTVOL G SEND^%ZTM
- G XLINK
- ;
- REQRD ;DOWN--is dropped link required?
- S ZTI=$O(^%ZIS(14.5,"B",ZTDVOL,""))
- I ZTI="" Q
- I $D(^%ZIS(14.5,ZTI,0))#2 S ZTS=^(0)
- E Q
- I $P(ZTS,U,5)="Y" S ZTREQUIR=ZTDVOL
- Q
- ;
- ORIGNL ;DOWN--give up trying to reroute; make it wait for original destination
- I $D(^%ZTSK(ZTSK,.01))[0 G LIST
- S ZTORIGNL=^%ZTSK(ZTSK,.01)
- S ZTUCI=$P(ZTORIGNL,U)
- S ZTDVOL=$P(ZTORIGNL,U,2)
- S $P(^%ZTSK(ZTSK,.02),U)=ZTUCI
- I ZTDVOL'=%ZTVOL S $P(^%ZTSK(ZTSK,.02),U,2)=ZTDVOL
- E S $P(^%ZTSK(ZTSK,.02),U,2)=""
- ;
- LIST ;DOWN/ORIGNL--place task on waiting list for down volume
- I $D(^%ZTSCH("LINK"))[0 S ^("LINK")=$H
- I ZTYPE'="C" S ^%ZTSCH("LINK",ZTDVOL,ZTDTH,ZTSK)=""
- E D
- .S ^%ZTSCH("LINK",ZTDVOL)=1
- .L +^%ZTSCH("C",ZTDVOL):5
- .S ^%ZTSCH("C",ZTDVOL,ZTDTH,ZTSK)=""
- .L -^%ZTSCH("C",ZTDVOL)
- .Q
- D TSKSTAT^%ZTM1("G","Link Wait")
- L K ZT,ZT1,ZTD,ZTI,ZTM,ZTN,ZTORIGNL,ZTR,ZTS,ZTT,ZTREP Q
- ;
- ERCL ;I2^%ZTM - error in C list
- Q:$$OOS^%ZTM(ZTVOL) N %
- S %=$O(^%ZIS(14.7,"B",ZTVOL,0))
- I %>0 S $P(^%ZIS(14.7,%,0),U,11)=1
- Q
- LKUP(VS) ;Lookup a VS and place in ZTVS
- N %,%1
- S %=$O(^%ZIS(14.5,"B",VS,0)),%1=$G(^%ZIS(14.5,+%,0))
- S %ZTVS(VS)=%1,%ZTVS(VS,"IFN")=% Q
- %ZTM2 ;SEA/RDS-TaskMan: Manager, Part 4 (Link Handling 1) ;22 May 2003 10:17 am
- +1 ;;8.0;KERNEL;**23,118,275**;JUL 10, 1995
- +2 ;
- XLINK ;SEND^%ZTM--determine routing of XCPU task
- +1 SET ZTJOBIT=0
- +2 SET ZTI=$ORDER(^%ZIS(14.5,"B",ZTDVOL,""))
- +3 SET ZTS=^%ZIS(14.5,ZTI,0)
- +4 IF $PIECE(ZTS,U,4)="Y"
- GOTO DOWN
- +5 SET ZTM=$PIECE(ZTS,U,6)
- +6 SET ZTN=$PIECE(ZTS,U,7)
- IF ZTN
- SET ZTN=$PIECE(^%ZIS(14.5,ZTN,0),U)
- +7 IF ZTN=""
- SET ZTN=ZTDVOL
- +8 IF ZTN=%ZTVOL
- SET ZTJOBIT=1
- QUIT
- +9 IF $DATA(^%ZTSCH("LINK",ZTDVOL))
- GOTO DOWN
- +10 IF ZTYPE="C"
- SET ZTJOBIT=1
- QUIT
- +11 ;
- OCPU ;XLINK--send task to manager on another volume set
- +1 ;First check how many jumps to other volume sets we have done.
- +2 IF $PIECE(^%ZTSK(ZTSK,.02),"^",3)>2
- DO REJCT^%ZTM1("Too many hops")
- QUIT
- +3 SET $PIECE(^%ZTSK(ZTSK,.02),"^",3)=$PIECE($GET(^%ZTSK(ZTSK,.02)),"^",3)+1
- +4 SET X="EROCPU^%ZTM2"
- SET @^%ZOSF("TRAP")
- +5 IF '$DATA(^[ZTM,ZTN]%ZTSCH("RUN"))
- SET ZTT=$HOROLOG
- GOTO O1
- +6 SET ZTT=^[ZTM
- SET ZTN]%ZTSCH("RUN")
- +7 ;
- O1 LOCK +^[ZTM,ZTN]%ZTSK(-1):5
- +1 SET ZTS=^[ZTM
- SET ZTN]%ZTSK(-1)+1
- +2 FOR ZT=0:0
- IF '$DATA(^[ZTM,ZTN]%ZTSK(ZTS))
- QUIT
- SET ZTS=ZTS+1
- +3 SET ^[ZTM
- SET ZTN]%ZTSK(-1)=ZTS
- +4 ;
- +5 LOCK -^[ZTM,ZTN]%ZTSK(-1),+^[ZTM,ZTN]%ZTSK(ZTS)
- +6 ;S $P(^%ZTSK(ZTSK,.1),U,1,3)=1_U_ZTT_U
- DO TSKSTAT^%ZTM1(1,"Ready to Move")
- +7 SET %X="^%ZTSK(ZTSK,"
- SET %Y="^[ZTM,ZTN]%ZTSK(ZTS,"
- DO %XY^%RCR
- +8 ;Now schedule task.
- +9 SET $PIECE(^[ZTM,ZTN]%ZTSK(ZTS,0),U,6)=ZTT
- SET ^[ZTM
- SET ZTN]%ZTSCH($$H3^%ZTM(ZTT),ZTS)=""
- +10 LOCK -^[ZTM,ZTN]%ZTSK(ZTS)
- +11 ;
- +12 SET X=""
- SET @^%ZOSF("TRAP")
- +13 KILL ^%ZTSK(ZTSK,.3)
- +14 DO TSKSTAT^%ZTM1(6,"^Moved to "_ZTM_","_ZTN_" as task number "_ZTS)
- +15 KILL ZT,ZT1,ZTD,ZTI,ZTM,ZTN,ZTR,ZTS,ZTT,ZTREP
- QUIT
- +16 ;
- EROCPU ;OCPU--trap dropped link and reroute task
- +1 SET X=""
- SET @^%ZOSF("TRAP")
- +2 IF $DATA(^%ZTSCH("LINK"))[0
- SET ^("LINK")=$HOROLOG
- +3 SET ^%ZTSCH("LINK",ZTDVOL)=1
- +4 ;
- DOWN ;XLINK/EROCPU--reroute XCPU task whose link is down
- +1 DO REQRD
- IF $DATA(ZTREQUIR)
- GOTO ORIGNL
- +2 IF ZTIO]""
- IF $DATA(IOCPU)#2
- IF IOCPU]""
- GOTO LIST
- +3 SET ZTREP(ZTDVOL)=""
- +4 SET ZTREP=$PIECE(^%ZIS(14.5,ZTI,0),U,8)
- +5 IF ZTREP
- SET ZTREP=$PIECE(^%ZIS(14.5,ZTREP,0),U)
- +6 IF ZTREP=""
- GOTO ORIGNL
- +7 IF $DATA(ZTREP(ZTREP))#2
- GOTO ORIGNL
- D1 ;
- +1 IF $DATA(^%ZTSK(ZTSK,.01))[0
- SET ^%ZTSK(ZTSK,.01)=ZTUCI_U_ZTDVOL
- +2 SET Y=$ORDER(^%ZIS(14.6,"AT",ZTUCI,ZTDVOL,ZTREP,""))
- +3 IF Y=""
- SET Y=ZTUCI
- +4 SET ZTUCI=Y
- SET ZTDVOL=ZTREP
- +5 IF ZTDVOL=%ZTVOL
- SET X=ZTUCI_","_ZTDVOL
- XECUTE ^%ZOSF("UCICHECK")
- IF 0'[Y
- SET ZTUCI=Y
- IF 0[Y
- SET %ZTREJCT=1
- +6 SET $PIECE(^%ZTSK(ZTSK,.02),U)=ZTUCI
- +7 IF ZTDVOL'=%ZTVOL
- SET $PIECE(^%ZTSK(ZTSK,.02),U,2)=ZTDVOL
- +8 IF '$TEST
- SET $PIECE(^%ZTSK(ZTSK,.02),U,2)=""
- +9 IF %ZTREJCT
- DO TSKSTAT^%ZTM1("B","BAD DESTINATION UCI")
- QUIT
- +10 IF ZTDVOL=%ZTVOL
- GOTO SEND^%ZTM
- +11 GOTO XLINK
- +12 ;
- REQRD ;DOWN--is dropped link required?
- +1 SET ZTI=$ORDER(^%ZIS(14.5,"B",ZTDVOL,""))
- +2 IF ZTI=""
- QUIT
- +3 IF $DATA(^%ZIS(14.5,ZTI,0))#2
- SET ZTS=^(0)
- +4 IF '$TEST
- QUIT
- +5 IF $PIECE(ZTS,U,5)="Y"
- SET ZTREQUIR=ZTDVOL
- +6 QUIT
- +7 ;
- ORIGNL ;DOWN--give up trying to reroute; make it wait for original destination
- +1 IF $DATA(^%ZTSK(ZTSK,.01))[0
- GOTO LIST
- +2 SET ZTORIGNL=^%ZTSK(ZTSK,.01)
- +3 SET ZTUCI=$PIECE(ZTORIGNL,U)
- +4 SET ZTDVOL=$PIECE(ZTORIGNL,U,2)
- +5 SET $PIECE(^%ZTSK(ZTSK,.02),U)=ZTUCI
- +6 IF ZTDVOL'=%ZTVOL
- SET $PIECE(^%ZTSK(ZTSK,.02),U,2)=ZTDVOL
- +7 IF '$TEST
- SET $PIECE(^%ZTSK(ZTSK,.02),U,2)=""
- +8 ;
- LIST ;DOWN/ORIGNL--place task on waiting list for down volume
- +1 IF $DATA(^%ZTSCH("LINK"))[0
- SET ^("LINK")=$HOROLOG
- +2 IF ZTYPE'="C"
- SET ^%ZTSCH("LINK",ZTDVOL,ZTDTH,ZTSK)=""
- +3 IF '$TEST
- Begin DoDot:1
- +4 SET ^%ZTSCH("LINK",ZTDVOL)=1
- +5 LOCK +^%ZTSCH("C",ZTDVOL):5
- +6 SET ^%ZTSCH("C",ZTDVOL,ZTDTH,ZTSK)=""
- +7 LOCK -^%ZTSCH("C",ZTDVOL)
- +8 QUIT
- End DoDot:1
- +9 DO TSKSTAT^%ZTM1("G","Link Wait")
- +10 LOCK
- KILL ZT,ZT1,ZTD,ZTI,ZTM,ZTN,ZTORIGNL,ZTR,ZTS,ZTT,ZTREP
- QUIT
- +11 ;
- ERCL ;I2^%ZTM - error in C list
- +1 IF $$OOS^%ZTM(ZTVOL)
- QUIT
- NEW %
- +2 SET %=$ORDER(^%ZIS(14.7,"B",ZTVOL,0))
- +3 IF %>0
- SET $PIECE(^%ZIS(14.7,%,0),U,11)=1
- +4 QUIT
- LKUP(VS) ;Lookup a VS and place in ZTVS
- +1 NEW %,%1
- +2 SET %=$ORDER(^%ZIS(14.5,"B",VS,0))
- SET %1=$GET(^%ZIS(14.5,+%,0))
- +3 SET %ZTVS(VS)=%1
- SET %ZTVS(VS,"IFN")=%
- QUIT