1 // (C) Copyright Michael Glassford 2004. 2 // Use, modification and distribution are subject to the 3 // Boost Software License, Version 1.0. (See accompanying file 4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include <boost/winapi/config.hpp> 7 #include <boost/thread/detail/config.hpp> 8 9 10 #if defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL) 11 12 #include <boost/thread/detail/tss_hooks.hpp> 13 14 #include <windows.h> 15 16 #if defined(__BORLANDC__) DllEntryPoint(HINSTANCE,DWORD dwReason,LPVOID)17 extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE /*hInstance*/, DWORD dwReason, LPVOID /*lpReserved*/) 18 #elif defined(_WIN32_WCE) 19 extern "C" BOOL WINAPI DllMain(HANDLE /*hInstance*/, DWORD dwReason, LPVOID /*lpReserved*/) 20 #else 21 extern "C" BOOL WINAPI DllMain(HINSTANCE /*hInstance*/, DWORD dwReason, LPVOID /*lpReserved*/) 22 #endif 23 { 24 switch(dwReason) 25 { 26 case DLL_PROCESS_ATTACH: 27 { 28 boost::on_process_enter(); 29 boost::on_thread_enter(); 30 break; 31 } 32 33 case DLL_THREAD_ATTACH: 34 { 35 boost::on_thread_enter(); 36 break; 37 } 38 39 case DLL_THREAD_DETACH: 40 { 41 boost::on_thread_exit(); 42 break; 43 } 44 45 case DLL_PROCESS_DETACH: 46 { 47 boost::on_thread_exit(); 48 boost::on_process_exit(); 49 break; 50 } 51 } 52 53 return TRUE; 54 } 55 56 namespace boost 57 { tss_cleanup_implemented()58 void tss_cleanup_implemented() 59 { 60 /* 61 This function's sole purpose is to cause a link error in cases where 62 automatic tss cleanup is not implemented by Boost.Threads as a 63 reminder that user code is responsible for calling the necessary 64 functions at the appropriate times (and for implementing an a 65 tss_cleanup_implemented() function to eliminate the linker's 66 missing symbol error). 67 68 If Boost.Threads later implements automatic tss cleanup in cases 69 where it currently doesn't (which is the plan), the duplicate 70 symbol error will warn the user that their custom solution is no 71 longer needed and can be removed. 72 */ 73 } 74 } 75 76 #else //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL) 77 78 #ifdef _MSC_VER 79 // Prevent LNK4221 warning with link=static 80 namespace boost { namespace link_static_warning_inhibit { foo()81 extern __declspec(dllexport) void foo() { } 82 } } 83 #endif 84 85 #endif //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL) 86