*DECK HHIR
USETEXT NIPDEF
USETEXT ACB 
USETEXT APPSTAT 
USETEXT AT
USETEXT DRHDR 
USETEXT FREETAB 
USETEXT NWLHEAD 
USETEXT NWLNTRY 
USETEXT OVERLAY 
USETEXT PT
USETEXT STATTAB 
USETEXT SYSCOMD 
USETEXT SWAPIN
 PROC HHIR;                  # HOST INTERFACE ROUTINE                  #
 STARTIMS;
 #
*1DC  HHIR
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HHIR                E. GEE              78/02/07 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS THE TOP LEVEL HOST-SIDE PROCESSING ROUTINE. ALL
*        PROCESSING NEEDED TO HANDLE CPU PROGRAM ACCESS TO THE NETWORK
*        IS INITIATED FROM HERE.
* 
*     3. METHOD USED. 
*          CHECK TO SEE IF THERE IS WORK TO DO. I.E. GET NWL BUFFER OR
*            PROCESS WORKLIST FROM OPERATING SYSTEM 
*          IF NOTHING TO DO, GO INTO RECALL AND RETURN
*          GET SECOND NWL BUFFER
*            UNLESS ALREADY HAVE ONE, SO ONLY TWO WORKLISTS PROCESSED 
*            OR UNLESS IN SHUTDOWN MODE AND THERE IS NO OTHER WORKLIST
*              SO THAT ONLY ONE WORKLIST IS PROCESSED DURING SHUTDOWN 
*          IF NIP HAS A WORKLIST TO PROCESS, EXECUTE THE FOLLOWING
*          STEPS: 
*            IF SECOND NWL EXISTS AND NOT IN SHUTDOWN, RESET
*              RA.SSC TO POINT TO SECOND NWL
*              SO OPERATING SYSTEM CAN SEND ANOTHER WORKLIST FOR NIP
*              TO PROCESS WHILE NIP IS PROCESSING FIRST ONE 
*            IF NETOFF WORKLIST, CALL HPNOFF TO PROCESS IT
*            IF NETON WORKLIST, CALL HPNON TO PROCESS IT
*            IF NORMAL WORKLIST, VERIFY WORKLIST IS OKAY, SET FIELDS
*              IN ACB, AND CALL HWLP TO PROCESS THE WORKLIST
*            IF APPLICATION IS TO BE ABORTED, CALL XABTAPP TO DO IT 
*            IF APPLICATION HAS FAILED, CALL HAPFAIL TO PROCESS IT
*          GET NEW NWL UNLESS IN SHUTDOWN MODE. 
*          SWITCH NWL PTR WITH SECOND NWL PTR 
*            SO NEXT NWL TO BE PROCESSED IS OLDER ONE 
*          SET UP RA.SSC IF NOT PREVIOUSLY DONE 
* 
*     4. ENTRY PARAMETERS.
*          NWLADDR           BUFFER TO HOLD SCP REQUEST 
*          NWLPN             PROCESS NUMBER OF APPLICATION AFTER NETON
*          NWLSIZE
*          SSCWORD           LOCATION OF SUBSYSTEM CALL WORD
* 
*     5. EXIT PARAMETERS. 
*          NWLADDR           LOCATION FOR AWL 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     APPSTAT     AT 
*        DRHDR     NIPDEF     NWLHEAD 
*        NWLNTRY     OVERLAY     PT 
*        STATTAB     SYSCOMD
*        DRHDR        MSGIDX    NIPDEF
*        NWLHEAD   NWLNTRY   OVERLAY   PARAMP 
*        PARAMS    PT        STATTAB   SYSCOMD
* 
*     7. ROUTINES AND OVERLAYS CALLED.
*          HAPFAIL    OVL    PROCESS AN APPLICATION FAILURE 
*          HPNOFF     OVL    PROCESS A *NETOFF* WORKLIST ENTRY
*          HPNON      OVL    PROCESS A *NETON* WORKLIST ENTRY 
*          HWLP              PROCESS WORKLIST 
*          OTIME             GET SYSTEM RTIME 
*          OVLCALL           LOAD OVERLAY 
*          XABTAPP    OVL    ABORT THE APPLICATION
*          XTRACE            TRACES CALLS 
* 
*     8. DAYFILE MESSAGE.  NONE 
*        THIS PROCEDURE IS CALLED BY XEXEC. 
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
 XREF BEGIN 
   PROC HWLP;                # PROCESS WORKLIST                        #
   PROC MGETS;               # ALLOCATE EMPTY BUFFER                   #
   PROC MRELS ; 
   PROC OSCHAPP;             # SCHEDULE APPLICATION                    #
      PROC OTIME;            # GET SYSTEM RTIME                        #
   PROC OVLCALL;             # LOAD AND EXECUTE OVERLAY                #
   PROC HGETNWL;             # UPDATE RA.SSC WORD                      #
   PROC XRECALL;             # RECALL                                  #
   PROC XTRACE;              # TRACE CALLS                             #
   END
# 
                    INTERNAL VARIABLES
# 
      ITEM AN         U;     # APPLICATION NUMBER                      #
      ITEM NEXTNWL    U;     # NEXT NWL BUFFER ADDRESS                 #
      ITEM HOSTSD     B;     # HOST SHUTDOWN INDICATOR                 #
  
      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("HHIR ") ; 
      CONTROL FI; 
  
      IF SSCLK[0] 
      THEN # RECEIVED NEW NETWORK WORKLIST FROM APPLICATION            #
        BEGIN # PROCESS INCOMING WORKLIST                              #
  
        CONTROL IFEQ STAT,1;
          OTIME(STIME);      # GET SYSTEM TIME BEFORE PROCESSING WKLST #
        CONTROL FI; 
  
        HOSTSD = SHUTDOWN;
        NWLADDR = SSCAP[0] - BLKHSIZE; # FWA OF NWL                    #
# 
        PRESET ABORT PARAMETERS IN CASE APPLICATION IS TO BE ABORTED
# 
        ABTADDR = NWLADDR; # FWA OF BUFFER TO HOLD SF.REGR SCP FUNC    #
        ABTSIZE = SIZENWL; # SIZE OF SF.REGR SCP BUFFER                #
  
        P<DRHDRWD> = 0; 
        NEXTNWL = NEXTPTR[NWLADDR]; # NEXT FREE BUFFER AVAILABLE       #
  
        IF NOT HOSTSD 
        THEN # HOST NOT IN LOCAL SHUTDOWN MODE                         #
          BEGIN # TWO NWL WORKLISTS MAY BE OUTSTANDING AT ANY ONE TIME #
          HGETNWL(NEXTNWL); # UPDATE RA.SSC WORD TO PROVIDE NEW NWL    #
          END 
  
        P<NWLHEADER> = NWLADDR; # FWA OF NWL                           #
# 
        CHECK IF APPLICATION HAS FAILED 
# 
          IF NWLSTAT[0] NQ 0
          THEN               # APPLICATION HAS FAILED                  #
            FAILADR = NWLADDR; # NETWORK WORKLIST ADDRESS              #
  
          ELSE
            BEGIN 
# 
            CHECK IF APPLICATION IS REQUESTING NETOFF 
# 
            P<NWLENTRY> = NWLADDR + NWLHSIZE; 
            IF NWLOP[0] EQ WLOPNOFF 
            THEN
              BEGIN          # PROCESS NETOFF                          #
              OVLNAME = HPNOFFP; # NAME OF OVERLAY PROGRAM TO LOAD     #
              OVLCALL;       # LOAD AND EXECUTE OVERLAY                #
              END 
  
            ELSE
              BEGIN 
# 
              CHECK IF APPLICATION IS REQUESTING NETON
# 
              AN = NWLPN[0]; # APPLICATION NUMBER                      #
              IF AN EQ 0
              THEN
                BEGIN # ONLY NETON IS ALLOWED                          #
                IF NWLOP[0] EQ WLOPNON
                THEN
                  BEGIN      # PROCESS NETON                           #
                  OVLNAME = HPNONP; # NAME OF OVERLAY PROGRAM TO LOAD  #
                  OVLCALL;   # LOAD AND EXECUTE OVERLAY                #
                  END 
  
                ELSE         # ABORT APP CAUSE IT HAS NOT NETTED ON    #
                  ABTAPPF = XNOTNETON; # SET ABORT-APPLICATION FLAG    #
                END 
  
              ELSE # APPLICATION NETTED ON                             #
                BEGIN 
# 
              VALIDATE WORKLIST 
# 
                IF AN GR ATHAN[0] 
                THEN # APPLICATION NUMBER UNKNOWN                      #
                  ABTAPPF = XBADPN; # SET ABORT-APPLICATION FLAG       #
  
                ELSE
                  BEGIN 
                  ACBADDR = ATACBA[AN]; # FWA OF APPLICATION-S ACB     #
                  P<ACB> = ACBADDR; 
                  IF NWLOP[0] EQ WLOPRSET 
                  THEN
                    BEGIN         # RESET WORKLIST COMING IN           #
                    IF P<ACB> NQ 0
                    THEN
                      BEGIN 
                      IF ACBWLFWA[0] NQ 0 
                      THEN
                        BEGIN          # RELEASE THE WHOLE WL          #
                        P<DRHDRWD> = ACBWLFWA[0] ;
                        BLKBS  [0] = ACBWLLWA[0] - P<DRHDRWD> + 1 ; 
                        MRELS(P<DRHDRWD>) ; 
                        ACBNWLWD[0] = 0 ; 
                        END            # RELEASE THE WHOLE WORKLIST    #
  
                      IF ACBFLIST[0] NQ 0 
                      THEN
                        BEGIN 
                        MRELS(ACBFLIST[0]) ;
                        ACBFLIST[0] = 0 ; 
                        END 
  
                      END 
                    ATASBR[AN] = FALSE;     # CLEAR NETWAIT FLAG IF SET#
                    END           # RESET WORKLIST                     #
                  IF P<ACB> EQ 0 # APPLICATION NOT EXISTS              #
                    OR ACBJNWD[0] NQ NWLJOBID[0] # BAD APP NUMBER      #
                    OR ATNVFN[AN] # APPLICATION NETTED OFF             #
                  THEN # ABORT MISBEHAVED APPLICATION                  #
                    ABTAPPF = XBADPN; 
  
                  ELSE
                    BEGIN 
                    IF ACBWLFWA[0] NQ 0 
                    THEN     # NIP IS STILL PROCESSING EARLIER WORKLIST#
                      ABTAPPF = XOSWL; # SO ABORT ILL-BEHAVED APP      #
  
                    ELSE # NO OUTSTANDING WORKLIST EXISTS              #
                      BEGIN 
                      IF NWLAWLADDR[0] EQ 0 
                      THEN   # NO ADDRESS WAS SPECIFIED TO WRITE AWL   #
                        ABTAPPF = XNOAWLA;
  
                      ELSE # VALID WORKLIST FROM APPLICATION           #
                        BEGIN 
                        IF ATASBI[AN] 
                        THEN  # SWAPIN PREVIOUSLY ISSUED FOR APP       #
                          BEGIN 
                          IF ACBSCPCB[0] EQ 0 
                          THEN  # SWAPIN NOT COMPLETE YET              #
                            BEGIN  # WAIT FOR SWAPIN TO COMPLETE       #
                            XRECALL(LOC(ACBSCPCB[0]));  # ENTER RECALL #
                            END 
                          ATASBSO[AN] = FALSE;  # CLEAR SWAPPED OUT FLG#
                          ATASBI[AN] = FALSE;  # CLEAR SWAP IN FLAG    #
                          ACBID[0] = ACBIDVALUE;  # RESTORE ACB ID     #
                          END 
                        ACBUCPADR[0] = NWLHADDR[0]; # UCP COMP BIT ADR #
                        ACBNWLE[0] = NWLNE[0]; # NUMBER OF ENTRIES     #
                        ACBWLFWA[0] = NWLADDR;   # FWA OF NWL          #
                        ACBWLADR[0] = NWLADDR + NWLHSIZE; 
                        ACBWLLWA[0] = NWLADDR + SIZENWL - 1; # LWA NWL #
                        ACBAWLADDR[0] = NWLAWLADDR[0];
  
                        HWLP; # PROCESS ALL NWL ENTRIES                #
  
                        END 
                      END 
                    END 
                  END 
                END 
              END 
            END 
# 
          CHECK IF APPLICATION IS TO BE ABORTED 
# 
          IF ABTAPPF NQ 0 
          THEN
            BEGIN            # ABORT APPLICATION                       #
            OVLNAME = XABTAPPP; # NAME OF OVERLAY PROGRAM TO LOAD      #
            OVLCALL;         # LOAD AND EXECUTE OVERLAY                #
            END 
# 
          CHECK IF APPLICATION HAS FAILED 
# 
          IF FAILADR NQ 0 
          THEN
            BEGIN            # PROCESS APPLICATION FAILURE             #
            OVLNAME = HAPFAILP; # NAME OF OVERLAY PROGRAM TO LOAD      #
            OVLCALL;         # LOAD AND EXECUTE OVERLAY                #
            END 
  
        IF HOSTSD 
        THEN # NAM IS IN LOCAL SHUTDOWN MODE                           #
          BEGIN # ONLY ONE WORKLIST MAY BE OUTSTANDING                 #
          HGETNWL(NEXTNWL); # UPDATE RA.SSC TO PROVIDE NEW NWL BUFFER  #
          END 
  
  
        CONTROL IFEQ STAT,1;
          OTIME(ETIME);      # GET SYSTEM TIME AFTER PROCESSING WORKLST#
          STTEMP = EMILS[0] - SMILS[0]; 
          IF STTEMP GR ST$LHI 
          THEN               # FOUND LARGER TIME INTERVAL              #
            BEGIN 
            ST$LHI = STTEMP; # LARGEST TIME INTERVAL                   #
            END 
          IF STTEMP GR 200
          THEN               # SPENT MORE THAN .2 SECONDS IN INTERVAL  #
            BEGIN 
            ST$MHI = ST$MHI + 1; # INCREMENT NO OF TIMES GREATER .2 SEC#
            END 
          ST$THI = ST$THI + STTEMP;  # INCREMENT TOTAL TIME PROCESSING #
        CONTROL FI; 
  
        END # END NWL WORKLIST PROCESSING                              #
  
      ELSE                   # NO INCOMING WORKLIST TO PROCESS         #
        BEGIN 
  
        CONTROL IFEQ STAT,1; # STATISTICS ON                           #
          ST$ESB = ST$ESB + 1; # INCR NO OF TIMES WORKLIST FOUND EMPTY #
        CONTROL FI; 
  
        END 
  
# 
      CHECK FOR NETWORK SHUTDOWN
# 
      IF SHUTDOWN 
        AND ATENTRYW[NVFAN] EQ 0 # NVF NETTED OFF                      #
        AND SWAPINFP EQ 0        # NO-ACB-SWAPIN-RING NOT EXIST        #
      THEN
        BEGIN                # PROCESS NETWORK TERMINATION             #
        OVLNAME = XENDNAMP; 
        OVLCALL;
        END 
  
      RETURN; 
      END 
      TERM
