diff options
author | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-05-06 12:06:58 +0000 |
---|---|---|
committer | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-05-06 12:06:58 +0000 |
commit | f694b419eb77f949aa35a11a57e9f1d5e1cd74cf (patch) | |
tree | c119025c0f68a58e5665e4d9efc473a95c192bda | |
parent | 18062609743dc2767f0aff6aad1ff1702bf8522b (diff) | |
download | fpc-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.inc | 21 | ||||
-rw-r--r-- | rtl/inc/threadvr.inc | 48 |
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; |