Fixes a EXC_BAD_ACCESS issue seen on Darwin when the libphobos DSO gets
unloaded. Based on reading libgcc's emutls implementation, as it
doesn't call __gthread_key_delete directly, neither should libphobos.
libphobos/ChangeLog:
* libdruntime/gcc/emutls.d (emutlsDestroyThread): Don't remove entry
from global array.
(_d_emutls_destroy): Don't call __gthread_key_delete.
extern (C) void emutlsDestroyThread(void* ptr) nothrow @nogc
{
auto arr = cast(TlsArray*) ptr;
- emutlsMutex.lock_nothrow();
- emutlsArrays.remove(arr);
- emutlsMutex.unlock_nothrow();
foreach (entry; *arr)
{
// Call this after druntime has been unloaded
void _d_emutls_destroy() nothrow @nogc
{
- if (__gthread_key_delete(emutlsKey) != 0)
- abort();
-
(cast(Mutex) _emutlsMutex.ptr).__dtor();
destroy(emutlsArrays);
}