Browse Source

Fix threadvar handling. Basically a merge of r31913 of my packages branch.

rtl/inc/system.inc:
  * provide a public alias for SetupEntryInformation so that it can be used in SysInit as well without globally exporting it
rtl/win/systlsdir.inc:
  * Exec_tls_callback: call SetupEntryInformation before initalizing the heap and multithreading so that the threadvar tables can be referenced correctly

git-svn-id: trunk@33035 -
svenbarth 9 years ago
parent
commit
1951b8aaaa
2 changed files with 17 additions and 1 deletions
  1. 1 1
      rtl/inc/system.inc
  2. 16 0
      rtl/win/systlsdir.inc

+ 1 - 1
rtl/inc/system.inc

@@ -121,7 +121,7 @@ var
 {$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
 
 {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
-procedure SetupEntryInformation(const info: TEntryInformation);
+procedure SetupEntryInformation(const info: TEntryInformation);[public,alias:'_FPC_SetupEntryInformation'];
 begin
   EntryInformation := info;
   FPCResStrInitTables := info.ResStrInitTables;

+ 16 - 0
rtl/win/systlsdir.inc

@@ -21,6 +21,11 @@
 { This is only useful for executables
   for DLLs, DLL_Entry gets called. PM }
 {$ifdef FPC_INSSIDE_SYSINIT}
+
+{$ifdef win32}
+{$define FPC_HAS_INDIRECT_MAIN_INFORMATION}
+{$endif win32}
+
 Const
   DLL_PROCESS_ATTACH = 1;
   DLL_THREAD_ATTACH = 2;
@@ -45,6 +50,11 @@ function TlsGetValue(dwTlsIndex : DWord) : pointer; stdcall;
 procedure InitSystemThreads; external name '_FPC_InitSystemThreads';
 procedure SysAllocateThreadVars; external name '_FPC_SysAllocateThreadVars';
 procedure InitHeap; external name '_FPC_InitHeap';
+
+{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
+procedure SetupEntryInformation(const info: TEntryInformation); external name '_FPC_SetupEntryInformation';
+{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
+
 {$endif FPC_INSSIDE_SYSINIT}
 
 procedure Exec_Tls_callback(Handle : pointer; reason : Dword; Reserved : pointer);
@@ -67,6 +77,12 @@ procedure Exec_Tls_callback(Handle : pointer; reason : Dword; Reserved : pointer
          and the EntryInformation is a constant which sholud prevent troubles }
        DLL_PROCESS_ATTACH:
          begin
+           {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
+           { since this procedure is called before SetupEntryInformation and thus
+             before EXE_Entry we need to setup the entry information here so that
+             the threadvar handling can be correctly initialized }
+           SetupEntryInformation(SysInitEntryInformation);
+           {$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
            InitHeap;
            InitSystemThreads;
          end;