[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]
{$S-,R-,V-,I-,B-,F+,O+,A-}
unit DumpHeap;
{-Dump the list of free memory blocks on the heap}
interface
uses
OpInline, OpString;
procedure DumpFreeList;
implementation
type
FreeListRecPtr = ^FreeListRec;
FreeListRec = {structure of a free list entry}
record
{$IFDEF Ver60}
Next : FreeListRecPtr; {pointer to next free list record}
Size : Pointer; {"normalized pointer" representing size}
{$ELSE}
OrgPtr : Pointer; {pointer to the start of the block}
EndPtr : Pointer; {pointer to the end of the block}
{$ENDIF}
end;
{$IFDEF Ver60}
procedure DumpFreeList;
var
P : FreeListRecPtr;
begin
{scan the free list}
P := FreeList;
while P <> HeapPtr do begin
{show its size}
WriteLn(HexPtr(P), ' ', PtrToLong(P^.Size));
{next free list record}
P := P^.Next;
end;
{check block at HeapPtr^}
WriteLn(HexPtr(HeapPtr), ' ', PtrDiff(HeapEnd, HeapPtr));
end;
{$ELSE}
procedure DumpFreeList;
var
P : FreeListRecPtr;
Top : Pointer;
ThisBlock : LongInt;
begin
{point to end of free list}
P := FreePtr;
if OS(P).O = 0 then
Inc(OS(P).S, $1000);
{point to top of free memory}
if FreeMin = 0 then
Top := Ptr(OS(FreePtr).S+$1000, 0)
else
Top := Ptr(OS(FreePtr).S, -FreeMin);
if PtrToLong(P) < PtrToLong(Top) then
Top := P;
while OS(P).O <> 0 do begin
{search the free list for a memory block that is big enough}
with P^ do
{calculate the size of the block}
WriteLn(HexPtr(P), ' ', PtrDiff(EndPtr, OrgPtr));
{point to next record on free list}
Inc(OS(P).O, SizeOf(FreeListRec));
end;
{check block at HeapPtr^}
WriteLn(HexPtr(HeapPtr), ' ', PtrDiff(Top, HeapPtr));
end;
{$ENDIF}
end.
[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]