mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-06 14:38:25 +02:00
* fix memory leak in RegisterLazyInitThreadingProc
git-svn-id: trunk@47311 -
(cherry picked from commit a65158bfe8
)
This commit is contained in:
parent
8db3828637
commit
c0cb2b6051
@ -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);
|
if not assigned(LazyInitThreadingProcList) then
|
||||||
LazyInitThreadingProcs[high(LazyInitThreadingProcs)]:=proc;
|
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
|
p:=LazyInitThreadingProcList;
|
||||||
LazyInitThreadingProcs[i]();
|
while assigned(p) do
|
||||||
|
begin
|
||||||
|
p^.Proc();
|
||||||
|
p:=p^.Next;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ ---------------------------------------------------------------------
|
{ ---------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user