summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-05-06 12:06:58 +0000
committerivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-05-06 12:06:58 +0000
commitf694b419eb77f949aa35a11a57e9f1d5e1cd74cf (patch)
treec119025c0f68a58e5665e4d9efc473a95c192bda
parent18062609743dc2767f0aff6aad1ff1702bf8522b (diff)
downloadfpc-newthreading.tar.gz
* extended threadvar definition arraynewthreading
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/newthreading@7291 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/inc/thread.inc21
-rw-r--r--rtl/inc/threadvr.inc48
2 files changed, 35 insertions, 34 deletions
diff --git a/rtl/inc/thread.inc b/rtl/inc/thread.inc
index b0e322726c..d6a5d2869e 100644
--- a/rtl/inc/thread.inc
+++ b/rtl/inc/thread.inc
@@ -222,32 +222,27 @@ const
*****************************************************************************}
procedure ThreadSetup(const Stack: Pointer; const StackSize: PtrUInt);
-var
- p: function(Offset: Longword): pointer; register;
begin
{ if not IsMultiThread then
IsMultiThread := True;}
{ install threadvar handler }
-WriteLn('A');
- p := @ThreadVarLocate;
if fpc_threadvar_relocate_proc = nil then
- fpc_threadvar_relocate_proc := p;
-WriteLn('B');
+ fpc_threadvar_relocate_proc := @ThreadVarLocate;
-// 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;
+ 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;
+ StackLength := CheckInitialStkLen(StackSize);
+ StackBottom := Stack - StackLength;
+ StackTop := Stack;
end;
{$ifndef HAS_MT_MEMORYMANAGER}
diff --git a/rtl/inc/threadvr.inc b/rtl/inc/threadvr.inc
index 134652ee2e..8cc3976e31 100644
--- a/rtl/inc/threadvr.inc
+++ b/rtl/inc/threadvr.inc
@@ -21,15 +21,22 @@
type
- pltvInitEntry = ^ltvInitEntry;
- ltvInitEntry = packed record
- varaddr : plongword;
- size : longint;
+ PltvValue = ^TltvValue;
+ TltvValue = packed record
+ offset : Longword;
+ initvalue : packed array[0..0] of byte;
+ // size of initvalue is defined by TltvEntry.Size
+ end;
+
+ PltvEntry = ^TltvEntry;
+ TltvEntry = packed record
+ varaddr : PltvValue;
+ size : Longint;
end;
TltvInitTablesTable = packed record
- count : longword;
- tables : packed array [1..32767] of pltvInitEntry;
+ count : Longword;
+ tables : packed array[1..32767] of PltvEntry;
end;
var
@@ -37,7 +44,7 @@ var
ThreadvarContainerSize : PtrUInt;
-procedure copy_unit_threadthreadvars(p: pointer; tableEntry: pltvInitEntry);
+procedure copy_unit_threadvars(p: pointer; tableEntry: PltvEntry);
var
src: pointer;
dst: pointer;
@@ -45,25 +52,24 @@ begin
while tableEntry^.varaddr <> nil do
begin
{ copy initial threadvar data to TLS section }
- src := pointer(pchar(tableEntry^.varaddr)+sizeof(pointer));
- dst := pointer(PtrUInt(P) + tableEntry^.varaddr^);
+ src := @tableEntry^.varaddr^.initvalue;
+ dst := pointer(ptruint(P) + tableEntry^.varaddr^.offset);
move(src^, dst^, tableEntry^.size);
{ goto next entry }
- inc(pchar(tableEntry), sizeof(tableEntry^));
+ inc(tableEntry);
end;
end;
-function ThreadVarLocate(Offset: Longword): pointer; register;
+function ThreadVarLocate(Offset: longword): pointer; register;
var
P: pointer;
begin
- WriteLn('ThreadVarLocate');
-// P := __CurrentTM.TlsSectionGet();
-// Result := pointer(ptruint(P) + Offset);
+ P := __CurrentTM.TlsSectionGet();
+ Result := pointer(ptruint(P) + Offset);
end;
-procedure InitTlsSection(var Address: Pointer);
+procedure InitTlsSection(var address: pointer);
var
i: integer;
begin
@@ -73,17 +79,17 @@ begin
{ copy threadvar initial data to TLS section }
for i := 1 to ThreadvarTablesTable.count do
- copy_unit_threadthreadvars(Address, ThreadvarTablesTable.tables[i]);
+ copy_unit_threadvars(Address, ThreadvarTablesTable.tables[i]);
end;
-procedure FreeTlsSection(var Address: Pointer);
+procedure FreeTlsSection(var address: pointer);
begin
FreeMem(Address);
Address := nil;
end;
-procedure init_unit_threadthreadvars(tableEntry: pltvInitEntry);
+procedure init_unit_threadvars(tableEntry: pltvEntry);
var
size: integer;
begin
@@ -97,11 +103,11 @@ begin
size := tableEntry^.size;
{ offset means byte offset inside tls section }
- tableEntry^.varaddr^ := ThreadvarContainerSize;
+ tableEntry^.varaddr^.offset := ThreadvarContainerSize;
inc(ThreadvarContainerSize, size);
{ goto next entry }
- inc(pchar(tableEntry), sizeof(tableEntry^));
+ inc(tableEntry);
end;
end;
@@ -114,7 +120,7 @@ begin
WriteLn ('InitThreadvars (',ThreadvarTablesTable.count,') units');
{$endif}
for i := 1 to ThreadvarTablesTable.count do
- init_unit_threadthreadvars(ThreadvarTablesTable.tables[i]);
+ init_unit_threadvars(ThreadvarTablesTable.tables[i]);
end;