Pārlūkot izejas kodu

* tiny optimization to heap manager: implement freeoslist as a fifo (instead of lifo) which should allow more os chunks to keep their fixed size formatting in case of diverse fixed size usage

git-svn-id: trunk@7237 -
micha 18 gadi atpakaļ
vecāks
revīzija
09a60a4019
1 mainītis faili ar 10 papildinājumiem un 1 dzēšanām
  1. 10 1
      rtl/inc/heap.inc

+ 10 - 1
rtl/inc/heap.inc

@@ -182,6 +182,7 @@ var
   freelists_fixed    : tfreelists;
   freelist_var       : pmemchunk_var;
   freeoslist         : poschunk;
+  freeoslistend      : poschunk;
   freeoslistcount    : dword;
 
 {$endif HAS_MEMORYMANAGER}
@@ -639,7 +640,10 @@ begin
   else
     begin
 {$endif}
-      poc^.next := freeoslist;
+      if freeoslistend = nil then
+        freeoslistend := poc
+      else
+        freeoslistend^.next := poc;
       freeoslist := poc;
       inc(freeoslistcount);
 {$ifdef HAS_SYSOSFREE}
@@ -823,6 +827,8 @@ begin
           freeoslist := poc
         else
           prev_poc^.next := poc;
+        if poc = nil then
+          freeoslistend := nil;
         continue;
       end;
       pocsize := poc^.size and sizemask;
@@ -834,6 +840,8 @@ begin
             freeoslist := poc^.next
           else
             prev_poc^.next := poc^.next;
+          if poc^.next = nil then
+            freeoslistend := nil;
           dec(freeoslistcount);
           pmc := pmemchunk_fixed(pointer(poc)+fixedfirstoffset);
           if pmc^.size <> 0 then
@@ -1390,6 +1398,7 @@ begin
       dec(freeoslistcount);
       freeoslist:=poc;
     end;
+  freeoslistend:=nil;
 {$endif HAS_SYSOSFREE}
   { release mutex }
   MemoryMutexManager.MutexDone;