From a65158bfe8eaae169e75549f02e96b50b3873a63 Mon Sep 17 00:00:00 2001 From: ondrej Date: Wed, 4 Nov 2020 20:10:43 +0000 Subject: [PATCH] * fix memory leak in RegisterLazyInitThreadingProc git-svn-id: trunk@47311 - --- rtl/inc/thread.inc | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/rtl/inc/thread.inc b/rtl/inc/thread.inc index fb3f961ed3..c4826960db 100644 --- a/rtl/inc/thread.inc +++ b/rtl/inc/thread.inc @@ -353,9 +353,30 @@ end; lazy thread initialization support ---------------------------------------------------------------------} +type + PLazyInitThreadingProcInfo = ^TLazyInitThreadingProcInfo; + TLazyInitThreadingProcInfo = Record + Next : PLazyInitThreadingProcInfo; + Proc : TProcedure; + End; +const + LazyInitThreadingProcList: PLazyInitThreadingProcInfo = nil; + +procedure FinalizeLazyInitThreading; 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); +var + p: PLazyInitThreadingProcInfo; begin if IsMultiThread then begin @@ -364,17 +385,25 @@ begin end else 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; procedure LazyInitThreading; var - i: Integer; + p: PLazyInitThreadingProcInfo; begin - for i:=0 to high(LazyInitThreadingProcs) do - LazyInitThreadingProcs[i](); + p:=LazyInitThreadingProcList; + while assigned(p) do + begin + p^.Proc(); + p:=p^.Next; + end; end; { ---------------------------------------------------------------------