+static void ScheduleThreadForDeletion()
+{
+ wxMutexLocker lock( *gs_mutexDeleteThread );
+
+ gs_nThreadsBeingDeleted++;
+
+ wxLogTrace(TRACE_THREADS, _T("%lu thread%s waiting to be deleted"),
+ (unsigned long)gs_nThreadsBeingDeleted,
+ gs_nThreadsBeingDeleted == 1 ? _T("") : _T("s"));
+}
+
+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, _T("Thread %ld auto deletes."), This->GetId());
+
+ delete This;
+
+ wxCHECK_RET( gs_nThreadsBeingDeleted > 0,
+ _T("no threads scheduled for deletion, yet we delete one?") );
+
+ wxLogTrace(TRACE_THREADS, _T("%lu scheduled for deletion threads left."),
+ (unsigned long)gs_nThreadsBeingDeleted - 1);
+
+ if ( !--gs_nThreadsBeingDeleted )
+ {
+ // no more threads left, signal it
+ gs_condAllDeleted->Signal();
+ }
+}
+
+void wxMutexGuiEnterImpl()