[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]