
Thorsten Ottosen <thorsten.ottosen@dezide.com> writes:
Den 27-04-2011 18:21, Anthony Williams skrev:
Thorsten Ottosen<thorsten.ottosen@dezide.com> writes:
Den 27-04-2011 17:13, Anthony Williams skrev:
Thorsten Ottosen<thorsten.ottosen@dezide.com> writes:
Is there any possibility that the initialization of this pointer in tss_pe.cpp can be made dynamic based on some parameter passed to the code? It would be really cool if we could just say
#define BOOST_THREAD_DISABLED_DLL_CALLBACK 1 #include<boost/thread.hpp>
in the code that needs it. AFAICR, we can have global data in headers as long as it is inside some template.
For the DLL callback to be called automatically, there must be an extern "C" global variable called _pRawDllMain, which must be statically initialized to point to the callback function.
I don't see how you could put that in a header without risking > multiple definition errors --- the header that initialized it would have to be included exactly once across the whole project. Failure to include it anywhere would mean that the init function would not be linked.
I searched the source directory to locate this variable. Is
extern BOOL (WINAPI * const _pRawDllMain)(HANDLE, DWORD,LPVOID);
not just a declaration of a variable located somewhere else?
As you've written it, it would be. In the real code there's actually an initializer: extern BOOL (WINAPI * const _pRawDllMain)(HANDLE, DWORD, LPVOID)=&dll_callback; which means that it is a const variable with external linkage.
If so, we only need to put the initialization of this variable in a header.
But doing so would yield multiple initialization errors.
I haven't tried it, but I think that if the application defines boost::tss_cleanup_implemented() then tss_pe.cpp will not get linked from the library, so the DLL callback will not be linked, and the MFC one should therefore work. Of course, you will then need to ensure that boost::on_thread_exit() is called when every thread exits to avoid leaking memory and/or resources.
yeah, that won't work well. Then it's far better to include a seperate .cpp file.
Anyone care to try the attached file? Anthony -- Author of C++ Concurrency in Action http://www.stdthread.co.uk/book/ just::thread C++0x thread library http://www.stdthread.co.uk Just Software Solutions Ltd http://www.justsoftwaresolutions.co.uk 15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK. Company No. 5478976