2
0
mirror of https://github.com/boostorg/thread.git synced 2026-02-08 23:22:13 +00:00

Simplify TSS cleanup routines. Fixes #236

Instead of wrapping a default or user provided destructor into a virtual
class and placing it into a shared_ptr it is now stored directly with
an elided type, to not introduce UB it is not called directly but through
a helper function which casts it back to the original type before calling.
This commit is contained in:
Nikita Kniazev
2018-11-17 04:03:52 +03:00
parent dfe6cc3c49
commit 970dcb8afd
5 changed files with 55 additions and 61 deletions

View File

@@ -111,7 +111,7 @@ namespace boost
= thread_info->tss_data.begin();
if(current->second.func && (current->second.value!=0))
{
(*current->second.func)(current->second.value);
(*current->second.caller)(current->second.func,current->second.value);
}
thread_info->tss_data.erase(current);
}
@@ -726,11 +726,12 @@ namespace boost
}
void add_new_tss_node(void const* key,
boost::shared_ptr<tss_cleanup_function> func,
detail::tss_data_node::cleanup_caller_t caller,
detail::tss_data_node::cleanup_func_t func,
void* tss_data)
{
detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
current_thread_data->tss_data.insert(std::make_pair(key,tss_data_node(func,tss_data)));
current_thread_data->tss_data.insert(std::make_pair(key,tss_data_node(caller,func,tss_data)));
}
void erase_tss_node(void const* key)
@@ -743,17 +744,19 @@ namespace boost
}
void set_tss_data(void const* key,
boost::shared_ptr<tss_cleanup_function> func,
detail::tss_data_node::cleanup_caller_t caller,
detail::tss_data_node::cleanup_func_t func,
void* tss_data,bool cleanup_existing)
{
if(tss_data_node* const current_node=find_tss_data(key))
{
if(cleanup_existing && current_node->func && (current_node->value!=0))
{
(*current_node->func)(current_node->value);
(*current_node->caller)(current_node->func,current_node->value);
}
if(func || (tss_data!=0))
{
current_node->caller=caller;
current_node->func=func;
current_node->value=tss_data;
}
@@ -764,7 +767,7 @@ namespace boost
}
else if(func || (tss_data!=0))
{
add_new_tss_node(key,func,tss_data);
add_new_tss_node(key,caller,func,tss_data);
}
}
}