*DECK HPWAIT
USETEXT NIPDEF
USETEXT ACB 
USETEXT AT
USETEXT APPSTAT 
USETEXT FLIST 
USETEXT NWLNTRY 
USETEXT PT
USETEXT SYSTIME 
 PROC HPWAIT;                # PROCESS A *NET WAIT*                    #
  
 STARTIMS;
 #
*1DC  HPWAIT
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HPWAIT              P. C. TAM           78/02/15 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR PROCESSING A *NET WAIT* WORK 
*        LIST ENTRY.
* 
*     3. METHOD USED. 
*         IF NOT A FORCED NETWAIT AND DATA IS AVAILABLE,THEN UPDATE 
*         WORKLIST POINTERS AND RETURN
*         COMPUTE WAIT TIME 
*         SWAPOUT IF WAIT TIME IS GREATER THAN NTINE
* 
*     4. ENTRY CONDITIONS.
*          ACBADDR           ACB ADDRESS
*          WLADDR            WORKLIST ADDRESS 
* 
*     5. EXIT CONDITIONS
*          DONE              FALSE
*          FAILADDR          ACBADDR IF SWAPOUT RESPONSE IS RCUCPGONE 
*          ATASBF            TRUE, FOR A FORCED NETWAIT 
*          ATASBW            TRUE, FOR NETWAIT WITHOUT SWAPOUT
*          ATASBR            TRUE, FOR FORCED NETWAIT GR NTIME,DEFAULT=2
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     AT     APPSTAT   DUMPFLG   FLIST 
*        NIPDEF              CONSTANT DEFINITIONS 
*        NWLNTRY             NWL ENTRY TEMPLATE 
*        PT                  POINTER TABLE
*        SYSTIME             SYSTEM TIME TABLE
* 
*     7. ROUTINES CALLED. 
*          MGETS             ALLOCATE EMPTY BUFFER
*          MRELS             RELEASE BUFFER SPACE 
*          OSCCALL           ISSUE SCP FUNCTION 
*          RDUMP             DUMP NIP-S FIELD LENGTH
*          XTRACE            TRACES CALLS 
* 
*     8. DAYFILE MESSAGES.  NONE
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
      XREF
        BEGIN 
        PROC HRELWWL;        # RELEASE NETWORK WORKLIST BUFFER         #
        PROC OSCCALL;        # ISSUE SYSTEM CONTROL POINT REQUEST      #
        PROC XTRACE;         # TRACE CALL                              #
        END 
# 
      LOCAL VARIABLES 
# 
      ITEM APPNUM;           # APPLICATION NUMBER                      #
      ARRAY FL$BUF S(3);
        BEGIN 
        ITEM FL$WORD U(00,00,60); 
        END 
  
      CONTROL EJECT;
  
      BEGIN # HPWAIT #
  
      CONTROL IFEQ DEBUG,1; 
      XTRACE("HWAIT");
      CONTROL FI; 
  
      P<ACB> = ACBADDR; 
      P<NWLENTRY> = WLADDR; 
      APPNUM = ACBAN[0];     # APPLICATION NUMBER                      #
  
      IF NOT NWLFLAG
        AND ( (ACBSMQ[0] NQ 0)         # ASYNC SUP MSGS QUEUED         #
           OR ( (ACBPDATA[0])          # DELIVERABLE DATA QUEUED       #
            AND (NWLWTDEL[0]) )        # SWAPOUT IF NO DELIVERABLE DATA#
           OR ( (ACBBLKSQ[0] NQ 0)     # DATA MSGS QUEUED              #
            AND (NOT NWLWTDEL[0] ) ) ) # IGNORE DELIVERABLE DATA FLAG  #
      THEN # NOT FORCED NETWAIT AND MESSAGE(S) QUEUED                  #
        DONE = TRUE; # DO NOT HONOR NETWAIT REQUEST                    #
  
      ELSE #FORCED NETWAIT REQUEST OR NO MESSAGE QUEUED FOR APP        #
        BEGIN 
        IF NWLTIME LQ 1 
        THEN # NETWAIT TIME MUST BE ONE SECOND OR MORE                 #
          BEGIN 
          NWLTIME = 1;
          NWLFLAG = TRUE; # SET FORCED NETWAIT MODE                    #
          END 
        ACBNTL[0] = RTSECS + NWLTIME; # SET NETWAIT TIMER IN ACB       #
        ATASBF[APPNUM] = NWLFLAG; # SET FORCED NETWAIT MODE            #
  
        IF NWLTIME GR NTIME 
        THEN # SWAP OUT APPLICATION                                    #
          BEGIN 
          ATASBW[APPNUM] = FALSE; 
          P<FLHEAD> = LOC(FL$BUF); # FWA OF SCP REQUEST BLOCK          #
          FLJOBID[0] = ACBJNWD[0]; # SET JOB ID                        #
          P<FLE> = LOC(FLFW[0]);
          FLFC[0] = SFSWPO; # SET SCP FUNCTION CODE                    #
          OSCCALL(FLE); # ISSUE SCP SWAPOUT REQUEST                    #
          IF FLRC[0] NQ 0 
            AND FLRC[0] NQ RCSWAPPEDOUT 
          THEN
            BEGIN 
            IF FLRC[0] EQ RCUCPGONE 
               OR FLRC[0] EQ RCSTCBAD 
            THEN
              BEGIN 
              FAILADR = ACBADDR;
              GOTO EXIT;
              END 
            END 
          ATASBR[APPNUM] = TRUE; # SET APPLICATION ROLLED OUT FLAG     #
          END 
  
        ELSE # NO SWAP OUT ISSUED ON APPLICATION, SET WAIT FLAG        #
          ATASBW[APPNUM] = TRUE;
  
        DONE = FALSE; # DISABLE FURTHER WORKLIST ENTRY PROCESSING      #
        ACBNWLE[0] = ACBNWLE[0] - 1; # DECREMENT WORKLIST ENTRY COUNT  #
        IF ACBNWLE[0] EQ 0
        THEN # ALL WORKLIST ENTRY(S) PROCESSED                         #
          HRELWWL; # RELEASE WORKLIST BUFFER                           #
        ELSE # STILL KORE WORKLIST ENTRY TO PROCESS                    #
          ACBWLADR[0] = NEXTWLA;
        END 
  
EXIT: 
      RETURN; 
      END # HPWAIT #
      TERM
