|
@@ -824,9 +824,7 @@ end;
|
|
|
|
|
|
function TraceReAllocMem(var p:pointer;size:ptruint):Pointer;
|
|
function TraceReAllocMem(var p:pointer;size:ptruint):Pointer;
|
|
var
|
|
var
|
|
- newP: pointer;
|
|
|
|
- i, allocsize,
|
|
|
|
- movesize : ptruint;
|
|
|
|
|
|
+ i, allocsize : ptruint;
|
|
pl : pdword;
|
|
pl : pdword;
|
|
pp,prevpp{$ifdef EXTRA},ppv{$endif} : pheap_mem_info;
|
|
pp,prevpp{$ifdef EXTRA},ppv{$endif} : pheap_mem_info;
|
|
oldsize,
|
|
oldsize,
|
|
@@ -888,66 +886,42 @@ begin
|
|
{ Try to resize the block, if not possible we need to do a
|
|
{ Try to resize the block, if not possible we need to do a
|
|
getmem, move data, freemem }
|
|
getmem, move data, freemem }
|
|
prevpp:=pp;
|
|
prevpp:=pp;
|
|
- if not SysTryResizeMem(pp,allocsize) then
|
|
|
|
- begin
|
|
|
|
- { get a new block }
|
|
|
|
- newP := TraceGetMem(size);
|
|
|
|
- { move the data }
|
|
|
|
- if newP <> nil then
|
|
|
|
- begin
|
|
|
|
- movesize:=TraceMemSize(p);
|
|
|
|
- {if the old size is larger than the new size,
|
|
|
|
- move only the new size}
|
|
|
|
- if movesize>size then
|
|
|
|
- movesize:=size;
|
|
|
|
- move(p^,newP^,movesize);
|
|
|
|
- end;
|
|
|
|
- { release p }
|
|
|
|
- traceFreeMem(p);
|
|
|
|
- { return the new pointer }
|
|
|
|
- p:=newp;
|
|
|
|
- traceReAllocMem := newp;
|
|
|
|
- exit;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- if (pp<>prevpp) then
|
|
|
|
- begin
|
|
|
|
- { We need to update the previous/next chains }
|
|
|
|
- if assigned(pp^.previous) then
|
|
|
|
- pp^.previous^.next:=pp;
|
|
|
|
- if assigned(pp^.next) then
|
|
|
|
- pp^.next^.previous:=pp;
|
|
|
|
- if prevpp=loc_info^.heap_mem_root then
|
|
|
|
- loc_info^.heap_mem_root:=pp;
|
|
|
|
|
|
+ if (SysReAllocMem(pp,allocsize)<>prevpp) then
|
|
|
|
+ begin
|
|
|
|
+ { We need to update the previous/next chains }
|
|
|
|
+ if assigned(pp^.previous) then
|
|
|
|
+ pp^.previous^.next:=pp;
|
|
|
|
+ if assigned(pp^.next) then
|
|
|
|
+ pp^.next^.previous:=pp;
|
|
|
|
+ if prevpp=loc_info^.heap_mem_root then
|
|
|
|
+ loc_info^.heap_mem_root:=pp;
|
|
{$ifdef EXTRA}
|
|
{$ifdef EXTRA}
|
|
- { remove prevpp from prev_valid chain }
|
|
|
|
- ppv:=loc_info^.heap_valid_last;
|
|
|
|
- if (ppv=prevpp) then
|
|
|
|
- loc_info^.heap_valid_last:=pp^.prev_valid
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- while assigned(ppv) do
|
|
|
|
- begin
|
|
|
|
- if (ppv^.prev_valid=prevpp) then
|
|
|
|
- begin
|
|
|
|
- ppv^.prev_valid:=pp^.prev_valid;
|
|
|
|
- if prevpp=loc_info^.heap_valid_first then
|
|
|
|
- loc_info^.heap_valid_first:=ppv;
|
|
|
|
- ppv:=nil;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- ppv:=ppv^.prev_valid;
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- { Reinsert new value in last position }
|
|
|
|
- pp^.prev_valid:=loc_info^.heap_valid_last;
|
|
|
|
- loc_info^.heap_valid_last:=pp;
|
|
|
|
- if not assigned(loc_info^.heap_valid_first) then
|
|
|
|
- loc_info^.heap_valid_first:=pp;
|
|
|
|
|
|
+ { remove prevpp from prev_valid chain }
|
|
|
|
+ ppv:=loc_info^.heap_valid_last;
|
|
|
|
+ if (ppv=prevpp) then
|
|
|
|
+ loc_info^.heap_valid_last:=pp^.prev_valid
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ while assigned(ppv) do
|
|
|
|
+ begin
|
|
|
|
+ if (ppv^.prev_valid=prevpp) then
|
|
|
|
+ begin
|
|
|
|
+ ppv^.prev_valid:=pp^.prev_valid;
|
|
|
|
+ if prevpp=loc_info^.heap_valid_first then
|
|
|
|
+ loc_info^.heap_valid_first:=ppv;
|
|
|
|
+ ppv:=nil;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ ppv:=ppv^.prev_valid;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ { Reinsert new value in last position }
|
|
|
|
+ pp^.prev_valid:=loc_info^.heap_valid_last;
|
|
|
|
+ loc_info^.heap_valid_last:=pp;
|
|
|
|
+ if not assigned(loc_info^.heap_valid_first) then
|
|
|
|
+ loc_info^.heap_valid_first:=pp;
|
|
{$endif EXTRA}
|
|
{$endif EXTRA}
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ end;
|
|
{ Recreate the info block }
|
|
{ Recreate the info block }
|
|
pp^.sig:=longword(AllocateSig);
|
|
pp^.sig:=longword(AllocateSig);
|
|
pp^.size:=size;
|
|
pp^.size:=size;
|