*DECK HPPUTQ
USETEXT NIPDEF
USETEXT ACB 
USETEXT APPSTAT 
USETEXT DRHDR 
USETEXT FREETAB 
USETEXT MEM 
USETEXT NWLHEAD 
USETEXT NWLNTRY 
USETEXT STATTAB 
PROC HPPUTQ(TXTLN,ENTRIES) ;
  
 STARTIMS;
 #
*1DC  HPPUTQ
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HPPUTQ              L.T.NGUYEN          88/06/10 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR PROCESSING THE PUTQ WORKLIST 
*        FROM APPLICATION.
* 
*     3. METHOD USED. 
*          SET UP FOR READ
*          READ BLOCK 
*          PUT OTHER ENTRIES INTO THE NEW LARGER WORKLIST INCLUDING THE 
*        NETPUT TEXT
* 
*     4. ENTRY PARAMETERS.
*          ACBADDR           APPLICATION"S ACB
*          TXTLN             LENGTH OF THE NETPUT TEXT
*          ENTRIES           NUMBER OF ENTRIES IN THIS WORKLIST 
*          WLADDR            WORKLIST ENTRY 
* 
*     5. EXIT PARAMETERS. 
*          DONE              FALSE FOR THIS MULTIPLE WORKLIST WILL BE 
*                            PROCESSED LATER. 
*          ACBWLFWA          FWA OF NEW NWL 
*          ACBWLLWA          LWA OF NEW NWL 
*          ACBNWLE           NUMBER OF ENTRIES
*          WLADDR            ADDRESS OF CURRENT WORKLIST ENTRY
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        APPSTAT     ACB     DRHDR     FREETAB
*        NIPDEF    NWLHEAD   NWLNTRY
*        STATTAB
* 
*     7. ROUTINES CALLED. 
*          BRLBLK            XFER BLOCK FROM APP FL TO NIP FL 
*          HRELWWL           RELEASE WHOLE NWL
*          MGETS             ALLOCATE EMPTY BUFFER
*          MRELS             RELEASE BUFFER SPACE 
*          OMOVE             COPY INFORMATION 
*          OTIME             GET SYSTEM RTIME 
*          XTRACE            TRACES CALLS 
* 
*     8. DAYFILE MESSAGES.  NONE
*        THIS PROCEDURE IS CALLED BY HWLP 
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
 XREF BEGIN 
   PROC BRLBLK;              # READ BLOCK INTO NIP-S FL                #
   PROC HRELWWL;             # RELEASE WHOLE NWL                       #
   PROC MGETS;               # ALLOCATE EMPTY BUFFER                   #
   PROC MRELS;               # RELEASE UNUSED BUFFER SPACE             #
   PROC OMOVE;               # COPY INFORMATION                        #
   PROC XTRACE;              # TRACE CALLS                             #
   PROC OTIME;               # GET SYSTEM RTIME                        #
   END
# 
      FORMAL PARAMETERS 
# 
      ITEM TXTLN      U;     # LENGTH OF NETPUT TEXT IN CM WORDS       #
      ITEM ENTRIES    U ;    # NUMBER OF ENTRIES IN THIS PUTQ          #
# 
      LOCAL VARIABLES 
# 
      ITEM BUFADDR    U;     # FWA OF NEW NWL BUFFER                   #
      ITEM BUFSIZE    U;
      ITEM EXTRAWORD  U;     # SET TO ONE IF FRAGMENTED GET/PUT        #
  
      CONTROL IFEQ STAT,1;
        ARRAY STIME P(1);    # RTIME BUFFER FOR STARTING TIME          #
          BEGIN 
          ITEM SMILS U(0,24,36); # STARTING TIME IN MILLESECONDS       #
          END 
        ARRAY ETIME P(1);    # RTIME BUFFER FOR ENDING TIME            #
          BEGIN 
          ITEM EMILS U(0,24,36); # ENDING TIME IN MILLESECONDS         #
          END 
  
        ITEM STTEMP;         # TEMPORARY STATISTICS VARIABLE           #
      CONTROL FI; 
  
  
#**********************************************************************#
  
      BEGIN 
      CONTROL IFEQ DEBUG,1; 
        XTRACE("HPPUQ") ; 
      CONTROL FI; 
  
  
      CONTROL IFEQ STAT,1;
        OTIME(STIME);        # GET SYSTEM TIME AT BEGINNING OF PROC    #
      CONTROL FI; 
  
      P<NWLENTRY> = WLADDR; # FWA OF WORKLIST ENTRY                    #
      P<ACB> = ACBADDR; # FWA OF ACB                                   #
  
      BUFSIZE = TXTLN + NWLHSIZE + 1 ;
      MGETS(BUFSIZE,BUFADDR,TRUE);           # GET BUFFER FOR NEW NWL  #
  
      BRLBLK(BUFADDR+NWLHSIZE-ABHSIZE,TXTLN);  #  READ TEXT INTO NWL   #
  
      IF DONE 
      THEN # READ UCP FUNCTION COMPLETED                               #
        BEGIN 
        P<NWLHEADER> = BUFADDR ;       # MOVE THE HEADER TO NEW PLACE  #
        MNEW = P<NWLHEADER> ; 
        MOLD = ACBWLFWA[0] ;
        MSIZE = NWLHSIZE ;
        OMOVE ; 
  
        NWLBS[0] = BUFSIZE ;           # RESTORE BLOCK SIZE            #
        NWLNE[0] = ENTRIES ;
        P<NWLENTRY> = BUFADDR + NWLHSIZE  ;# FWA OF NWL ENTRY          #
        NWLEID[0] = NWLEIDVALUE; # RESET NWL ENTRY ID                  #
  
        HRELWWL; # RELEASE WHOLE PUTQ NWL                              #
  
        ACBNWLE [0] = ENTRIES + 1 ;         # INCLUDING THE PUTQ WL    #
        ACBWLFWA[0] = BUFADDR;
        ACBWLADR[0] = BUFADDR + NWLHSIZE ;   # CURRENT WORKLIST ADDRESS#
        ACBWLLWA[0] = BUFADDR + BUFSIZE - 1 ; 
        NEXTWLA = BUFADDR + NWLHSIZE ;       # NEXT ONE IS FIRST       #
        END 
  
      ELSE # UCP SWAPPED OUT, READ FUNCTION UNABLE TO COMPLETE         #
        BEGIN 
        BLKBS[0] = TXTLN + NWLHSIZE ; # RESTORE BUFFER SIZE            #
        MRELS(BUFADDR); # RELEASE NEW NWL BUFFER                       #
        END 
  
  
      CONTROL IFEQ STAT,1;
        OTIME(ETIME);        # GET SYSTEM TIME AT END OF PROCEDURE     #
        ST$NHR = ST$NHR + 1; # INCRMNT NUMBER OF TIMES HPPUTQ CALLD    #
        STTEMP = EMILS[0] - SMILS[0];  # TIME SPENT IN THIS ROUTINE    #
        ST$THR = ST$THR + STTEMP;  # TOTAL TIME SPENT IN THIS ROUTINE  #
        IF ST$LHR LS STTEMP 
        THEN                 # FOUND LARGER TIME INTERVAL IN ROUTINE   #
          BEGIN 
          ST$LHR = STTEMP;   # NEW LARGEST TIME INTERVAL               #
          END 
      CONTROL FI; 
  
      RETURN; 
      END 
      TERM
