On 03.10.2010 13:59, Florian Klämpfl wrote:
Am 03.10.2010 11:37, schrieb Sven Barth:
Hello together!

While I looked for a solution for the bug report about external threads
on Windows ( http://bugs.freepascal.org/view.php?id=17300 ), I found the
following code in SysRelocateThreadVar in rtl/win/systhrd.inc:

==== 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)
           MVC: It also does not work on Windows Vista 32-bit, Home
Premium, SP 1. Results in a crash}
         asm
           movl TLSKey,%edx
           movl %fs:(0x2c),%eax
           orl  %eax,%eax
           jnz  .LAddressInEAX
           { this works on Windows 7, but I don't know if it works on
other OSes (FK) }
           movl %fs:(0x18),%eax
           movl 0xe10(%eax,%edx,4),%eax
           jmp  .LToDataIndex
           .LAddressInEAX:
            movl (%eax,%edx,4),%eax
           .LToDataIndex:
           movl %eax,dataindex
         end;
         if DataIndex=nil then
           begin
             errorsave:=GetLastError;
             SysAllocateThreadVars;
             DataIndex:=TlsGetValue(tlskey);
             SetLastError(errorsave);
           end;
{$else win32}

==== end ====

According to http://en.wikipedia.org/wiki/X86-64#Windows 64-bit Windows
uses GS instead of FS for the TIB. This might be the reason that the
code doesn't work on 64-bit Windows.

Also for 32 bit programs? The code above is only used by 32 bit programs.

No, not for 32 bit programs. -.-

Note to self: Study foreign code more intensively.

Regards,
Sven
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to