Browse Source

* implementation of tiny heap's GetMem changed, so that it doesn't use FreeMem
internally.

git-svn-id: trunk@28580 -

nickysn 11 years ago
parent
commit
9b41b10350
1 changed files with 17 additions and 7 deletions
  1. 17 7
      rtl/inc/tinyheap.inc

+ 17 - 7
rtl/inc/tinyheap.inc

@@ -86,7 +86,7 @@
 
     function SysTinyGetMem(Size: ptruint): pointer;
       var
-        p, prev: PTinyHeapBlock;
+        p, prev, p2: PTinyHeapBlock;
         AllocSize, RestSize: ptruint;
       begin
 {$ifdef DEBUG_TINY_HEAP}
@@ -114,15 +114,25 @@
                 RestSize := 0;
               end;
 
-            if prev = nil then
-              TinyHeapBlocks := p^.Next
+            if RestSize > 0 then
+              begin
+                p2 := pointer(TTinyHeapPointerArithmeticType(p)+AllocSize);
+                p2^.Next := p^.Next;
+                p2^.Size := EncodeTinyHeapFreeBlockSize(RestSize);
+                if prev = nil then
+                  TinyHeapBlocks := p2
+                else
+                  prev^.next := p2;
+              end
             else
-              prev^.next := p^.next;
+              begin
+                if prev = nil then
+                  TinyHeapBlocks := p^.Next
+                else
+                  prev^.next := p^.next;
+              end;
 
             PTinyHeapMemBlockSize(p)^ := size;
-
-            if RestSize > 0 then
-              InternalTinyFreeMem(pointer(TTinyHeapPointerArithmeticType(p)+AllocSize), RestSize);
           end
         else
           if ReturnNilIfGrowHeapFails then