*COMDECK PBMON
_$J+? 
_$R-,G-,I-? 
_ 
************************************************************************
*                                                                      *
*                    * *   P B M O N   * *                             *
*                                                                      *
*                    OPS MONITOR PROGRAM                               *
*                                                                      *
************************************************************************
*                                                                      *
** OVERVIEW -  THIS ROUTINE PROVIDES SERVICE TO EACH OPS LEVEL TASK.   *
*              A NON ZERO WORKLISTS QUEUED COUNT INDICATES THAT THE    *
*              TASK HAS WORK TO PERFORM.  THE WORKLIST IS EXTRACTED    *
*              FROM THE WORKLIST QUEUE AND PLACED IN THE INTERMEDIATE  *
*              ARRAY.  CONTROL IS THEN PASSED TO THE TASK HANDLER VIA  *
*              A DIRECT CALL.  TASKS ARE SERVICED IN ROTATION.         *
*              A TASK'S HANDLER PROGRAM IS CALLED ONCE FOR EACH        *
*              WORKLIST QUEUED, AND CAN BE CALLED UP TO BYMAXCNT TIMES *
*              EACH PASS OF THE MONITOR LOOP.                          *
*                                                                      *
** INPUT    -  WORKLIST CONTROL BLOCK ARRAY                            *
*                                                                      *
** OUTPUTS  -  CONTROL IS PASSED TO THE OPS LEVEL PROGRAMS             *
*              BTLOOP - COUNT OF NUMBER OF TIMES THROUGH OPS LOOP      *
*                                                                      *
************************************************************************
*                                                                      *
? 
PROCEDURE PBMON;
CONST 
      BTSETIME    = 8;                      _OPS FAILURE TIMEOUT = 4S  ?
      MASTERCLEAR = FALSE;                  _PBMON LOOPS UNTIL RELOAD  ?
VAR 
      BTFSTWLP : BYCBPTR;                   _FIRST WLCB ADDRESS        ?
      BTWLCNT  : INTEGER;                   _NR WLE TO PROCESS AT ONCE ?
  
BEGIN 
BTFSTWLP := BYCURWLP;                       _FIRST WLCB FOR LOOP CHECK ?
  
  REPEAT
  BYCURWLP := BYCURWLP'.BYACTCHN;           _NEXT ACTIVE MONITOR WLCB  ?
_ 
* * * *  SEE IF CYCLED THROUGH ALL WLCB-S 
? 
  IF BTFSTWLP = BYCURWLP
  THEN                                      _LOOKED AT ALL ACTIVE WLCBS?
    BEGIN 
    BTLOOP           := BTLOOP + 1;         _COUNT NR TIMES MON LOOPED ?
    BTMONOWN.BTTIMER := BTSETIME;           _RESET MONITOR DEAD TIMER  ?
_  *****  CAUTION - HIDDEN *IF DEF,TUP  *****                          ?
*IF DEF,TUP 
    IF JUTUPTABLE.JUSHLTFLG 
    THEN                                    _TUP SYSTEM HALT REQUESTED ?
      PBOPSHALT;
*ENDIF
_  *****  CAUTION - HIDDEN *ENDIF FOR TUP CODE  *****                  ?
    END;
  IF BYCURWLP'.BYCNT " 0
  THEN
_ 
* * * *  FOUND ACTIVE WLCB, MOVE WORKLIST ENTRY TO INTERMEDIATE ARRAY 
? 
    WITH BYCURWLP' DO                       _INDEX TO CURRENT WLCB     ?
      BEGIN 
      BTWLCNT := BYMAXCNT;                  _GET MAX NR WLE-S PER PASS ?
      IF BYCNT < BTWLCNT                    _IF NR WLE-S QUEUED IS     ?
      THEN                                  _LESS THAN MAX PER PASS    ?
        BTWLCNT := BYCNT;                   _PROCESS ONLY NR QUEUED    ?
      REPEAT
        BYMONACT := PBLSGET 
                      (BWWLENTRY [OPS],     _GET THE WLE AND CLEAR     ?
                       BYCURWLP');          _EXECUTING IN PBMON FLAG   ?
_ 
* * * *  SWITCH CONTROL TO WORKLIST PROCESSOR (MAY BE PAGED)
? 
        PBPSWITCH (BYPAGE);                 _SWITCH PAGE REGISTERS     ?
        PBCALL    (BYPRADDR);               _CALL WORKLIST PROCESSOR   ?
        BYMONACT  := TRUE;                  _DECLARE PBMON ACTIVE      ?
        BTWLCNT   := BTWLCNT - 1;           _DECREMENT REMAINING WLE-S ?
        PFWLCNT   := PFWLCNT + 1;           _COUNT NR PROCESSED WLE-S  ?
      UNTIL BTWLCNT = 0;
      END; _WITH BYCURWLP' DO?
  
  UNTIL MASTERCLEAR;
  
END; _PROCEDURE PBMON?
