From 945c6731794590de8c58c638c0a1b1e40076dea2 Mon Sep 17 00:00:00 2001 From: Gavin Hurlbut Date: Tue, 11 Jan 2011 23:11:36 -0800 Subject: [PATCH] Make the worker threads clean up properly Seems our WorkerThreads never came off the m_lstThreads deque, and also never hit the destructor. Fixed this in the ThreadTerminating function, and using a "deleteLater" Also added a bit more logging to help track the issue. (cherry picked from commit 6a1b7e32f15740bd9eb7263973cd3c126e3a44bd) --- mythtv/libs/libmythupnp/threadpool.cpp | 50 +++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/mythtv/libs/libmythupnp/threadpool.cpp b/mythtv/libs/libmythupnp/threadpool.cpp index 0656c49551d..9059dc111c5 100644 --- a/mythtv/libs/libmythupnp/threadpool.cpp +++ b/mythtv/libs/libmythupnp/threadpool.cpp @@ -367,15 +367,13 @@ WorkerThread *ThreadPool::GetWorkerThread() // -------------------------------------------------------------- m_mList.lock(); + if ( m_lstAvailableThreads.size() > 0) { - if ( m_lstAvailableThreads.size() > 0) - { - pThread = m_lstAvailableThreads.front(); - m_lstAvailableThreads.pop_front(); - } - - nThreadCount = m_lstThreads.size(); + pThread = m_lstAvailableThreads.front(); + m_lstAvailableThreads.pop_front(); } + + nThreadCount = m_lstThreads.size(); m_mList.unlock(); if (pThread == NULL) @@ -411,6 +409,7 @@ WorkerThread *ThreadPool::GetWorkerThread() WorkerThread *ThreadPool::AddWorkerThread( bool bMakeAvailable, long nTimeout ) { QString sName = m_sName + "_WorkerThread"; + long nThreadCount; VERBOSE( VB_UPNP, QString( "ThreadPool:AddWorkerThread - %1" ).arg( sName )); @@ -428,23 +427,21 @@ WorkerThread *ThreadPool::AddWorkerThread( bool bMakeAvailable, long nTimeout ) // ------------------------------------------------------ m_mList.lock(); - { + m_lstThreads.push_back( pThread ); + nThreadCount = m_lstThreads.size(); - m_lstThreads.push_back( pThread ); - - if (bMakeAvailable) - { - m_lstAvailableThreads.push_back( pThread ); + VERBOSE(VB_IMPORTANT|VB_EXTRA, QString("ThreadPool:%1: thread pool size %2") .arg(m_sName) .arg(nThreadCount)); - m_threadAvail.wakeAll(); - } + if (bMakeAvailable) + { + m_lstAvailableThreads.push_back( pThread ); + m_threadAvail.wakeAll(); } m_mList.unlock(); } else { - // ------------------------------------------------------ // It's taking longer than 5 seconds to initialize this thread.... // give up on it. @@ -478,16 +475,21 @@ void ThreadPool::ThreadAvailable ( WorkerThread *pThread ) void ThreadPool::ThreadTerminating ( WorkerThread *pThread ) { + long nThreadCount; + m_mList.lock(); - { - WorkerThreadList::iterator it = - find(m_lstAvailableThreads.begin(), - m_lstAvailableThreads.end(), pThread); - m_lstAvailableThreads.erase(it); + WorkerThreadList::iterator it = find(m_lstAvailableThreads.begin(), + m_lstAvailableThreads.end(), pThread); + m_lstAvailableThreads.erase(it); + + it = find(m_lstThreads.begin(), m_lstThreads.end(), pThread); + m_lstThreads.erase(it); + + nThreadCount = m_lstThreads.size(); + VERBOSE(VB_IMPORTANT|VB_EXTRA, QString("ThreadPool:%1: thread pool size %2") .arg(m_sName) .arg(nThreadCount)); + + pThread->deleteLater(); - // Need to leave in m_lstThreads so that we can - // delete the ptr in destructor - } m_mList.unlock(); }