|
@@ -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;
|
|
|
|
|
|
{ ---------------------------------------------------------------------
|
|
{ ---------------------------------------------------------------------
|