@@ -211,7 +211,7 @@ namespace detail
211211 {
212212 return error_id_storage_;
213213 }
214- };
214+ }; // class slot_map
215215
216216 class module_state
217217 {
@@ -300,14 +300,15 @@ namespace detail
300300 }
301301 else if (dwReason == DLL_PROCESS_DETACH)
302302 {
303+ BOOST_LEAF_ASSERT (sm_ || tls_failures_);
303304 if (sm_)
304305 {
305306 sm_->release ();
306307 sm_ = nullptr ;
307308 }
308309 }
309310 }
310- };
311+ }; // class module_state
311312
312313 template <int = 0 >
313314 struct module
@@ -334,19 +335,19 @@ namespace detail
334335#ifdef _MSC_VER
335336#pragma section(".CRT$XLB", long, read)
336337#pragma data_seg(push, ".CRT$XLB")
337- extern " C" PIMAGE_TLS_CALLBACK boost_leaf_tls_callback = tls_callback;
338+ extern " C" __declspec (selectany) PIMAGE_TLS_CALLBACK boost_leaf_tls_callback = tls_callback;
338339#pragma data_seg(pop)
339340#ifdef _WIN64
340341#pragma comment(linker, "/INCLUDE:boost_leaf_tls_callback")
341342#else
342343#pragma comment(linker, "/INCLUDE:_boost_leaf_tls_callback")
343344#endif
344345#elif defined(__GNUC__)
345- extern " C" __attribute__ ((used)) PIMAGE_TLS_CALLBACK boost_leaf_tls_callback __attribute__ ((section (" .CRT$XLB" ))) = tls_callback;
346+ extern " C" __attribute__ ((used, weak )) PIMAGE_TLS_CALLBACK boost_leaf_tls_callback __attribute__ ((section (" .CRT$XLB" ))) = tls_callback;
346347#endif
347- }
348+ } // namespace detail
348349
349- } }
350+ } } // namespace boost::leaf
350351
351352// //////////////////////////////////////
352353
@@ -377,14 +378,11 @@ namespace tls
377378 }
378379
379380 template <class T >
380- BOOST_LEAF_ALWAYS_INLINE void write_ptr_alloc (T * p )
381+ BOOST_LEAF_ALWAYS_INLINE void reserve_ptr ( )
381382 {
382383 using namespace detail ;
383384 thread_local DWORD const cached_slot = module <>::state.sm ().get (type_hash<T>());
384- DWORD slot = cached_slot;
385- BOOST_LEAF_ASSERT (slot != TLS_OUT_OF_INDEXES);
386- BOOL r = TlsSetValue (slot, p);
387- BOOST_LEAF_ASSERT (r), (void ) r;
385+ BOOST_LEAF_ASSERT (cached_slot != TLS_OUT_OF_INDEXES), (void ) cached_slot;
388386 }
389387
390388 template <class T >
@@ -412,8 +410,8 @@ namespace tls
412410 BOOST_LEAF_ASSERT (GetLastError () == ERROR_SUCCESS);
413411 return static_cast <T *>(value);
414412 }
415- }
413+ } // namespace tls
416414
417- } }
415+ } } // namespace boost::leaf
418416
419- #endif // BOOST_LEAF_CONFIG_TLS_WIN32_HPP_INCLUDED
417+ #endif // #ifndef BOOST_LEAF_CONFIG_TLS_WIN32_HPP_INCLUDED
0 commit comments