libphobos: Don't call __gthread_key_delete in the emutls destroy function.
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.
This commit is contained in:
parent
ea2954df43
commit
d686cb0d74
|
@ -229,9 +229,6 @@ void** emutlsAlloc(shared __emutls_object* obj) nothrow @nogc
|
||||||
extern (C) void emutlsDestroyThread(void* ptr) nothrow @nogc
|
extern (C) void emutlsDestroyThread(void* ptr) nothrow @nogc
|
||||||
{
|
{
|
||||||
auto arr = cast(TlsArray*) ptr;
|
auto arr = cast(TlsArray*) ptr;
|
||||||
emutlsMutex.lock_nothrow();
|
|
||||||
emutlsArrays.remove(arr);
|
|
||||||
emutlsMutex.unlock_nothrow();
|
|
||||||
|
|
||||||
foreach (entry; *arr)
|
foreach (entry; *arr)
|
||||||
{
|
{
|
||||||
|
@ -308,9 +305,6 @@ void _d_emutls_scan(scope void delegate(void* pbeg, void* pend) nothrow cb) noth
|
||||||
// Call this after druntime has been unloaded
|
// Call this after druntime has been unloaded
|
||||||
void _d_emutls_destroy() nothrow @nogc
|
void _d_emutls_destroy() nothrow @nogc
|
||||||
{
|
{
|
||||||
if (__gthread_key_delete(emutlsKey) != 0)
|
|
||||||
abort();
|
|
||||||
|
|
||||||
(cast(Mutex) _emutlsMutex.ptr).__dtor();
|
(cast(Mutex) _emutlsMutex.ptr).__dtor();
|
||||||
destroy(emutlsArrays);
|
destroy(emutlsArrays);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue