浏览代码

Merged revisions 10612-10613,10617,10621 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r10621 | florian | 2008-04-09 23:27:11 +0200 (Mi, 09 Apr 2008) | 2 lines

* don't destroy LastError when resolving a threadvar on windows, resolves #10205 (?)
........

git-svn-id: branches/fixes_2_2@10679 -

florian 17 年之前
父节点
当前提交
64d1e2bc74
共有 2 个文件被更改,包括 33 次插入9 次删除
  1. 3 0
      rtl/win/sysos.inc
  2. 30 9
      rtl/win/systhrd.inc

+ 3 - 0
rtl/win/sysos.inc

@@ -173,6 +173,9 @@ threadvar
    function GetLastError : DWORD;
      {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetLastError';
 
+   procedure SetLastError(dwErrCode : DWORD);
+     {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'SetLastError';
+
    { time and date functions }
    function GetTickCount : longint;
      {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetTickCount';

+ 30 - 9
rtl/win/systhrd.inc

@@ -99,20 +99,41 @@ CONST
         TlsSetValue(tlskey,dataindex);
       end;
 
+
     function SysRelocateThreadvar(offset : dword) : pointer;
-	var
+      var
         dataindex : pointer;
+        errorsave : dword;
       begin
-        dataindex := TlsGetValue(tlskey);
-        if dataindex = nil then begin
-          SysAllocateThreadVars;
-          dataindex := TlsGetValue(tlskey);
+{$ifdef dummy}
+        { I've no clue why this doesn't read dataindex, imo it should (FK) }
+        asm
+          movl TLSKey,%edx
+          movl $0x2c,%eax
+          movl %fs:(%eax),%eax
+          movl (%eax,%edx,4),%eax
+          movl %eax,dataindex
         end;
+        if DataIndex=nil then
+          begin
+            errorsave:=GetLastError;
+            SysAllocateThreadVars;
+            DataIndex:=TlsGetValue(tlskey);
+            SetLastError(errorsave);
+          end;
+{$else win32}
+        errorsave:=GetLastError;
+        dataindex:=TlsGetValue(tlskey);
+        if dataindex=nil then
+          begin
+            SysAllocateThreadVars;
+            dataindex:=TlsGetValue(tlskey);
+          end;
+        SetLastError(errorsave);
+{$endif win32}
         SysRelocateThreadvar:=DataIndex+Offset;
-{
-      begin
-        SysRelocateThreadvar:=TlsGetValue(tlskey)+Offset;
-}      end;
+      end;
+
 
     procedure SysReleaseThreadVars;
       begin