%ZTM6 ;SEA/RDS-TaskMan: Manager, Part 8 (Load Balancing) ;07/28/2005 16:14 ;;8.0;KERNEL;**23,118,127,136,355**;JUL 10, 1995;Build 9 ; BALANCE ;CHECK^%ZTM--determine whether cpu should wait for balance ;Return ZTOVERLD =1 if need to wait, 0 to run ;The TM with the largest value sets ^%ZTSCH("LOAD",value)=who^when ;If your value is greater or equal then you run. ;If your value is less you wait unless you set LOAD then you run. L +^%ZTSCH("LOAD"):5 N X,ZTIME,ZTLEFT,ZTPREV N $ES,$ET S $ET="Q:$ES>0 D ER^%ZTM6" S ZTOVERLD=0,ZTPREV=+$O(^%ZTSCH("LOAD",0)),@("ZTLEFT="_%ZTPFLG("BAL")) S ZTIME=$$H3($H),ZTOVERLD=$$COMPARE(%ZTPAIR,ZTLEFT,ZTPREV) ;If we are RUNNING have other submanagers wait I 'ZTOVERLD D . S X="" F S X=$O(^%ZTSCH("LOADA",X)) Q:X="" S $P(^(X),"^")=1 . K ^%ZTSCH("LOAD") S ^("LOAD",ZTLEFT)=%ZTPAIR_"^"_ZTIME ;Now set a value that is used by our %ZTMS to run/wait also S ^%ZTSCH("LOADA",%ZTPAIR)=ZTOVERLD_"^"_ZTLEFT_"^"_ZTIME_"^"_$J L -^%ZTSCH("LOAD") Q ; STOPWT() ;See if we should stop Balance wait L +^%ZTSCH("LOAD"):0 Q:'$T 0 ;Keep waiting if can't get lock N I,J S I="",J=1 F S I=$O(^%ZTSCH("LOADA",I)) Q:I="" I '^(I) S J=0 L -^%ZTSCH("LOAD") Q J ;Return: stop waiting 1, keep waiting 0. ; CHECK ;Called when job limit reached. ;If not doing balancing, remove node and quit N I,J I %ZTPFLG("BAL")="" K ^%ZTSCH("LOADA",%ZTPAIR) Q L +^%ZTSCH("LOAD"):0 Q:'$T ;Get it next time S I=$O(^%ZTSCH("LOAD",0)),J=$G(^%ZTSCH("LOADA",%ZTPAIR)) S I=$P(J,"^",2)