*DECK HALLOCN
USETEXT ACB
USETEXT ACNB
USETEXT ACNT
USETEXT DUMPFLG
USETEXT KDIS
USETEXT KHDRX
USETEXT NIPDEF
USETEXT PARAMS
USETEXT APPSTAT
PROC HALLOCN(ACBAD,ACN); # ALLOCATE CONNECTION NUMBER #
STARTIMS;
#
*1DC HALLOCN
* 1. PROC NAME AUTHOR DATE
* HALLOCN C. BITTNER 81/12/01
*
* 2. FUNCTIONAL DESCRIPTION
* ALLOCATE APPLICATION CONNECTION NUMBER
*
* 3. METHOD
* CHECK IF ACNT HAS A FREE ENTRY (IF NOT THEN EXPAND
* ACNT)
* FIND NEXT FIRST FREE CONNECTION NUMBER
* UPDATE HIGHEST CONNECTION NUMBER IN USE
* INITIALIZE STATES IN ACNT
* UPDATE TOTAL NUMBER OF CONNECTIONS IN ACB
* UPDATE K-DISPLAY BUFFER
*
* 4. ENTRY PARAMETERS
* ACBAD ADDRESS OF ACB TO ALLOCATE ACN FOR
*
* 5. EXIT PARAMETERS
* ACN APPLICATION CONNECTION NUMBER ASSIGNED
* = 0 IF NO CONNECTION NUMBER ASSIGNED
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED
* ACB
* ACNB
* ACNT
* NIPDEF
* PARAMS
* APPSTAT
* KDIS
*
* 7. ROUTINES AND OVERLAYS CALLED
* KPUT - UPDATE K-DISPLAY BUFFER
* MGROW - EXPAND BUFFER
* XTRACE - RECORD PROCEDURE CALL
*
* 8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION
* THIS PROCEDURE IS CALLED BY PROC BLDACNB.
*
#
STOPIMS;
#
EXTERNAL VARIABLES
#
XREF
BEGIN
PROC ABORT; # ABORT NIP #
PROC KPUT ;
PROC MGROW; # EXPAND BUFFER #
PROC XTRACE; # RECORD PROCEDURE CALL #
END
#
INTERNAL VARIABLES
#
ITEM ACBAD; # ACB ADDRESS #
ITEM ACN; # APPLICATION CONNECTION NUMBER #
ITEM ACNTINDX; # INDEX INTO ACNT #
ITEM ESIZE; # SIZE TO EXPAND ACNT #
ITEM FFCNFOUND B; # FIRST FREE CN FOUND FLAG #
ITEM FLAG; # FLAG RETURNED IF MOVE SUCCESSFUL - MGROW#
ITEM INDX; # INDUCTION LOOP VARIABLE #
ITEM NUMACN; # NUMBER OF AVAILABLE CONNECTION NUMBERS #
#**********************************************************************#
BEGIN
CONTROL IFEQ DEBUG,1;
XTRACE("HLOCN") ;
CONTROL FI;
FFCNFOUND = FALSE; # INITIALIZE FIRST FREE CN FOUND FLAG #
P<ACB> = ACBAD; # ACB ADDRESS #
P<ACNT> = ACBACNT[0]; # BASE ACNT #
NUMACN = ACNTMAXCN[0] - (ACNTBS[0] - ACNTHSIZE);
ACNTINDX = ACNTFFCN[0] + ACNTHSIZE - ACNTMINACN[0]; # ACNT INDX #
IF ACNTNFE[0] EQ 0
THEN
BEGIN # ACNT IS FULL #
IF NUMACN LQ 0
THEN # MAXIMUM NO OF CONNECTIONS REACHED #
BEGIN
ACN = 0; # NO ACN ASSIGNED - REACHED MAX ALREADY #
RETURN ;
END
IF NUMACN GQ ACNTESIZE
THEN
ESIZE = ACNTESIZE;
ELSE # HAVE LESS THAN ACNTESIZE CONN LEFT #
ESIZE = NUMACN; # MAX ADDITION TO ACNT TABLE #
MGROW(P<ACNT>,ACNTBS[0] + ESIZE,FLAG); # EXTEND BUFFER #
ACBACNT[0] = P<ACNT>; # SET NEW ACNT ADDRESS #
ACNTFFCN[0] = ACNTFFCN[0] + 1; # UPDATE FIRST FREE CN #
ACNTNFE[0] = ESIZE - 1; # UPDATE NO FREE ENTRIES #
END
ELSE
BEGIN # ENTRIES AVAILABLE IN ACNT #
IF ACNTNFE[0] EQ 1
THEN
BEGIN # LAST AVAILABLE ENTRY IS BEING USED #
ACNTFFCN[0] = ACNTBS[0] - ACNTHSIZE + ACNTMINACN[0];
FFCNFOUND = TRUE; # SET FIRST FREE CN FOUND FLAG #
ACNTNFE[0] = 0;
END
# FIND FIRST FREE CN #
FOR INDX = ACNTINDX + 1 STEP 1 WHILE NOT FFCNFOUND DO
BEGIN
IF ACNTWD[INDX] EQ 0
THEN
BEGIN
ACNTFFCN[0] = INDX - ACNTHSIZE + ACNTMINACN[0];
# UPDATE FIRST FREE CN #
ACNTNFE[0] = ACNTNFE[0] - 1; # UPDATE NO FREE ENTRIES #
FFCNFOUND = TRUE;# SET FIRST FREE CN FOUND FLAG #
END
END
END
ACN = ACNTINDX - ACNTHSIZE + ACNTMINACN[0]; # APPL CONN NO #
IF ACN GR ACNTHCN[0]
THEN # UPDATE HIGHEST CONNECTION NUMBER #
ACNTHCN[0] = ACN;
ACNTCS[ACNTINDX] = STATX; # INITIALIZE CONNECTION STATE #
ACNTIS[ACNTINDX] = STATX; # INITIALIZE IVT STATE #
ACNTABO[ACNTINDX] = 0; # APPL BLK OUTSTANDING COUNT #
RETURN ;
END
TERM