Browse Source

* SysAllocateThreadVars: Make sure the data slot is only allocated once

git-svn-id: trunk@17891 -
pierre 14 years ago
parent
commit
1339c66ec9
1 changed files with 10 additions and 3 deletions
  1. 10 3
      rtl/win/systhrd.inc

+ 10 - 3
rtl/win/systhrd.inc

@@ -113,14 +113,21 @@ var
     procedure SysAllocateThreadVars;
       var
         dataindex : pointer;
+        errorsave : dword;
       begin
         { we've to allocate the memory from system  }
         { because the FPC heap management uses      }
         { exceptions which use threadvars but       }
         { these aren't allocated yet ...            }
         { allocate room on the heap for the thread vars }
-        dataindex:=pointer(LocalAlloc(LMEM_FIXED or LMEM_ZEROINIT,threadvarblocksize));
-        TlsSetValue(tlskey,dataindex);
+        errorsave:=GetLastError;
+        dataindex:=TlsGetValue(tlskey);
+        if dataindex=nil then
+          begin
+            dataindex:=pointer(LocalAlloc(LMEM_FIXED or LMEM_ZEROINIT,threadvarblocksize));
+            TlsSetValue(tlskey,dataindex);
+          end;
+        SetLastError(errorsave);
       end;
 
     function SysRelocateThreadvar(offset : dword) : pointer; forward;
@@ -154,7 +161,7 @@ var
       var
         dataindex : pointer;
         errorsave : dword;
-      begin	
+      begin
 {$ifdef dummy}
         { it least in the on windows 7 x64, this still doesn't not work, fs:(0x2c) is
           self referencing on this system (FK)