Browse Source

* while loop replaced with a repeat..until loop in InternalTinyFreeMem

git-svn-id: trunk@28161 -
nickysn 11 years ago
parent
commit
4e2cc365d1
1 changed files with 62 additions and 64 deletions
  1. 62 64
      rtl/inc/tinyheap.inc

+ 62 - 64
rtl/inc/tinyheap.inc

@@ -105,72 +105,70 @@
         b, p, prev: PTinyHeapBlock;
         b, p, prev: PTinyHeapBlock;
         concatenated: boolean;
         concatenated: boolean;
       begin
       begin
-        concatenated := true;
-        while concatenated do
-          begin
-            concatenated := false;
-            b := addr;
+        repeat
+          concatenated := false;
+          b := addr;
 
 
-            b^.Next := TinyHeapBlocks;
-            b^.Size := Size;
-            b^.EndAddr := pointer(ptruint(addr)+size);
+          b^.Next := TinyHeapBlocks;
+          b^.Size := Size;
+          b^.EndAddr := pointer(ptruint(addr)+size);
 
 
-            if TinyHeapBlocks = nil then
-              TinyHeapBlocks := b
-            else
-              begin
-                p := TinyHeapBlocks;
-                prev := nil;
-
-                while assigned(p) do
-                  begin
-                    if p^.EndAddr = addr then
-                      begin
-                        addr:=p;
-                        size:=p^.size+size;
-                        if prev = nil then
-                          TinyHeapBlocks:=p^.next
-                        else
-                          prev^.next:=p^.next;
-                        concatenated:=true;
-                        break;
-                      end
-                    else if p = b^.EndAddr then
-                      begin
-                        size:=p^.size+size;
-                        if prev = nil then
-                          TinyHeapBlocks:=p^.next
-                        else
-                          prev^.next:=p^.next;
-                        concatenated:=true;
-                        break;
-                      end;
-                    
-                    prev := p;
-                    p := p^.next;
-                  end;
-
-                if not concatenated then
-                  begin
-                    p := TinyHeapBlocks;
-                    prev := nil;
-
-                    while assigned(p) and (p^.Size < size) do
-                      begin
-                        prev := p;
-                        p := p^.Next;
-                      end;
-
-                    if assigned(prev) then
-                      begin
-                        b^.Next := p;
-                        prev^.Next := b;
-                      end
-                    else
-                      TinyHeapBlocks := b;
-                  end;
-              end;
-          end;
+          if TinyHeapBlocks = nil then
+            TinyHeapBlocks := b
+          else
+            begin
+              p := TinyHeapBlocks;
+              prev := nil;
+
+              while assigned(p) do
+                begin
+                  if p^.EndAddr = addr then
+                    begin
+                      addr:=p;
+                      size:=p^.size+size;
+                      if prev = nil then
+                        TinyHeapBlocks:=p^.next
+                      else
+                        prev^.next:=p^.next;
+                      concatenated:=true;
+                      break;
+                    end
+                  else if p = b^.EndAddr then
+                    begin
+                      size:=p^.size+size;
+                      if prev = nil then
+                        TinyHeapBlocks:=p^.next
+                      else
+                        prev^.next:=p^.next;
+                      concatenated:=true;
+                      break;
+                    end;
+
+                  prev := p;
+                  p := p^.next;
+                end;
+
+              if not concatenated then
+                begin
+                  p := TinyHeapBlocks;
+                  prev := nil;
+
+                  while assigned(p) and (p^.Size < size) do
+                    begin
+                      prev := p;
+                      p := p^.Next;
+                    end;
+
+                  if assigned(prev) then
+                    begin
+                      b^.Next := p;
+                      prev^.Next := b;
+                    end
+                  else
+                    TinyHeapBlocks := b;
+                end;
+            end;
+        until not concatenated;
       end;
       end;
 
 
     function SysTinyFreeMem(Addr: Pointer): ptruint;
     function SysTinyFreeMem(Addr: Pointer): ptruint;