*DECK DB$SOSI 
USETEXT CDCSCTX 
      PROC DB$SOSI( (LTQT) ); 
      BEGIN 
 #
* *   DB$SOSI - SWAP OUT, SWAP IN                PAGE  1
* *   D E TRIGLIA                                DATE  80/04/30 
* 
* DC  PURPOSE 
* 
*     THE USER THAT HAS THE CURRENT TQT IS SWAPPED OUT ALONG WITH 
*     ITS TABLES. THE USER WHOSE TQT IS POINTED TO BY THE 
*     PARAMETER LTQT IS SWAPPED IN. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM LTQT U;           # THIS MUST POINT TO THE TQT OF THE USER  #
                             # TO BE SWAPPED IN.                       #
# 
*     ASSUMPTIONS 
* 
*     THE TQT AND RCB POINTERS MUST BE SET UP FOR THE USER WHO IS TO BE 
*     SWAPPED OUT.
* 
* DC  EXIT CONDITIONS 
* 
*     THE OPERATING SYSTEM IS NOTIFIED WHICH USERS TO SWAP OUT
*     AND IN. THE TABLES BELONGING TO THE OUTBOUND USER ARE SWAPPED 
*     OUT.
* 
* DC  CALLING ROUTINES
* 
*     DB$LOK                   THESE ROUTINES SWAP IN LOCK HOLDING
*     DB$LOKA                  USERS AND SWAP OUT WAITING USERS.
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # GENERATE A FLOW POINT                   #
      XREF PROC DB$MBA;      # GET A 2 WORD SFCALL BUFFER              #
      XREF PROC DB$MBF;      # RETURN SFCALL BUFFER                    #
      XREF PROC DB$POP;      # POP ENTRY ADDRESS FROM RCB STACK        #
      XREF PROC DB$PUSH;     # PUSH ENTRY ADDRESS ON RCB STACK         #
      XREF PROC DB$SCHD;     # CDCS SCHEDULER                          #
      XREF PROC DB$SFCM;     # ISSUE SFCALL MACRO                      #
      XREF PROC DB$SWPO;     # SWAP OUT USER AND ITS TABLES            #
 #                                                                     #
#     LOCAL VARIABLES                                                  #
#                                                                      #
      BASED ARRAY SFCALL;    # SFCALL REQUEST BUFFER FOR SWAP IN       #
        BEGIN 
        ITEM SFFC   U(00,00,60);       # FUNCTION CODE                 #
        ITEM SFRC   U(00,00,06);       # RETURN CODE                   #
        ITEM SFCOMP B(00,59,01);       # COMPLETION BIT                #
        ITEM SFRUID U(01,00,60);       # RUN UNIT ID                   #
        END 
#                                                                      #
#     LOCAL DEFS                                                       #
#                                                                      #
      DEF DFSWAPPEDOUT# O"44" #;       # SFCALL RETURN CODE            #
                                       # INDICATING USER IS SWAPPED    #
                                       # OUT.                          #
  
  
  
#     B E G I N   D B $ S O S I   E X E C U T A B L E   C O D E .      #
  
  
 #
* 
* DC  DESCRIPTION 
* 
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("SOSI   ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
 #
*     GET AN SFCALL BUFFER FOR THE SF.STAT AND SF.SWPI FUNCTIONS. 
*     SET UP THE SFCALL INFORMATION FOR THE JOB TO BE SWAPPED IN. 
 #
      P<TQT> == LTQT;                  # EXCHANGE TQT ADDRESSES        #
      DB$MBA(2,P<SFCALL>);
      SFRUID[0] = TQRUID[0];           # SET THE RUN UNIT ID           #
      P<TQT> = LTQT;                   # RESTORE THE TQT POINTER       #
 #
*     SEE IF THE USER TO BE SWAPPED IN IS SWAPPED OUT. IF IT IS 
*     SWAPPED IN, DO NOTHING. 
 #
      SFFC[0] = DFSFSTAT; 
      DB$SFCM(P<SFCALL>);              # ISSUE AN SF.STAT              #
      IF NOT SFCOMP[0]
      THEN
        BEGIN 
        DB$PUSH(DB$SOSI); 
        DB$SCHD(P<SFCALL>,DFWAITXE);   # WAIT FOR THE SF.STAT COMPLETE #
        DB$POP(DB$SOSI);
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("SOSI-S1"); 
        CONTROL ENDIF;
  
        END 
      IF SFRC[0] EQ DFSWAPPEDOUT
      THEN
        BEGIN 
 #
*     SWAP OUT THE CURRENT USER AND ITS TABLES. 
 #
        DB$PUSH( DB$SOSI ); 
        DB$SWPO( TRUE );
 #
*     SWAP IN THE PROPER USER.
 #
        SFFC[0] = DFSFSWPI; 
        DB$SFCM(P<SFCALL>); 
        DB$SCHD(P<SFCALL>,DFWAITXE);
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("SOSI-S2"); 
        CONTROL ENDIF;
  
        DB$POP ( DB$SOSI ); 
        END 
 #
*     RETURN THE SFCALL BUFFER
 #
      DB$MBF(P<SFCALL>);
  
      RETURN; 
      END 
      TERM
