123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2001-2014 by Free Pascal development team
- This file implements heap management for OS/2.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {****************************************************************************
- Heap management releated routines.
- ****************************************************************************}
- {Get some memory.
- P = Pointer to memory will be returned here.
- Size = Number of bytes to get. The size is rounded up to a multiple
- of 4096. This is probably not the case on non-intel 386
- versions of OS/2.
- Flags = One or more of the mfXXXX constants.}
- function DosAllocMem(var P:pointer;Size,Flag:cardinal): cardinal; cdecl;
- external 'DOSCALLS' index 299;
- function DosSetMem(P:pointer;Size,Flag:cardinal): cardinal; cdecl;
- external 'DOSCALLS' index 305;
- function DosFreeMem (P: pointer): cardinal; cdecl;
- external 'DOSCALLS' index 304;
- {$IFDEF DUMPGROW}
- {$DEFINE EXTDUMPGROW}
- {$ENDIF DUMPGROW}
- {$IFDEF EXTDUMPGROW}
- var
- Int_HeapSize: cardinal;
- {$ENDIF EXTDUMPGROW}
- {function GetHeapSize: longint; assembler;
- asm
- movl Int_HeapSize, %eax
- end ['EAX'];
- }
- function SysOSAlloc (Size: ptruint): pointer;
- var
- P: pointer;
- RC: cardinal;
- begin
- {$IFDEF EXTDUMPGROW}
- if Int_HeapSize <> high (cardinal) then
- {
- if Int_HeapSize = high (cardinal) then
- WriteLn ('Trying to allocate first heap of size ', Size)
- else
- }
- WriteLn ('Trying to grow heap by ', Size, ' to ', Int_HeapSize);
- {$ENDIF}
- RC := DosAllocMem (P, Size, HeapAllocFlags);
- if RC = 0 then
- begin
- {$IFDEF EXTDUMPGROW}
- if Int_HeapSize <> high (cardinal) then
- WriteLn ('DosAllocMem returned memory at ', cardinal (P));
- {$ENDIF}
- SysOSAlloc := P;
- {$IFDEF EXTDUMPGROW}
- if Int_HeapSize = high (cardinal) then
- Int_HeapSize := Size
- else
- Inc (Int_HeapSize, Size);
- {$ENDIF EXTDUMPGROW}
- end
- else
- begin
- SysOSAlloc := nil;
- OSErrorWatch (RC);
- {$IFDEF EXTDUMPGROW}
- if Int_HeapSize <> high (cardinal) then
- begin
- WriteLn ('Error ', RC, ' during additional memory allocation (DosAllocMem)!');
- { if Int_HeapSize = high (cardinal) then
- WriteLn ('No memory allocated yet!')
- else
- }
- WriteLn ('Total allocated memory is ', Int_HeapSize);
- end;
- {$ENDIF EXTDUMPGROW}
- end;
- end;
- {$define HAS_SYSOSFREE}
- procedure SysOSFree (P: pointer; Size: ptruint);
- var
- RC: cardinal;
- begin
- {$IFDEF EXTDUMPGROW}
- WriteLn ('Trying to free memory!');
- WriteLn ('Total allocated memory is ', Int_HeapSize);
- Dec (Int_HeapSize, Size);
- {$ENDIF EXTDUMPGROW}
- RC := DosFreeMem (P);
- if RC <> 0 then
- begin
- OSErrorWatch (RC);
- {$IFDEF EXTDUMPGROW}
- WriteLn ('Error ', RC, ' during memory deallocation (DosFreeMem)!');
- WriteLn ('Total allocated memory is ', Int_HeapSize);
- {$ENDIF EXTDUMPGROW}
- end;
- end;
- function ReadUseHighMem: boolean;
- begin
- ReadUseHighMem := HeapAllocFlags and $400 = $400;
- end;
- procedure WriteUseHighMem (B: boolean);
- begin
- if B then
- HeapAllocFlags := HeapAllocFlags or $400
- else
- HeapAllocFlags := HeapAllocFlags and not ($400);
- end;
|