[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]

    {===========================================================================
     BBS: Canada Remote Systems
    Date: 05-30-93 (02:30)             Number: 25203
    From: GUY MCLOUGHLIN               Refer#: NONE
      To: ALL                           Recvd: NO
    Subj: BP7 DPMI SWAP-FILE #1          Conf: (552) R-TP
    ---------------------------------------------------------------------------

      Hi to All:

      ...I saw this source-code posted by one of the support people in
      the Borland Pascal conference on Compuserve. For those of you
      who are writing DPMI apps, this could come in quite handy as
      a means of obtaining "virtual" DPMI HEAP space.

      *** NOTE: This unit is ONLY for BORLAND PASCAL 7, and cannot be
                compiled with any version of Turbo Pascal. <sorry>
    ------------------------------------------------------------------------}

     {.$DEFINE DebugMode}

     {$IFDEF DebugMode}
       {$A+,B-,D+,E-,F-,G+,I+,L+,N-,O-,P+,Q+,R+,S+,T+,V+,X+,Y+}
     {$ELSE}
       {$A+,B-,D-,E-,F-,G+,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
     {$ENDIF}

     {$IFNDEF DPMI}
       ERROR!!! UNIT MUST BE COMPILED FOR PROTECTED MODE TARGET!!!
     {$ENDIF}

    unit RTMswap;

    interface

    const
      rtmOK          = $0;
      rtmNoMemory    = $1;
      rtmFileIOError = $22;

      (***** Opens a swapfile of the specified size. If a swapfile        *)
      (*     already exists, and the new size is larger, the swapfile     *)
      (*     will grow, otherwise the previous swap file parameters       *)
      (*     are used.                                                    *)
      (*                                                                  *)
      (*    Returns:   rtmOK           - Successful                       *)
      (*               rtmNoMemory     - Not enough disk space            *)
      (*               rtmFileIOError  - Could not open/grow file         *)
      (*                                                                  *)
      function MemInitSwapFile({input } FileName : pchar;
                                        FileSize : longint) :
                               {output} integer;

      (***** Closes the swapfile if it was created by the current task.   *)
      (*     If the value returned in "Delete" is non-zero, the swapfile  *)
      (*     was deleted.                                                 *)
      (*                                                                  *)
      (*    Returns:   rtmOK           - Successful                       *)
      (*               rtmNoMemory     - Not enough physical memory to    *)
      (*                                 run without the swap file.       *)
      (*               rtmFileIOError  - Could not close/delete the file. *)
      (*                                                                  *)
      function MemCloseSwapFile({update} var Delete : integer) :
                                {output} integer;

     implementation

       function MemInitSwapFile; external 'RTM' index 35;

       function MemCloseSwapFile; external 'RTM' index 36;

     END.

    {------------------------------------------------------------------------

      ...I still can't figure out what to do with the value returned in
      the "Delete" parameter passed to "MemCloseSwapFile", as it doesn't
      seem to return any specific value for me??? (Maybe it has to fail
      to return a value???)

      ...The next message is a demo program using this "RTMswap" unit.

                                   - Guy                                }

     {.$DEFINE DebugMode}

     {$IFDEF DebugMode}
       {$A+,B-,D+,E-,F-,G+,I+,L+,N-,O-,P+,Q+,R+,S+,T+,V+,X+,Y+}
     {$ELSE}
       {$A+,B-,D-,E-,F-,G+,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
     {$ENDIF}

     {$IFNDEF DPMI}
       ERROR!!! PROGRAM MUST BE COMPILED FOR PROTECTED MODE TARGET!!!
     {$ENDIF}

                  (* Program to demonstrate how to create/delete DPMI     *)
                  (* HEAP swap-file.                                      *)
    program RTMswap_Demo;
    uses
      RTMswap;

    const         (* Maximum size for DPMI HEAP in bytes.                 *)
       DPMI_HeapMax = 16000 * 1024;

    var
      SwapError,
      DeleteStatus : integer;
      SwapSize     : longint;
      SwapFilename : pchar;

    BEGIN
                  (* Calculate required DPMI HEAP swap-file size.         *)
      SwapSize := (DPMI_HeapMax - memavail);

                  (* Display current DPMI HEAP size.                      *)
      writeln;
      writeln('Current DPMI HEAP size = ', (memavail div 1024), ' K');
      writeln;
      writeln('Increasing DPMI HEAP to 16,000 K via swap-file');
      writeln;

                  (* Assign DPMI HEAP swap-file name.                     *)
      SwapFilename := 'SWAPDEMO.$$$';

                  (* Attempt to create DPMI HEAP swap-file.               *)
      SwapError := MemInitSwapFile(SwapFilename, SwapSize);

                  (* Check for errors in creating DPMI HEAP swap-file.    *)
      case SwapError of
        rtmOK          : begin
                           writeln((SwapSize div 1024), ' K DPMI HEAP ' +
                                   'swap file created');
                           writeln;
                           writeln('Total DPMI HEAP size now = ',
                                   (memavail div 1024), ' K');
                           writeln
                         end;
        rtmNoMemory    : writeln('ERROR!!! Not enough disk space to ' +
                                 'create DPMI HEAP swap-file');
        rtmFileIOerror : writeln('ERROR!!! Could not open/grow DPMI ' +
                                 'HEAP swapfile')
      else
        writeln('UNKNOWN RTM ERROR!!!')
      end;

                  (* If DPMI HEAP swap-file was created, then close it.   *)
      if (SwapError = rtmOK) then
        begin
          writeln('Closing DPMI HEAP swap-file'); writeln;

                  (* Attempt to close DPMI HEAP swap-file.                *)
          SwapError := MemCloseSwapFile(DeleteStatus);

                  (* Check for errors in closing DPMI HEAP swap-file.     *)
          case SwapError of
            rtmOK          : begin
                               writeln('DPMI HEAP swap-file is closed');
                               writeln;
                               writeln('Current DPMI HEAP size now = ',
                                       (memavail div 1024), ' K')
                             end;
            rtmNoMemory    : writeln('ERROR!!! Not enough RAM to run ' +
                                     'without swap-file');
            rtmFileIOerror : writeln('ERROR!!! Could not close/delete ' +
                                     'swapfile')
          else
            writeln('UNKNOWN RTM ERROR!!!')
          end
        end
    END.

[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]