* lazy thread initialization support

git-svn-id: trunk@47308 -
(cherry picked from commit c64429cdd0)
This commit is contained in:
ondrej 2020-11-04 14:55:40 +00:00 committed by marcoonthegit
parent 4b91815315
commit 16010570bb
7 changed files with 50 additions and 2 deletions

View File

@ -168,6 +168,8 @@ Uses
pthread_key_create(@TLSKey,nil);
InitThreadVars(@CRelocateThreadvar);
{$endif HASTHREADVAR}
{ lazy initialize thread support }
LazyInitThreading;
IsMultiThread:=true;
end;
{ the only way to pass data to the newly created thread

View File

@ -342,6 +342,34 @@ begin
currenttm.RTLEventWaitForTimeout(state,timeout);
end;
{ ---------------------------------------------------------------------
lazy thread initialization support
---------------------------------------------------------------------}
var
LazyInitThreadingProcs : array of TProcedure = nil;
procedure RegisterLazyInitThreadingProc(const proc: TProcedure);
begin
if IsMultiThread then
begin
{ multithreading is already enabled - execute directly }
proc();
end
else
begin
SetLength(LazyInitThreadingProcs,Length(LazyInitThreadingProcs)+1);
LazyInitThreadingProcs[high(LazyInitThreadingProcs)]:=proc;
end;
end;
procedure LazyInitThreading;
var
i: Integer;
begin
for i:=0 to high(LazyInitThreadingProcs) do
LazyInitThreadingProcs[i]();
end;
{ ---------------------------------------------------------------------
ThreadManager which gives run-time error. Use if no thread support.
---------------------------------------------------------------------}

View File

@ -182,3 +182,7 @@ procedure RTLEventResetEvent(state:pRTLEvent);
procedure RTLEventWaitFor(state:pRTLEvent);
procedure RTLEventWaitFor(state:pRTLEvent;timeout : longint);
{ lazy thread initialization support }
procedure RegisterLazyInitThreadingProc(const proc: TProcedure);
{ do not call LazyInitThreading directly}
procedure LazyInitThreading;

View File

@ -156,6 +156,8 @@ function SysBeginThread(sa : Pointer;stacksize : SizeUInt;
if not IsMultiThread then
begin
InitThreadVars(@SysRelocateThreadvar);
{ lazy initialize thread support }
LazyInitThreading;
IsMultithread:=true;
end;
{ the only way to pass data to the newly created thread }

View File

@ -133,6 +133,8 @@
{ We're still running in single thread mode, setup the TLS }
pthread_key_create(@TLSKey,nil);
InitThreadVars(@SysRelocateThreadvar);
{ lazy initialize thread support }
LazyInitThreading;
IsMultiThread:=true;
end;
{ the only way to pass data to the newly created thread

View File

@ -351,7 +351,12 @@ Type PINTRTLEvent = ^TINTRTLEvent;
{ Initialize multithreading if not done }
if not TLSInitialized then
InitCTLS;
IsMultiThread:=true;
if not IsMultiThread then
begin
{ We're still running in single thread mode, lazy initialize thread support }
LazyInitThreading;
IsMultiThread:=true;
end;
{ the only way to pass data to the newly created thread
in a MT safe way, is to use the heap }

View File

@ -256,7 +256,12 @@ var
{$endif DEBUG_MT}
{ Initialize multithreading if not done }
SysInitTLS;
IsMultiThread:=true;
if not IsMultiThread then
begin
{ lazy initialize thread support }
LazyInitThreading;
IsMultiThread:=true;
end;
{ the only way to pass data to the newly created thread
in a MT safe way, is to use the heap }