diff -ur old/once.cpp new/once.cpp --- old/once.cpp 2011-04-28 12:31:03.000000000 +0200 +++ new/once.cpp 2011-04-28 12:37:23.000000000 +0200 @@ -8,6 +8,7 @@ #include #include #include +#include namespace boost { @@ -21,6 +22,7 @@ { pthread_key_t epoch_tss_key; pthread_once_t epoch_tss_key_flag=PTHREAD_ONCE_INIT; + const pthread_once_t pthread_once_init_value=PTHREAD_ONCE_INIT; extern "C" void delete_epoch_tss_data(void* data) { @@ -31,7 +33,12 @@ { BOOST_VERIFY(!pthread_key_create(&epoch_tss_key,delete_epoch_tss_data)); } - + + void __attribute__((destructor)) delete_epoch_tss_key_on_dlclose() + { + if(memcmp(&epoch_tss_key_flag, &pthread_once_init_value, sizeof(pthread_once_t))) + pthread_key_delete(epoch_tss_key); + } } boost::uintmax_t& get_once_per_thread_epoch() diff -ur old/thread.cpp new/thread.cpp --- old/thread.cpp 2011-04-28 12:31:09.000000000 +0200 +++ new/thread.cpp 2011-04-28 12:38:21.000000000 +0200 @@ -101,6 +101,12 @@ { BOOST_VERIFY(!pthread_key_create(¤t_thread_tls_key,&tls_destructor)); } + + void __attribute__((destructor)) delete_current_thread_tls_key_on_dlclose() + { + if (current_thread_tls_init_flag.epoch!=BOOST_ONCE_INITIAL_FLAG_VALUE) + pthread_key_delete(current_thread_tls_key); + } } boost::detail::thread_data_base* get_current_thread_data()