X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a243da29c8135be476e47a035a81e695bbb21e26..7b896860bf278d10ef80d05e5ae607604819a4e6:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 700fd19324..4583b6b868 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -45,6 +45,7 @@ #include #include #include +#include // needed for at least __QNX__ #ifdef HAVE_SCHED_H #include #endif @@ -56,9 +57,7 @@ // we use wxFFile under Linux in GetCPUCount() #ifdef __LINUX__ #include "wx/ffile.h" - // For setpriority. - #include - #include + #include // for setpriority() #endif #ifdef __VMS @@ -1778,14 +1777,15 @@ static void ScheduleThreadForDeletion() static void DeleteThread(wxThread *This) { - // gs_mutexDeleteThread should be unlocked before signalling the condition - // or wxThreadModule::OnExit() would deadlock - wxMutexLocker locker( *gs_mutexDeleteThread ); - wxLogTrace(TRACE_THREADS, wxT("Thread %p auto deletes."), This->GetId()); delete This; + // only lock gs_mutexDeleteThread after deleting the thread to avoid + // calling out into user code with it locked as this may result in + // deadlocks if the thread dtor deletes another thread (see #11501) + wxMutexLocker locker( *gs_mutexDeleteThread ); + wxCHECK_RET( gs_nThreadsBeingDeleted > 0, wxT("no threads scheduled for deletion, yet we delete one?") );