mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 01:08:07 +02:00
* lazy thread initialization support
git-svn-id: trunk@47308 -
(cherry picked from commit c64429cdd0
)
This commit is contained in:
parent
4b91815315
commit
16010570bb
@ -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
|
||||
|
@ -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.
|
||||
---------------------------------------------------------------------}
|
||||
|
@ -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;
|
||||
|
@ -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 }
|
||||
|
@ -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
|
||||
|
@ -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 }
|
||||
|
@ -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 }
|
||||
|
Loading…
Reference in New Issue
Block a user