*DECK,SELQFIL 
USETEXT COMCBEG 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQPID 
USETEXT COMQSCH 
USETEXT COMQSEL 
      PROC SELQFIL; 
        BEGIN    # SELQFIL #
# 
**    SELQFIL    SELECT NEW QUEUE FILES.
* 
*     INITIATES A QUEUE FILE SELECTION CYCLE. 
* 
*     PROC SELQFIL
* 
*     ENTRY      NONE.
* 
*     EXIT       NONE.
* 
*     PROCESS    /INITIALIZE-SELECTION-CYCLE/ 
*                  FOR ALL PIDS:  
*                    FOR EACH SELECTION-CLASS:  
*                      IF NOT (PID.DISABLED 
*                           OR PID.ALL-LIDS-DISABLED
*                           OR PID.SELECTION-CLASS.IN-USE 
*                           OR PID.SELECTION-CLASS.DISABLED 
*                           OR SELECTION-CLASS.DISABLED): 
*                         SET SELECTION-CLASS IN
*                             PID-CLASS-AVAIL-SET.
*                  SET CURRENT-CLASS TO FIRST.
* 
*                WHILE ACNS-IN-USE < MAXIMUM-CONNECTION-COUNT:  
*                  CALL GETSELC TO GET-NEXT-AVAILABLE-SELECTION-CLASS 
*                      USING (PID-CLASS-AVAIL-SET, CURRENT-CLASS) 
*                  IF NO SELECTION-CLASS AVAILABLE: 
*                    EXIT /WHILE/ 
*                  FOR ALL PIDS:  
*                    IF PID.SELECTION-CLASS.COVERED 
*                      CYCLE /FOR/
*                    SET FILEFTS TO INITIAL STATE 
*                    CALL CKEVNTI TO PROCESS FILE STATE THROUGH SFILI 
*                    IF FILE-FOUND (-> CONNECTION-IN-PROGRESS): 
*                      CYCLE /WHILE/
* 
*     NOTE       THE CALL TO CKEVNTI SERVES TWO PURPOSES: 
* 
*                1. SFILI IS CALLED TO PROCESS THE FILE TABLE ENTRY.
*                   EVENTUALLY QAC/QAF IS CALLED. 
* 
*                   AFTER QAC IS CALLED AND THE REPLY PROCESSED,
*                   QACRESP SETS ONE OF THREE POSSIBLE STATES IN FILEQAR
* 
*                     A). FILE FOUND
*                     B). INVALID FILE FOUND (USER NOT VALIDATED, 
*                         UNKNOWN DISPOSITION CODE, ETC.) 
*                     C). NO FILE FOUND (ALSO USED FOR UNEXPECTED 
*                         QAC ERRORS AND INVALID FILE NAME CASES).
* 
*                   FOR EACH OF THESE CASES, SFILI PERFORMS THE 
*                   FOLLOWING ACTIONS AND, BY THE TIME CKEVNTI
*                   RETURNS, THE FILE TABLE ENTRY WILL BE IN ONE
*                   OF THE FOLLOWING STATES:  
* 
*                     A). CON/ACRQ/R ISSUED TO ACCESS METHOD, 
*                         ACNS-IN-USE INCREMENTED - 
*                         FILEFTS = WAITING FOR NETWORK MESSAGE 
*                     B). CONNECTION LOG FILE ISSUED, FILE EVICTED -
*                         FILEFTS = VACANT
*                     C). FILE REQUEUED, IF PRESENT - 
*                         FILEFTS = VACANT. 
* 
*                2. CKEVNTI SERVICES ANY OTHER ACTIVE CONNECTIONS,
*                   INCLUDING NETGETL (AND IMPLICIT NETXFRC) CALLS
*                   THROUGH NMSG. 
* 
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC CKEVNTI;              # CHECK FOR EVENT - CALL SFILI # 
        FUNC GETAFT    U;          # GET VACANT FILE TABLE ENTRY #
        PROC GETSELC;              # GET AVAILABLE SELECTION CLASS #
        PROC NAME;                 # DEBUG CODE # 
        FUNC TIMADT    U;          # ADJUST TIMER # 
        END 
  
# 
****  XREF END
# 
  
      ITEM AFTINDEX   U;           # FILE TABLE ENTRY INDEX # 
      ITEM AVLPIDSELS U;           # SET OF AVAILABLE SEL CLASSES # 
      ITEM DOWHILE    B;           # LOOP CONTROL # 
      ITEM NOSELAVAIL B;           # TRUE IF NO SELECTION CLASS AVAIL # 
      ITEM NUMPIDS    U;           # NUMBER OF PIDS # 
      ITEM PLTPTR     U;           # POINTER TO CURRENT PID ENTRY # 
      ITEM RESET      B;           # TRUE IF TIME TO RECHECK ALL #
      ITEM SELCLASS   U;           # CURRENT SELECTION CLASS #
      ITEM WHILEAFT   U;           # OUTER LOOP VARIABLE #
  
        $BEGIN
        NAME("SELQFIL");           # DEBUG CODE # 
        $END
  
      IF (ACNNO GE SCHMAXCONS)     # IF NO FREE SLOTS AVAILABLE # 
        OR IDLE                    #   OR IDLE-DOWN-IN-PROGRESS # 
      THEN
        BEGIN 
        RETURN; 
        END 
  
      IF (PIDSELQTIM EQ 0)         # IF FIRST TIME CALLED # 
        OR (TIMADT(SCHSELSECS, PIDSELQTIM) EQ 0)
      THEN
        BEGIN 
        PIDSELQTIM = TIMT;         # UPDATE TIME #
        RESET = TRUE;              # CLEAR COVERED SETS # 
        END 
  
      ELSE
        BEGIN 
        RESET = FALSE;
        END 
  
      AVLPIDSELS = 0; 
      NUMPIDS = PIDNPID;           # NUMBER OF PIDS # 
      PLTPTR = PIDLPID;            # POINTER TO LAST PID EXAMINED # 
      ASLONGAS NUMPIDS GT 0 
      DO
        BEGIN 
        NUMPIDS = NUMPIDS - 1;     # DECREMENT PID COUNT #
        P<PLTHDR> = PLTPTR;        # POINT TO LAST EXAMINED # 
        PLTPTR = PLTNXTPID;        # POINT TO NEXT IN LIST #
        P<PLTHDR> = PLTPTR; 
        IF RESET
        THEN
          BEGIN 
          PLTSCCOVER = 0; 
          END 
  
        IF NOT PLTIGNORE
        THEN
          BEGIN 
          AVLPIDSELS = AVLPIDSELS LOR ( ( (2**MXSEL) - 1) 
                       LXR (PLTSCCOVER LOR PLTSCINUSE LOR PLTSCDISAB) );
          END 
  
        END 
  
      SELCLASS = 0; 
      DOWHILE = (AVLPIDSELS NE 0); # EXIT IF NO AVAILABLE CLASSES # 
      SLOWFOR WHILEAFT = 0 WHILE (DOWHILE AND (NOT IDLE) )
      DO
        BEGIN 
        AFTINDEX = GETAFT;         # GET FREE AFT # 
        IF AFTINDEX EQ 0           # IF ACNS-IN-USE GE MAXCONS #
        THEN
          BEGIN 
          DOWHILE = FALSE;
          CYCLE WHILEAFT;          # EXIT LOOP #
          END 
  
        P<FILETAB> = AFT[AFTINDEX]; 
        GETSELC(AVLPIDSELS, (SCHMAXCONS - ACNNO), 
                SELCLASS, SELCLASS, NOSELAVAIL);
        IF NOSELAVAIL 
        THEN
          BEGIN 
          DOWHILE = FALSE;         # EXIT LOOP #
          CYCLE WHILEAFT; 
          END 
  
        NUMPIDS = PIDNPID;         # NUMBER OF PIDS # 
        PLTPTR = PIDLPID;          # POINTER TO LAST PID EXAMINED # 
        ASLONGAS NUMPIDS GT 0 
        DO
          BEGIN 
          NUMPIDS = NUMPIDS - 1;   # DECREMENT PID COUNT #
          P<PLTHDR> = PLTPTR;      # POINT TO LAST EXAMINED # 
          PLTPTR = PLTNXTPID;      # POINT TO NEXT IN LIST #
          P<PLTHDR> = PLTPTR; 
          IF ( (PLTSCCOVER LOR PLTSCINUSE LOR PLTSCDISAB) 
               LAN (2**SELCLASS) ) NE 0 
          THEN
            BEGIN 
            CYCLE;                 # ASLONGAS # 
            END 
  
          FILESEL = SELCLASS;      # SET SELECTION CLASS #
          FILECPD = PLTPID;        # SET PID #
          FILEFTS = FTS$INIT;      # INITIAL STATE #
          CKEVNTI;                 # CALL SFILI FOR ALL SLOTS/CALL QAC #
          P<PLTHDR> = PLTPTR;      # RESTORE BASED ARRAY POINTERS # 
          P<FILETAB> = AFT[AFTINDEX]; 
          IF (FILEFTS NE FTS$VACANT)  # IF FILE FOUND # 
            OR IDLE                #   OR IDLEDOWN-IN-PROGRESS #
          THEN
            BEGIN 
            PIDLPID = PLTPTR;      # START SEARCH AT NEXT PID # 
            CYCLE WHILEAFT;        # REEVALUATE SELECTION CLASSES # 
            END 
  
          END  # ASLONGAS ALL PIDS #
  
        SELCLASS = SELCLASS + 1;   # TRY NEXT SELECTION CLASS # 
        END  # WHILEAFT # 
  
      END  # SELQFIL #
    TERM
