in cxx/lyra/cxa_throw.cpp [109:129]
void trace_destructor(void* exception_obj) {
destructor_type original_destructor = nullptr;
{
std::lock_guard<std::mutex> lock(*get_exception_state_map_mutex());
auto* exception_state_map = get_exception_state_map();
auto it = exception_state_map->find(exception_obj);
if (it == exception_state_map->end()) {
// This really shouldn't happen, but if it does, just leaking the trace
// and exception object seems better than crashing.
return;
}
original_destructor = it->second.destructor;
exception_state_map->erase(it);
}
if (original_destructor) {
original_destructor(exception_obj);
}
}