--ILTVMemImpl.mesa
--Created by
--   JFung.PASA	  	17-Nov-83 13:59:25


--last edited by
--   JFung.PASA	   	29-Nov-83  9:56:37



DIRECTORY
     Environment,
     File,
     FileTypes USING [tUntypedFile],
     Format,
     LispToolOps,
     OthelloDefs,
     OthelloOps,
     Process,
     Put,
     Scavenger,
     Space,
     TemporaryBooting USING [InvalidParameters],
     Transaction,
     Volume,
     Window;



ILTVMemImpl: PROGRAM
     IMPORTS
          File, LispToolOps, OthelloOps, Process, Put, TemporaryBooting,
          Transaction, Volume

     EXPORTS LispToolOps =

     BEGIN OPEN OthelloOps, ILT: LispToolOps;

     debug: BOOLEAN ← FALSE;
     volumeID: Volume.ID ← Volume.nullID;
     volumeOpen: BOOLEAN ← FALSE;


     CloseVolume: PROC =
          BEGIN
          IF volumeOpen THEN {Volume.Close[volumeID]; volumeOpen ← FALSE}
          END;



     GetFileSize: PUBLIC PROCEDURE[] RETURNS [pageCount: File.PageCount] =
          BEGIN OPEN OthelloOps;

          cap: File.Capability;
          firstPage: File.PageNumber;
          created: BOOLEAN ← FALSE;

          IF debug THEN {
               Put.Line[ILT.toolData.fileSW, "Enter DisplayFileSize..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               Put.CR[ILT.toolData.fileSW];
               };
          pageCount ← ILT.toolData.vMemSize;

          [volumeID, volumeOpen] ← ILT.GetVolumeID[ILT.toolData.volName];
          IF ~volumeOpen THEN RETURN;

          [cap, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode];
	  IF cap = File.nullCapability THEN pageCount ← 0
	  ELSE  pageCount ← File.GetSize[cap];
          IF debug THEN {
               Put.LongDecimal[ILT.toolData.fileSW, pageCount];
               Put.CR[ILT.toolData.fileSW];
               };

          END;  --GetFileSize




     SetVMemFileSize: PUBLIC PROCEDURE [pages: File.PageCount] =
          BEGIN OPEN OthelloOps;

          cap: File.Capability;
          defaultVMemSize: File.PageCount;
	  firstPage: File.PageNumber;
          freePages: Volume.PageCount;
	  created: BOOLEAN ← FALSE;
	  currentSize: File.PageCount;
          maxSize: Volume.PageCount;
          size: File.PageCount;
          sysoutSize: File.PageCount;
          volSize: Volume.PageCount;


          IF debug THEN {
               Put.Line[ILT.toolData.fileSW, "SetVMemFileSize...."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          [volumeID, volumeOpen] ← ILT.GetVolumeID[ILT.toolData.volName];
          IF ~volumeOpen THEN RETURN;

          [cap, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode];
          IF cap # File.nullCapability THEN
               BEGIN
               ENABLE
                    File.Unknown => {
                         cap ← File.nullCapability;
                         IF debug THEN {
                              Put.Line[
                                   ILT.toolData.fileSW,
                                   " not nullCapability...."L];
                              Process.Pause[Process.SecondsToTicks[5]];
                              };
                         CONTINUE};

               END;  --IF cap # File.nullCapability 


          IF (created ← cap = File.nullCapability) THEN
               BEGIN
               IF debug THEN {
                    Put.Line[ILT.toolData.fileSW, " = nullCapability...."L];
                    Process.Pause[Process.SecondsToTicks[5]];
                    };
               --cap ← File.Create[volumeID, 0, FileTypes.tUntypedFile];
	       Put.Line[ILT.toolData.msgSW, " No sysout file on volume!"L];
	       RETURN;
               END;

          [volSize, freePages] ← Volume.GetAttributes[volumeID];
          defaultVMemSize ← volSize - 2000;
          sysoutSize ← File.GetSize[cap];

          IF cap = File.nullCapability THEN currentSize ← 0
          ELSE currentSize ← File.GetSize[cap];
          IF debug THEN {
               Put.LongDecimal[ILT.toolData.fileSW, currentSize];
               Put.CR[ILT.toolData.fileSW];
               };

	  Put.Text[ILT.toolData.fileSW, " \n Volume size = "L];
          Put.LongDecimal[ILT.toolData.fileSW, volSize];
          Put.Line[ILT.toolData.fileSW, " pages"L];

          Put.Text[ILT.toolData.fileSW, " Default VMem size = "L];
          Put.LongDecimal[ILT.toolData.fileSW, defaultVMemSize];
          Put.Line[ILT.toolData.fileSW, " pages"L];

<<          Put.Text[ILT.toolData.fileSW, " Free pages on volume = "L];
          Put.LongDecimal[ILT.toolData.fileSW, freePages];
          Put.CR[ILT.toolData.fileSW];
>>    
	  -- calculate maximum vmem size
	  maxSize ← currentSize + freePages;
          File.SetSize[
               cap, maxSize !
               Volume.InsufficientSpace => {maxSize ← maxSize - 100; RETRY}];

          Put.Text[ILT.toolData.fileSW, " Approximate maximum VMem size = "L];
          Put.LongDecimal[ILT.toolData.fileSW, maxSize];
          Put.Line[ILT.toolData.fileSW, " pages"L];


          IF ILT.toolData.vMemSize < sysoutSize THEN
               BEGIN

               Put.Line[
                    ILT.toolData.fileSW,
                    "WARNING: will shrink virtual memory size, please confirm to continue."L];
               IF ~ILT.Confirm[] THEN 
	       		BEGIN 
			size ← ILT.GetFileSize[];
			ILT.DisplayFileSize[size];
	       		CloseVolume[]; 
			RETURN; 
			END;
               END;

          File.SetSize[
               cap, ILT.toolData.vMemSize !
               Volume.InsufficientSpace => {
                    Put.Line[ILT.toolData.fileSW, " Not enough room for file!"L];
                    CloseVolume[];
                    GOTO noGood;
                    }];
		    
          Put.Line[ILT.toolData.fileSW, " Done."L];
          CloseVolume[];
          EXITS noGood => RETURN;
          END;  -- SetVMemFileSize

     END.  -- Prog. ILTVMemImpl