瀏覽代碼

* fix memory leak in RegisterLazyInitThreadingProc

git-svn-id: trunk@47311 -
(cherry picked from commit a65158bfe8eaae169e75549f02e96b50b3873a63)
ondrej 4 年之前
父節點
當前提交
c0cb2b6051
共有 1 個文件被更改,包括 35 次插入6 次删除
  1. 35 6
      rtl/inc/thread.inc

+ 35 - 6
rtl/inc/thread.inc

@@ -346,9 +346,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
@@ -357,17 +378,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;
 
 
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------