Re: [AD] dll_tls for MSVC

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


> -----Original Message-----
> From: Trent Gamblin <nooskewl@xxxxxxxxxx>
> Sent: Mo 06.01.2014 20:28
> To: alleg-developers@xxxxxxxxxx
> Subject: Re: [AD] dll_tls for MSVC
> 
> > -----Original Message-----
> > From: Markus Henschel <markus.henschel@xxxxxxxxxx>
> > Sent: Mo 06.01.2014 18:43 
> > To: alleg-developers@xxxxxxxxxx
> > Subject: dll_tls for MSVC
> >
> > Happy New Year!
> >
> > I tried to use the dll-tls implementation of Allegro with MSVC. If I enable
> > WANT_DLL_TLS in the CMAKE build it simply gets disabled again by this
> code
> > in CMakeLists.txt:
> >
> > if(MSVC)
> >     # MSVC never needs DLL TLS and it just confuses
> >     set(ALLEGRO_CFG_DLL_TLS 0)
> > .
> >
> > I think I have a case where I need dll-tls because I have to support
> > WindowsXP. In WindowsXP compiler supported TLS doesn't work for dlls
> that
> > are dynamically loaded at runtime using LoadLibrary/LoadLibraryEx. I get
> > chrashes as soon as the thread local storage is accessed.
> > http://support.microsoft.com/kb/118816/en-us
> >
> > Windows Vista and above don't have this problem.
> >
> > I'm using allegro with .NET so I cannot load the allegro dll implicitly by the
> > import table of the executable. The only choice I have is using dll-tls. Are
> > there any objections to removing the line mentioned above from
> > CMakeLists.txt so the dll-tls implementation can be used again with MSVC?
> I
> > attached a patch for that. It also disables dll-tls by default so it is only used if
> > explicitely requested or if there is no other choice (older mingw versions).
> >
> > I noticed that the dll-tls implementation creates a thread_local_state
> object
> > for every thread created by the process after the allegro dll has been
> loaded.
> > This is inefficient because most threads probably won't need the object. I
> > also observed memory leaks because some threads in my process are
> being
> > created after the allegro dll has been loaded but are still running after the
> > allegro dll is unloaded. In this case the thread_local_state object leaks. I
> fixed
> > this by doing lazy initialization of thread_local_state. In this case only
> threads
> > that access the thread local object actually get one. There is still potential
> for
> > memory leaks if one of these threads lives longer than the allegro dll is still
> > loaded but this is much less likely. I also attached a patch for that.
> >
> > It would be nice if some of you could review/submit these patches.
> >
> > Thanks
> >
> > Markus Henschel
> 
> Are you sure non-DLL TLS works on MinGW dynamic builds? Can you point to
> some documentation that says so or test it? I may be being paranoid but it
> bothers me that it's not going to get tested.
> 
> The patch looks fine otherwise. I'll look at the other one and apply if you can
> confirm the question about MinGW.
> 
> Thanks,
> Trent

I checked the source code in tls.c. There is this code:
***************
#if defined(ALLEGRO_MINGW32) && !defined(ALLEGRO_CFG_DLL_TLS)
   /*
    * MinGW < 4.2.1 doesn't have builtin thread local storage, so we
    * must use the Windows API.
    */
   #if __GNUC__ < 4
      #define ALLEGRO_CFG_DLL_TLS
   #elif __GNUC__ == 4 && __GNUC_MINOR__ < 2
      #define ALLEGRO_CFG_DLL_TLS
   #elif __GNUC__ == 4 && __GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ < 1
      #define ALLEGRO_CFG_DLL_TLS
   #endif
#endif
***************

The author of this seemed to believe that starting with Mingw 4.2.1 native tls would work.

So I made a quick test with the current Mingw gcc version 4.8.1 and it seems to work fine. I could run several examples including ex_threads.exe and ex_threads2.exe without problems. I also ran the tests. There have been two failures:

FAIL test png interlaced [sw] - hash=a0c383ef
FAIL test projection [hw] - RMS error is 47.1281

But I doubt this has anything to do with my changes. It's kinda hard to run test tests and examples though because the executables are in a different path than the dlls. 

I had another issue when compiling allegro with mingw though. The direct sound backend didn't compile out of the box. I had compile errors about various direct sound 8 types not being defined. The reason seems to be that my DirectX 9 SDK (June 2010) dsound.h contains compile time checks for a define called NTDDI_VERSION that specifies the minimum supported windows version. This seems to be windows 2000 by default for Mingw. But for direct sound 8 you need at least WindowsXP. So I copied some code from wwindow.c that cures the issue by defining _WIN32_WINNT accordingly. I think some windows header defines NTDDI_VERSION to the right value if _WIN32_WINNT is defined beforehand. Patch is attached.

Regards,
Markus

P.S: Sorry for posting HTML to the list last time. I didn't realize that before I read your reply. I reformatted the email to contain a clean history.

Attachment: set _WIN32_WINNT-version-to-WindowsXP-to-get-Direct Sound 8.patch
Description: set _WIN32_WINNT-version-to-WindowsXP-to-get-Direct Sound 8.patch



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/