*COMDECK OPA
          TITLE  COMMON MEMORY MANAGER, V1.0 - MISC OPTIMIZATION CALLS
*CALL CMMCOM
          COMMENT  "SUBSYS"MISC OPTIMIZATION CALLS. 
          B1=1
 CMM.OP1  SPACE  4
***       CMM.OP1 - BEGIN NO-READJUSTMENT PERIOD. 
* 
* 
*              THIS CALL INFORMS CMM THAT A RAPID SEQUENCE OF CALLS 
*         WHICH FREE UP SPACE IS LIKELY, POSSIBLY IMMEDIATELY 
*         FOLLOWED BY SOME REQUESTS FOR SPACE.  FOLLOWING NOTIFICATION
*         VIA THIS CALL, CMM WILL CEASE MOST OF ITS NORMAL ACTIVITY OF
*         RE-ADJUSTING THE POSITIONS OF VARYING-POSITION BLOCKS IN
*         ORDER TO REDUCE THE FL IF POSSIBLE. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  OP1 
 CMM.OP1  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX7    3ROP1       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.OP1     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA1    A0-IMAPM 
          ZR     X1,OP1ECA
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 OP1ECA   BSS    0
 IS       ENDIF 
  
          SX6    B1          SET NO-READJUSTMENT FLAG 
          SA6    A0-OP1 
          SA1    A0-MNSAVEA0  RESTORE A0
          SA0    X1 
          EQ     CMM.OP1     RETURN 
 CMM.OP2  SPACE  4,8
***       CMM.OP2 - END NO-READJUSTMENT PERIOD. 
* 
* 
*              THIS CALL INFORMS CMM THAT THE RAPID SEQUENCE OF SPACE 
*         REQUESTS AS DESCRIBED UNDER CMM.OP1 IS NOW OVER.  CMM WILL
*         RESUME ITS NORMAL ACTIVITY. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  OP2 
 CMM.OP2  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX7    3ROP2       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.OP2     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA1    A0-IMAPM 
          ZR     X1,OP2ECA
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 OP2ECA   BSS    0
 IS       ENDIF 
  
          SX6    B0          CLEAR NO-READJUSTMENT FLAG 
          SA6    A0-OP1 
          SA1    A0-MNSAVEA0  RESTORE A0
          SA0    X1 
          EQ     CMM.OP2     RETURN 
 CMM.OP3  SPACE  4,8
***       CMM.OP3 - SNAPSHOT VARYING POSITION AREA. 
* 
* 
*              CMM ADJUSTS THE POSITION OF VARIABLE BLOCKS IN A 
*         MANNER THAT ATTEMPTS TO MAINTAIN A REASONABLE AMOUNT OF 
*         SPACE BETWEEN THEM SO THAT MOST -GROW- REQUESTS CAN BE
*         SATISFIED VERY QUICKLY.  IN ORDER TO DO THIS IT MAINTAINS 
*         A HISTORY THAT ALLOWS IT TO COMPUTE THE RATE OF CHANGE OF 
*         BLOCK SIZE WITH RESPECT TO TIME.  THERE ARE MANY PROGRAMS 
*         THAT GO THROUGH PHASES SUCH THAT THIS RATE OF CHANGE IS 
*         STEADY WITHIN EACH PHASE, BUT UNDERGOES SHARP DISCONTIN-
*         UITIES BETWEEN PHASES.  (A COMPILER THAT GREW A TABLE DURING
*         ONE PASS AND THEN SHRANK IT DURING THE NEXT PASS IS A GOOD
*         EXAMPLE.)  THIS CALL INFORMS CMM THAT NOW IS SUCH A 
*         DISCONTINUITY POINT. CMM WILL DESTROY PREVIOUS HISTORY
*         INFORMATION AND COMPUTE FUTURE RATE OF CHANGE VALUES BASED
*         ON THE CURRENT SITUATION. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  OP3 
 CMM.OP3  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX7    3ROP3       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.OP3     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA1    A0-IMAPM 
          ZR     X1,OP3ECA
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 OP3ECA   BSS    0
 IS       ENDIF 
  
*         RESET ALL GROWTH HISTORY FIELDS IN VARIABLE BLOCK HEADERS TO
*         REFLECT THE CURRENT SIZE. 
  
          SA1    RA65        (B4) = REGION POINTER
          BX1    -X1
          SB4    X1+B1
 OP3A     ZR     B4,OP3C     IF ALL REGIONS EXAMINED
          SA1    B4          NEXT REGION HEADER 
          SB4    X1 
          MX6    3
          BX6    X6*X1
          AX1    36 
          MX2    1
          BX6    X2-X6
          NZ     X6,OP3A     IF NOT A VP REGION 
          SB5    X1          (B5) = BLOCK HEADER POINTER
 OP3B     ZR     B5,OP3A     IF NO MORE BLOCKS IN VP REGION 
          SA2    B5          NEXT VP BLOCK HEADER 
          SB5    X2 
          AX2    36          (X2) = LENGTH + HEADER SIZE
          SX2    X2+4 
          MX7    42 
          SA3    A2+3        SET GROWTH-HISTORY FIELD 
          BX7    X7*X3        = CURRENT LENGTH + HEADER SIZE
          BX7    X7+X2
          SA7    A3 
          EQ     OP3B        LOOP 
  
 OP3C     SA1    A0-MNSAVEA0  RESTORE A0
          SA0    X1 
          EQ     CMM.OP3     RETURN 
 CMM.OP5  SPACE  4
***       CMM.OP5 - SET NEW VALUE FOR *FLINC*.
* 
* 
*              THE VALUE USED BY CMM FOR *FLINC* IS CHANGED TO
*         NEW-FLINC.  ALL BLOCK CONTENTS ARE UNAFFECTED.  AN INITIAL
*         CALL OF THIS FORM IS NOT NECESSARY. 
* 
*         ENTRY  (X1) = NEW-FLINC.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  OP5 
 CMM.OP5  EQ     *+1S17      ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX6    3ROP5       SAVE FUNCTION NAME 
          SA6    A0-MNFNAME 
          SA4    CMM.OP5     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA3    A0-IMAPM 
          ZR     X3,OP5101
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 OP5101   MX2    -17         CHECK THAT VALUE IS LT 2**17 
          BX2    X2*X1
          ZR     X2,OP5102   IF WITHIN LIMIT
          UERR   CMEFFER,0   INCORRECT VALUE FOR FLINC (OR FLF) 
  
 OP5102   BSS    0
 IS       ENDIF 
  
          MX7    18-6        ROUND VALUE DOWN TO EVEN 100B
          LX7    18 
          BX7    X7*X1       SET NEW VALUE FOR *FLINC*
          SA7    A0-FLINC.C 
          SA2    A0-MNSAVEA0  RESTORE A0
          SA0    X2 
          EQ     CMM.OP5     RETURN 
 CMM.OP6  SPACE  4
***       CMM.OP6 - SET NEW VALUE FOR *FLF*.
* 
* 
*              THE VALUE USED BY CMM FOR *FLF* IS CHANGED TO
*         NEW-FLF.  ALL BLOCK CONTENTS ARE UNAFFECTED.  AN INITIAL
*         CALL OF THIS FORM IS NOT NECESSARY. 
* 
*         ENTRY  (X1) = NEW-FLF.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  OP6 
 CMM.OP6  EQ     *+1S17      ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX6    3ROP6       SAVE FUNCTION NAME 
          SA6    A0-MNFNAME 
          SA4    CMM.OP6     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA3    A0-IMAPM 
          ZR     X3,OP6101
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 OP6101   MX2    -17         CHECK THAT VALUE IS LT 2**17 
          BX2    X2*X1
          ZR     X2,OP6102   IF WITHIN LIMIT
          UERR   CMEFFER,0   INCORRECT VALUE FOR FLINC (OR FLF) 
  
 OP6102   BSS    0
 IS       ENDIF 
  
          MX7    18-6        ROUND VALUE DOWN TO EVEN 100B
          LX7    18 
          BX7    X7*X1       SET NEW VALUE FOR *FLF*
          SA7    A0-FLF.C 
          SA2    A0-MNSAVEA0  RESTORE A0
          SA0    X2 
          EQ     CMM.OP6     RETURN 
  
