From 25b34b267ec6878c04add03e874986673fa0f19f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 24 Jul 2006 18:26:26 +0000 Subject: [PATCH] protect gs_allThreads with a mutex (modified patch 1518719) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/unix/threadpsx.cpp | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 1e538342f7..b2f70b8bc6 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -113,6 +113,9 @@ WX_DEFINE_ARRAY_PTR(wxThread *, wxArrayThread); // 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; @@ -1066,7 +1069,11 @@ bool wxThread::SetConcurrency(size_t level) 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(); @@ -1548,7 +1555,11 @@ wxThread::~wxThread() delete m_internal; // remove this thread from the global array - gs_allThreads.Remove(this); + { + wxMutexLocker lock(*gs_mutexAllThreads); + + gs_allThreads.Remove(this); + } } // ----------------------------------------------------------------------------- @@ -1612,11 +1623,13 @@ bool wxThreadModule::OnInit() 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; } @@ -1643,13 +1656,19 @@ void wxThreadModule::OnExit() } } - // 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++ ) { @@ -1658,6 +1677,8 @@ void wxThreadModule::OnExit() gs_allThreads[0]->Delete(); } + delete gs_mutexAllThreads; + // destroy GUI mutex gs_mutexGui->Unlock(); delete gs_mutexGui; -- 2.45.2