Browse Source

+ initialize threadvars defined local in units

armin 23 years ago
parent
commit
903441aa51
2 changed files with 80 additions and 2 deletions
  1. 40 1
      rtl/os2/thread.inc
  2. 40 1
      rtl/win32/thread.inc

+ 40 - 1
rtl/os2/thread.inc

@@ -90,6 +90,42 @@ begin
  Inc (ThreadVarBlockSize, Size);
 end;
 
+type ltvInitEntry = 
+  record
+    varaddr : pdword;
+    size    : longint;
+  end;
+  pltvInitEntry = ^ltvInitEntry;
+
+procedure init_unit_threadvars (tableEntry : pltvInitEntry);
+begin
+  while tableEntry^.varaddr <> nil do
+  begin
+    init_threadvar (tableEntry^.varaddr^, tableEntry^.size);
+    inc (pchar (tableEntry), sizeof (tableEntry^));
+  end;
+end;
+
+type TltvInitTablesTable =
+  record
+    count : dword;
+    tables: array [1..32767] of pltvInitEntry;
+  end;
+  
+var
+  ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_LOCALTHREADVARTABLES';
+  
+procedure init_all_unit_threadvars; [public,alias: 'FPC_INITIALIZELOCALTHREADVARS'];
+var i : integer;
+begin
+  {$ifdef DEBUG_MT}
+  WriteLn ('init_all_unit_threadvars (%d) units',ThreadvarTablesTable.count);
+  {$endif}
+  for i := 1 to ThreadvarTablesTable.count do
+    init_unit_threadvars (ThreadvarTablesTable.tables[i]);
+end;
+
+
 function Relocate_ThreadVar (TVOffset: dword): pointer;
                                       [public,alias: 'FPC_RELOCATE_THREADVAR'];
 begin
@@ -325,7 +361,10 @@ end;
 
 {
   $Log$
-  Revision 1.6  2001-10-23 21:51:03  peter
+  Revision 1.7  2002-03-28 16:34:29  armin
+  + initialize threadvars defined local in units
+
+  Revision 1.6  2001/10/23 21:51:03  peter
     * criticalsection renamed to rtlcriticalsection for kylix compatibility
 
   Revision 1.5  2001/10/09 02:42:05  carl

+ 40 - 1
rtl/win32/thread.inc

@@ -57,6 +57,42 @@ procedure init_threadvar(var offset : dword;size : dword);[public,alias: 'FPC_IN
      offset:=threadvarblocksize;
      inc(threadvarblocksize,size);
   end;
+  
+  
+type ltvInitEntry = 
+  record
+    varaddr : pdword;
+    size    : longint;
+  end;
+  pltvInitEntry = ^ltvInitEntry;
+
+procedure init_unit_threadvars (tableEntry : pltvInitEntry);
+begin
+  while tableEntry^.varaddr <> nil do
+  begin
+    init_threadvar (tableEntry^.varaddr^, tableEntry^.size);
+    inc (pchar (tableEntry), sizeof (tableEntry^));
+  end;
+end;
+
+type TltvInitTablesTable =
+  record
+    count : dword;
+    tables: array [1..32767] of pltvInitEntry;
+  end;
+  
+var
+  ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_LOCALTHREADVARTABLES';
+  
+procedure init_all_unit_threadvars; [public,alias: 'FPC_INITIALIZELOCALTHREADVARS'];
+var i : integer;
+begin
+  {$ifdef DEBUG_MT}
+  WriteLn ('init_all_unit_threadvars (%d) units',ThreadvarTablesTable.count);
+  {$endif}
+  for i := 1 to ThreadvarTablesTable.count do
+    init_unit_threadvars (ThreadvarTablesTable.tables[i]);
+end;
 
 
 function relocate_threadvar(offset : dword) : pointer;[public,alias: 'FPC_RELOCATE_THREADVAR'];
@@ -213,7 +249,10 @@ procedure LeaveCriticalSection(var cs : TRTLCriticalSection);
 
 {
   $Log$
-  Revision 1.6  2001-10-23 21:51:03  peter
+  Revision 1.7  2002-03-28 16:31:35  armin
+  + initialize threadvars defined local in units
+
+  Revision 1.6  2001/10/23 21:51:03  peter
     * criticalsection renamed to rtlcriticalsection for kylix compatibility
 
   Revision 1.5  2001/10/09 02:38:39  carl