#include "wx/dynarray.h"
#include "wx/intl.h"
#include "wx/log.h"
+ #include "wx/utils.h"
+ #include "wx/timer.h"
+ #include "wx/stopwatch.h"
+ #include "wx/module.h"
#endif
-#include "wx/module.h"
-#include "wx/utils.h"
-#include "wx/timer.h"
-#include "wx/stopwatch.h"
-
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// be left in memory
static wxArrayThread gs_allThreads;
+// a mutex to protect gs_allThreads
+static wxMutex *gs_mutexAllThreads = NULL;
+
// the id of the main thread
static pthread_t gs_tidMain = (pthread_t)-1;
wxThread::wxThread(wxThreadKind kind)
{
// add this thread to the global list of all threads
- gs_allThreads.Add(this);
+ {
+ wxMutexLocker lock(*gs_mutexAllThreads);
+
+ gs_allThreads.Add(this);
+ }
m_internal = new wxThreadInternal();
delete m_internal;
// remove this thread from the global array
- gs_allThreads.Remove(this);
+ {
+ wxMutexLocker lock(*gs_mutexAllThreads);
+
+ gs_allThreads.Remove(this);
+ }
}
// -----------------------------------------------------------------------------
gs_tidMain = pthread_self();
+ gs_mutexAllThreads = new wxMutex();
+
gs_mutexGui = new wxMutex();
gs_mutexGui->Lock();
gs_mutexDeleteThread = new wxMutex();
- gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread );
+ gs_condAllDeleted = new wxCondition(*gs_mutexDeleteThread);
return true;
}
}
}
- // terminate any threads left
- size_t count = gs_allThreads.GetCount();
- if ( count != 0u )
+ size_t count;
+
{
- wxLogDebug(wxT("%lu threads were not terminated by the application."),
- (unsigned long)count);
- }
+ wxMutexLocker lock(*gs_mutexAllThreads);
+
+ // terminate any threads left
+ count = gs_allThreads.GetCount();
+ if ( count != 0u )
+ {
+ wxLogDebug(wxT("%lu threads were not terminated by the application."),
+ (unsigned long)count);
+ }
+ } // unlock mutex before deleting the threads as they lock it in their dtor
for ( size_t n = 0u; n < count; n++ )
{
gs_allThreads[0]->Delete();
}
+ delete gs_mutexAllThreads;
+
// destroy GUI mutex
gs_mutexGui->Unlock();
delete gs_mutexGui;
wxLogTrace(TRACE_THREADS, _T("%lu thread%s waiting to be deleted"),
(unsigned long)gs_nThreadsBeingDeleted,
- gs_nThreadsBeingDeleted == 1 ? "" : "s");
+ gs_nThreadsBeingDeleted == 1 ? _T("") : _T("s"));
}
static void DeleteThread(wxThread *This)