diff options
author | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-05-04 18:51:51 +0000 |
---|---|---|
committer | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-05-04 18:51:51 +0000 |
commit | 18062609743dc2767f0aff6aad1ff1702bf8522b (patch) | |
tree | 294f5b06986aaec7ed717d0870d4c4139ddb96b8 | |
parent | 4a966a9ba80f81b3bbe626e1ef930006b19d44c6 (diff) | |
download | fpc-18062609743dc2767f0aff6aad1ff1702bf8522b.tar.gz |
* fixed bugs
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/newthreading@7263 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | rtl/inc/system.inc | 21 | ||||
-rw-r--r-- | rtl/inc/systemh.inc | 7 | ||||
-rw-r--r-- | rtl/inc/thread.inc | 50 | ||||
-rw-r--r-- | rtl/inc/threadh.inc | 5 | ||||
-rw-r--r-- | rtl/inc/threadvr.inc | 7 | ||||
-rw-r--r-- | rtl/linux/system.pp | 5 |
6 files changed, 48 insertions, 47 deletions
diff --git a/rtl/inc/system.inc b/rtl/inc/system.inc index 0dd8c8aa50..6c432878a5 100644 --- a/rtl/inc/system.inc +++ b/rtl/inc/system.inc @@ -583,12 +583,12 @@ Begin End; -Function GetThreadID:TRTLThread;{$ifdef SYSTEMINLINE}inline;{$endif} -begin -(* ThreadID is stored in a threadvar and made available in interface *) -(* to allow setup of this value during thread initialization. *) - GetThreadID := ThreadID; -end; +//Function GetThreadID:TRTLThread;{$ifdef SYSTEMINLINE}inline;{$endif} +//begin +//(* ThreadID is stored in a threadvar and made available in interface *) +//(* to allow setup of this value during thread initialization. *) +// GetThreadID := ThreadID; +//end; function fpc_safecallcheck(res : hresult) : hresult;[public,alias:'FPC_SAFECALLCHECK']; compilerproc; @@ -1154,6 +1154,15 @@ var { OS Dependent implementation } {$i systhrd.inc} + +procedure InitThreading; +begin + __CurrentTM := NoThreadManager; + fpc_threadvar_relocate_proc := nil; + + InitThreadVars; + InitSystemThreads; +end; {$endif FPC_HAS_FEATURE_THREADING} diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc index da1817c863..14300f603a 100644 --- a/rtl/inc/systemh.inc +++ b/rtl/inc/systemh.inc @@ -367,11 +367,8 @@ var var cmdline:Pchar=nil; {$endif} -type - TRTLThread = type Pointer; - ThreadVar - ThreadID : TRTLThread; +// ThreadID : TRTLThread; { Standard In- and Output } ErrOutput, Output, @@ -707,7 +704,7 @@ Function Sptr:Pointer;{$ifdef SYSTEMINLINE}inline;{$endif}[internconst:fpc_in_co {$ifdef FPC_HAS_FEATURE_PROCESSES} Function GetProcessID:SizeUInt; -Function GetThreadID:TRTLThread;{$ifdef SYSTEMINLINE}inline;{$endif} +//Function GetThreadID:TRTLThread;{$ifdef SYSTEMINLINE}inline;{$endif} {$endif FPC_HAS_FEATURE_PROCESSES} function InterLockedIncrement (var Target: longint) : longint; public name 'FPC_INTERLOCKEDINCREMENT'; diff --git a/rtl/inc/thread.inc b/rtl/inc/thread.inc index b17d202d69..b0e322726c 100644 --- a/rtl/inc/thread.inc +++ b/rtl/inc/thread.inc @@ -222,28 +222,32 @@ const *****************************************************************************} procedure ThreadSetup(const Stack: Pointer; const StackSize: PtrUInt); +var + p: function(Offset: Longword): pointer; register; begin - if not IsMultiThread then - IsMultiThread := True; +{ if not IsMultiThread then + IsMultiThread := True;} { install threadvar handler } +WriteLn('A'); + p := @ThreadVarLocate; if fpc_threadvar_relocate_proc = nil then - fpc_threadvar_relocate_proc := @ThreadVarLocate; + fpc_threadvar_relocate_proc := p; +WriteLn('B'); - SysResetFPU; +// SysResetFPU; { ExceptAddrStack and ExceptObjectStack are threadvars } { so every thread has its on exception handling capabilities } - SysInitExceptions; +// SysInitExceptions; { Open all stdio fds again } - SysInitStdio; - InOutRes := 0; - // ErrNo := 0; +// SysInitStdio; +// InOutRes := 0; +// ErrNo := 0; { Stack checking } // maybe check if Sptr is inside the range of Stack and Stack-StackSize - StackLength := CheckInitialStkLen(StackSize); - StackBottom := Stack - StackLength; - StackTop := Stack; - ThreadID := __CurrentTM.ThreadGetCurrent(); +// StackLength := CheckInitialStkLen(StackSize); +// StackBottom := Stack - StackLength; +// StackTop := Stack; end; {$ifndef HAS_MT_MEMORYMANAGER} @@ -279,28 +283,21 @@ const ); {$endif HAS_MT_MEMORYMANAGER} -function GetThreadManager(var Manager: TThreadManager): Boolean; -begin - Manager := __CurrentTM; - Result := True; -end; - -function SetThreadManager(const NewManager: TThreadManager): Boolean; +function InstallThreadManager(const NewManager: TThreadManager): Boolean; var OldManager: TThreadManager; begin if IsMultiThread then Exit(False); -{ release current thread manager } - OldManager := __CurrentTM; {$ifndef HAS_MT_MEMORYMANAGER} // SetMemoryMutexManager(MemoryMutexManager); {$endif HAS_MT_MEMORYMANAGER} - fpc_threadvar_relocate_proc := nil; - ThreadID := nil; - __CurrentTM := NoThreadManager; +{ release current thread manager } + OldManager := __CurrentTM; + fpc_threadvar_relocate_proc := nil; + __CurrentTM := NewManager; if Assigned(OldManager.DoneManager) then OldManager.DoneManager(); @@ -308,12 +305,11 @@ begin Result := NewManager.InitManager(@ThreadSetup, @InitTlsSection, @FreeTlsSection); if Result then begin - __CurrentTM := NewManager; {$ifndef HAS_MT_MEMORYMANAGER} // SetMemoryMutexManager(HeapMutexManager); {$endif HAS_MT_MEMORYMANAGER} - ThreadID := GetCurrentThreadID; - end; + end else + __CurrentTM := NoThreadManager; end; diff --git a/rtl/inc/threadh.inc b/rtl/inc/threadh.inc index 7c9c708d9e..c7730358e3 100644 --- a/rtl/inc/threadh.inc +++ b/rtl/inc/threadh.inc @@ -29,7 +29,7 @@ type TThreadManagerDoneHandler = procedure; // Thread Callbacks -// TRTLThread = type Pointer; defined in systemh.inc + TRTLThread = type Pointer; TRTLThreadFunc = function(const Arg: Pointer): PtrInt; register; TThreadBeginHandler = function(const StackSize: PtrUInt; const Func: TRTLThreadFunc; const Arg: Pointer; var ThreadId: TRTLThread): Boolean; TThreadExitHandler = procedure(const ExitCode: PtrInt); @@ -106,8 +106,7 @@ type Thread Handler routines *****************************************************************************} -function GetThreadManager(var Manager: TThreadManager): Boolean; -function SetThreadManager(const NewManager: TThreadManager): Boolean; +function InstallThreadManager(const NewManager: TThreadManager): Boolean; {***************************************************************************** diff --git a/rtl/inc/threadvr.inc b/rtl/inc/threadvr.inc index 228dda27f7..134652ee2e 100644 --- a/rtl/inc/threadvr.inc +++ b/rtl/inc/threadvr.inc @@ -54,12 +54,13 @@ begin end; end; -function ThreadVarLocate(Offset: Longword): pointer; +function ThreadVarLocate(Offset: Longword): pointer; register; var P: pointer; begin - P := __CurrentTM.TlsSectionGet(); - Result := pointer(ptruint(P) + Offset); + WriteLn('ThreadVarLocate'); +// P := __CurrentTM.TlsSectionGet(); +// Result := pointer(ptruint(P) + Offset); end; procedure InitTlsSection(var Address: Pointer); diff --git a/rtl/linux/system.pp b/rtl/linux/system.pp index 852c7452d3..944d9e8ebd 100644 --- a/rtl/linux/system.pp +++ b/rtl/linux/system.pp @@ -310,6 +310,7 @@ begin {$endif} IsConsole := TRUE; StackLength := CheckInitialStkLen(initialStkLen); + StackTop := initialstkptr; StackBottom := initialstkptr - StackLength; { Set up signals handlers } InstallSignals; @@ -328,9 +329,7 @@ begin { Reset IO Error } InOutRes:=0; { threading } - SetThreadManager(NoThreadManager); - InitThreadVars; - InitSystemThreads; + InitThreading; initvariantmanager; initwidestringmanager; {$ifdef SYSTEMDEBUG} |