* lazy thread initialization support

git-svn-id: trunk@47308 -
This commit is contained in:
ondrej 2020-11-04 14:55:40 +00:00
parent 519701960c
commit c64429cdd0
7 changed files with 50 additions and 2 deletions

View File

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

View File

@ -349,6 +349,34 @@ begin
currenttm.RTLEventWaitForTimeout(state,timeout); currenttm.RTLEventWaitForTimeout(state,timeout);
end; 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. ThreadManager which gives run-time error. Use if no thread support.
---------------------------------------------------------------------} ---------------------------------------------------------------------}

View File

@ -183,3 +183,7 @@ procedure RTLEventResetEvent(state:pRTLEvent);
procedure RTLEventWaitFor(state:pRTLEvent); procedure RTLEventWaitFor(state:pRTLEvent);
procedure RTLEventWaitFor(state:pRTLEvent;timeout : longint); 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 if not IsMultiThread then
begin begin
InitThreadVars(@SysRelocateThreadvar); InitThreadVars(@SysRelocateThreadvar);
{ lazy initialize thread support }
LazyInitThreading;
IsMultithread:=true; IsMultithread:=true;
end; end;
{ the only way to pass data to the newly created thread } { 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 } { We're still running in single thread mode, setup the TLS }
pthread_key_create(@TLSKey,nil); pthread_key_create(@TLSKey,nil);
InitThreadVars(@SysRelocateThreadvar); InitThreadVars(@SysRelocateThreadvar);
{ lazy initialize thread support }
LazyInitThreading;
IsMultiThread:=true; IsMultiThread:=true;
end; end;
{ the only way to pass data to the newly created thread { the only way to pass data to the newly created thread

View File

@ -357,7 +357,12 @@ Type PINTRTLEvent = ^TINTRTLEvent;
{ Initialize multithreading if not done } { Initialize multithreading if not done }
if not TLSInitialized then if not TLSInitialized then
InitCTLS; 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 { the only way to pass data to the newly created thread
in a MT safe way, is to use the heap } in a MT safe way, is to use the heap }

View File

@ -256,7 +256,12 @@ var
{$endif DEBUG_MT} {$endif DEBUG_MT}
{ Initialize multithreading if not done } { Initialize multithreading if not done }
SysInitTLS; 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 { the only way to pass data to the newly created thread
in a MT safe way, is to use the heap } in a MT safe way, is to use the heap }