*DECK DB$SWPI 
USETEXT CDCSCTX 
      PROC DB$SWPI; 
      BEGIN 
 #
* *   DB$SWPI--SWAP TABLES IN FOR USER           PAGE  1
* *   C O GIMBER                                 07/13/76 
* 
* DC  PURPOSE 
* 
*     SWAP IN TABLES FOR USER WHICH HAVE BEEN SWAPPED OUT.
* 
* DC  CALLING ROUTINES
* 
*     DB$SCHD--CDCS SCHEDULER.
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$CALL;     # CALL A PROCEDURE BY ITS ADDRESS         #
      XREF PROC DB$CLSE;     # EMERGENCY CLOSE FILES ROUTINE           #
      XREF PROC DB$FLOP;     # GENERATE FLOW POINT                     #
      XREF FUNC DB$SWI;      # READ TABLE FROM SWAP FILE               #
# 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCSCOMMN 
*       TQT                  TASK QUEUE TABLE 
*       RSB                  RUN UNIT STATUS BLOCK
*       ASL                  ACTIVE SUBSCHEMA LIST
*       CST                  CONDENSED SUBSCHEMA TABLE
 #
      XREF ITEM DB$MFPA;     # MEMORY OVERFLOW HANDLER ADDRESS         #
# 
* 
*     LOCAL VARIABLES 
* 
# 
      ITEM SAVEMFPA;         # SAVE DB$MFPA                            #
  
  
  
#**********************************************************************#
#                                                                      #
#     I N T E R N A L   P R O C E D U R E   -   N O M E M              #
#                                                                      #
#**********************************************************************#
  
# 
* *   NOMEM  - MEMEORY NOT AVAILABLE FOR SWAP IN
* *   R L MCALLESTER                             02/14/86 
* 
* DC  PURPOSE 
* 
*     CALL DB$CLSE TO CLOSE FILES WHEN NO MEMORY IS AVAILABLE FOR 
*         RSB OR CST. 
* 
*     ABORT THE USER JOB. 
# 
  
      PROC NOMEM; 
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP ("SWPI-NM");
        CONTROL ENDIF;
  
        DB$MFPA = SAVEMFPA; 
        DB$CLSE;
        DB$CALL(DB$MFPA); 
        END 
  
  
  
  
  
#     B E G I N   D B $ S W P I   E X E C U T A B L E   C O D E .      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP ("SWPI"); 
      CONTROL ENDIF;
  
 #
* DC  DESCRIPTION 
* 
*     SET UP THE MEMORY OVERFLOW OPTION ADDRESS.
*     CLEAR SWAP FLAG IN TQT ENTRY. 
 #
      SAVEMFPA = DB$MFPA; 
      DB$MFPA = LOC(NOMEM); 
      TQSWPF[0] = FALSE;
 #
*     SWAP IN RSB IF SWAPPED OUT. 
 #
      IF TQRSB[0] LS 0 THEN 
        BEGIN 
        TQRSB[0] = DB$SWI(-TQRSB[0]); 
        P<RSB> = TQRSB[0];
        END 
 #
*     DECREMENT CST SWAP OUT COUNT IN ASL ENTRY.
*     IF CST SWAPPED OUT THEN SWAP IT IN. 
 #
      IF TQASL[0] NQ 0
      THEN
        BEGIN 
        P<ASL> = TQASL[0];
        ASNSWP[0] = ASNSWP[0]-1;
        IF ASCSTLOC[0] LS 0 
        THEN
          BEGIN 
          ASCSTLOC[0] = DB$SWI(-ASCSTLOC[0]); 
          P<CSFIXED> = ASCSTLOC[0]; 
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP ("SWPI-AS");
          CONTROL ENDIF;
  
          END 
        END 
  
      IF RSFFKLLOC[0] LS 0
      THEN
        BEGIN 
                             # THE FKL IS NOT ATTACHED TO THE RSB.     #
                             # SWAP IT SEPARATELY AND RECORD ITS LOC.  #
        P<FKL> = DB$SWI(-RSFFKLLOC[0]); 
        RSFFKLLOC[0] = LOC(FKL);
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP ("SWPI-FK");
        CONTROL ENDIF;
  
        END 
      ELSE
        BEGIN 
                             # THE FKL IS ATTACHED TO THE RSB.         #
                             # CONVERT THE OFFSET TO A LOCATION.       #
        RSFFKLLOC[0] = RSFFKLLOC[0] + LOC(RSB); 
        P<FKL> = RSFFKLLOC[0];
        END 
      DB$MFPA = SAVEMFPA; 
  
      RETURN; 
      END 
      TERM
