Преглед изворни кода

* fix memory leak in RegisterLazyInitThreadingProc

git-svn-id: trunk@47311 -
ondrej пре 4 година
родитељ
комит
a65158bfe8
1 измењених фајлова са 35 додато и 6 уклоњено
  1. 35 6
      rtl/inc/thread.inc

+ 35 - 6
rtl/inc/thread.inc

@@ -353,9 +353,30 @@ end;
     lazy thread initialization support
     lazy thread initialization support
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
 
 
+type
+  PLazyInitThreadingProcInfo = ^TLazyInitThreadingProcInfo;
+  TLazyInitThreadingProcInfo = Record
+    Next     : PLazyInitThreadingProcInfo;
+    Proc     : TProcedure;
+  End;
+const
+  LazyInitThreadingProcList: PLazyInitThreadingProcInfo = nil;
+
+procedure FinalizeLazyInitThreading;
 var
 var
-  LazyInitThreadingProcs : array of TProcedure = nil;
+  p: PLazyInitThreadingProcInfo;
+begin
+  while assigned(LazyInitThreadingProcList) do
+    begin
+    p:=LazyInitThreadingProcList^.Next;
+    Dispose(LazyInitThreadingProcList);
+    LazyInitThreadingProcList:=p;
+    end;
+end;
+
 procedure RegisterLazyInitThreadingProc(const proc: TProcedure);
 procedure RegisterLazyInitThreadingProc(const proc: TProcedure);
+var
+  p: PLazyInitThreadingProcInfo;
 begin
 begin
   if IsMultiThread then
   if IsMultiThread then
     begin
     begin
@@ -364,17 +385,25 @@ begin
     end
     end
   else
   else
     begin
     begin
-    SetLength(LazyInitThreadingProcs,Length(LazyInitThreadingProcs)+1);
-    LazyInitThreadingProcs[high(LazyInitThreadingProcs)]:=proc;
+    if not assigned(LazyInitThreadingProcList) then
+      AddExitProc(@FinalizeLazyInitThreading);
+    new(p);
+    p^.Next:=LazyInitThreadingProcList;
+    p^.Proc:=proc;
+    LazyInitThreadingProcList:=p;
     end;
     end;
 end;
 end;
 
 
 procedure LazyInitThreading;
 procedure LazyInitThreading;
 var
 var
-  i: Integer;
+  p: PLazyInitThreadingProcInfo;
 begin
 begin
-  for i:=0 to high(LazyInitThreadingProcs) do
-    LazyInitThreadingProcs[i]();
+  p:=LazyInitThreadingProcList;
+  while assigned(p) do
+    begin
+    p^.Proc();
+    p:=p^.Next;
+    end;
 end;
 end;
 
 
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------