*DECK RELACNB
USETEXT NIPDEF
USETEXT ACB
USETEXT ACNB
USETEXT ACNT
USETEXT AT
USETEXT DRHDR
USETEXT KDIS
USETEXT KHDRX
USETEXT NCNB
PROC RELACNB(ACNBADR,SWFLAG,LNFLAG); # RELEASE ACNB #
STARTIMS;
#
*1DC RELACNB
*
* 1. PROC NAME AUTHOR DATE
* RELACNB C. BITTNER 81/04/07
*
* 2. FUNCTIONAL DESCRIPTION
* RELEASE THE APPLICATION CONNECTION BLOCK (ACNB)
*
* 3. METHOD USED
* CHECK IF ACNT CAN BE SHRUNK. IF NOT, UPDATE ACNT
* HEADER INFORMATION. RELEASE DATA RING AND ACNB.
* DECREMENT TOTAL NUMBER OF CONNECTIONS IN THE ACB.
*
* 4. ENTRY PARAMETERS
* ACNBADR ADDRESS OF ACNB TO RELEASE
* SWFLAG FLAG TO INDICATE IF SWITCHING CONNECTION
* LNFLAG FLAG TO INDICATE IF LOANING CONNECTION
*
* 5. EXIT PARAMETERS
* NONE
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED
* NIPDEF ACNT
* ACB DRHDR
* ACNB
* NCNB AT
* KDIS
*
* 7. ROUTINES AND OVERLAYS CALLED
* REDUCE - REDUCE MEMORY BUFFER
* HUPDDAW - UPDATE DATA AVAILABLE WORD
* OMSG - ISSUE DAYFILE MESSAGE
* XTRACE - RECORD PROCEDURE CALLS
* DELCDR - DELETE ACNB FROM CONNECTION DATA RING
* KPUT - UPDATE STATUS DISPLAY
* MRELS - RELEASE BUFFER
*
* 8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION
* "NIP/RELACNB - BAD CN"
*
* THIS PROCEDURE IS LOADED AND CALLED BY PRIMARY OVERLAY
* STRTSW AND SECONDARY OVERLAY HSWACNB VIA HCSTTP.
*
* W A R N I N G - THE SIZE OF THIS PROCEDURE ALONG WITH
* SECONDARY OVERLAY HSWACNB PLUS PROCEDURE
* HALLOCN CANNOT EXCEED THE SIZE OF THE
* SECONDARY OVERLAY BUFFER SIZE MINUS 5
* (473B WORDS). THE SIZE OF THIS PROCEDURE
* ALONG WITH PRIMARY OVERLAY STRTSW PLUS
* PROCEDURES HCONREQ, HCRSWHN, AND MREDUCE
* CANNOT EXCEED THE SIZE OF THE PRIMARY
* OVERLAY BUFFER SIZE MINUS 5 (673B WORDS).
*
#
STOPIMS;
#
EXTERNAL VARIABLES
#
XREF
BEGIN
PROC DELCDR; # DELINK ACNB FROM CONNECTION DATA RING #
PROC HUPDDAW; # UPDATE DATA AVAILABLE WORD #
PROC MREDUCE; # REDUCE MEMORY BUFFER #
PROC KPUT ;
PROC OMSG; # ISSUE DAYFILE MESSAGE #
PROC MRELS; # RELEASE BUFFER SPACE #
PROC XTRACE; # RECORD PROCEDURE CALLS #
PROC ABORT ; # #
END
#
INPUT PARAMETERS
#
ITEM ACNBADR; # ADDRESS OF ACNB TO RELEASE #
ITEM SWFLAG B; # TRUE = SWITCHING CONNECTION #
ITEM LNFLAG B; # TRUE = LOANING CONNECTION #
#
INTERNAL VARIABLES
#
ITEM ACNTINDX; # INDEX INTO ACNT #
ITEM AN; # APPLICATION NUMBER #
ITEM NEWSIZE; # SIZE TO REDUCE BUFFER TO #
ITEM CURR; # INDUCTION LOOP VARIABLE #
ITEM FOUND B; # HIGHEST CN IN USE FOUND-FLAG #
ITEM INDX; # INDUCTION LOOP VARIABLE #
ITEM NEXT; # NEXT ENTRY IN DATA RING #
ITEM TMPINDX I; # ACB KDISPLAY ABSOLUTE INDEX #
# SET TO -1 IF NOT IN VIEW #
# DAYFILE MESSAGE TO ISSUE IF BAD CONNECTION NUMBER #
CONTROL IFEQ DEBUG,1;
ARRAY ERRMSG P(3);
BEGIN
ITEM BADMSG C(00,00,20) = ["NIP/RELACNB - BAD CN"];
ITEM ENDMSG U(02,00,60) = [0];
END
CONTROL FI;
#**********************************************************************#
BEGIN
CONTROL IFEQ DEBUG,1;
XTRACE("RACNB") ;
CONTROL FI;
FOUND = FALSE; # INITIALIZE HIGHEST CN FOUND FLAG #
P<ACNB> = ACNBADR; # ADDRESS OF ACNB TO RELEASE #
CONTROL IFEQ DEBUG,1;
IF P<ACNB> EQ 0
THEN
BEGIN
OMSG(ERRMSG,0); # ISSUE ERROR DAYFILE MESSAGE #
ABORT(0,0) ;
END
CONTROL FI;
AN = ACNBAN[0]; # APPLICATION NUMBER #
P<ACB> = ATACBA[AN]; # BASE APPL CONTROL BLOCK #
P<ACNT> = ACBACNT[0]; # BASE APPL CONNECTION TABLE #
ACNTINDX = ACNBACN[0] + ACNTHSIZE - ACNTMINACN[0];
ACNTWD[ACNTINDX] = 0; # DELETE ACNT ENTRY #
IF NOT LNFLAG # NOT LOANING CONNECTION #
THEN
BEGIN # FREE THIS ENTRY, NOT FOR LOAN-CON #
ACNTNFE[0] = ACNTNFE[0] + 1 ; # UPDATE NUMBER OF FREE ENTRY #
IF ACNBACN[0] LS ACNTFFCN[0]
THEN
ACNTFFCN[0] = ACNBACN[0] ; # UPDATE FIRST FREE ACN #
IF ACNBACN[0] EQ ACNTHCN[0]
THEN # UPDATE HIGHEST CN IN USE #
BEGIN # SEARCH FOR HIGHEST CN IN USE #
FOR INDX = ACNTINDX - 1 STEP -1 WHILE INDX GQ ACNTHSIZE
AND NOT FOUND
DO
BEGIN
IF ACNTWD[INDX] NQ 0
THEN # HIGHEST CN FOUND #
BEGIN
ACNTHCN[0] = INDX + ACNTMINACN[0] - ACNTHSIZE;
FOUND = TRUE; # SET HIGHEST CN IN USE FOUND FLAG #
END
END
IF NOT FOUND
THEN # THERE ARE NO ENTRIES IN ACNT #
ACNTHCN[0] = 0;
END
END # FREE THIS ENTRY, NOT FOR LOAN-CON #
# CHECK IF ACNT CAN BE SHRUNK#
IF (ACNTNFE[0] GQ MINACNTFE) AND
(ACNTBS[0] - (ACNTHCN[0] - ACNTMINACN[0]) - ACNTHSIZE - 1)
GQ ACNTESIZE
THEN # SHRINK ACNT #
BEGIN
NEWSIZE = ACNTBS[0] - ACNTESIZE; # SIZE TO REDUCE ACNT TO #
MREDUCE(P<ACNT>,NEWSIZE); # SHRINK ACNT #
ACBACNT[0] = P<ACNT>; # UPDATE ACNT ADDRESS #
ACNTNFE[0] = ACNTNFE - ACNTESIZE; # UPDATE NO. FREE ENTRIES #
END
ACBNCN[0] = ACBNCN[0] - 1; # DECREMENT NO. OF CONN IN ACB #
IF KDIS$RT
AND ACBKNDX[0] NQ 0
AND ACBKNDX[0] GQ KDAPPST[0]
AND ACBKNDX[0] LQ KDAPPND[0]
THEN
BEGIN
TMPINDX=ACBKNDX[0]-KDAPPST[0];
KPUT(KHDRNP[0],TMPINDX,KPAPNCN,ACBNCN[0]) ;
END
ELSE
TMPINDX=-1;
IF NOT SWFLAG AND P<ACNB> NQ 0
THEN # NOT A CONNECTION SWITCH #
BEGIN
# RELEASE DATA RING #
P<DRHDRWD> = 0;
CURR = ACNBDRFP[0]; # FIRST ENTRY IN DATA RING #
FOR CURR = CURR WHILE CURR NQ LOC(ACNBDRFP[0]) AND
CURR NQ 0 DO
BEGIN
NEXT = NEXTPTR[CURR]; # NEXT ENTRY IN DATA RING #
MRELS(CURR); # RELEASE DATA RING ENTRY #
CURR = NEXT;
END
IF ACNBBLKSQ[0] NQ 0
THEN # DATA QUEUED TO ACNB #
BEGIN
HUPDDAW(P<ACB>,P<ACNB>,-ACNBBLKSQ[0],-ACNBBLKSQ[0]);
DELCDR(P<ACNB>); # DELETE ACNB FROM CONNECTION DATA RING #
END
IF ACNBNCNB[0] NQ 0
THEN # NCNB EXISTS #
BEGIN
P<NCNB> = ACNBNCNB[0];
NCNBACNB[0] = 0; # CLEAR ACNB POINTER #
END
IF TMPINDX GQ 0 THEN
KPUT(KHDRNP[0],TMPINDX,KPAPNDM,ACBBLKSQ[0]) ;
MRELS(P<ACNB>);
END
RETURN ; # RETURN TO CALLING PROGRAM #
END
TERM