summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-05-04 18:51:51 +0000
committerivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-05-04 18:51:51 +0000
commit18062609743dc2767f0aff6aad1ff1702bf8522b (patch)
tree294f5b06986aaec7ed717d0870d4c4139ddb96b8
parent4a966a9ba80f81b3bbe626e1ef930006b19d44c6 (diff)
downloadfpc-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.inc21
-rw-r--r--rtl/inc/systemh.inc7
-rw-r--r--rtl/inc/thread.inc50
-rw-r--r--rtl/inc/threadh.inc5
-rw-r--r--rtl/inc/threadvr.inc7
-rw-r--r--rtl/linux/system.pp5
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}