History

fix potential deadlock prob in multi-thread

sijchen@cisco.com committed 9 years ago

Commit c51a4ff1 parent 4484df46 files · +65 −26Browse files

Showing the changes to codec/common/src/WelsThreadPool.cpp (1 of 6 files). Show all

Unified · Split

codec/common/src/WelsThreadPool.cpp+22−10
@@ -94,7 +94,7 @@ CWelsThreadPool* CWelsThreadPool::AddReference() { · 93 unmodified lines
9494 }
9595 }
9696
97− //fprintf(stdout, "m_iRefCount=%d, iMaxThreadNum=%d\n", m_iRefCount, m_iMaxThreadNum);
97+ ////fprintf(stdout, "m_iRefCount=%d, iMaxThreadNum=%d\n", m_iRefCount, m_iMaxThreadNum);
9898
9999 ++ m_iRefCount;
100100 //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);
@@ -135,9 +135,10 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IW · 34 unmodified lines
135135 RemoveThreadFromBusyList (pThread);
136136 AddThreadToIdleQueue (pThread);
137137
138− if (pTask->GetSink()) {
139− pTask->GetSink()->OnTaskExecuted();
138+ if (pTask && pTask->GetSink()) {
140139 //fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, pTask->GetSink());
140+ pTask->GetSink()->OnTaskExecuted();
141+ ////fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, pTask->GetSink());
141142 }
142143 //if (m_pSink) {
143144 // m_pSink->OnTaskExecuted (pTask);
@@ -222,13 +223,20 @@ void CWelsThreadPool::ExecuteTask() { · 78 unmodified lines
222223 CWelsTaskThread* pThread = NULL;
223224 IWelsTask* pTask = NULL;
224225 while (GetWaitedTaskNum() > 0) {
226+ //fprintf(stdout, "ThreadPool: ExecuteTask: waiting task %d\n", GetWaitedTaskNum());
225227 pThread = GetIdleThread();
226228 if (pThread == NULL) {
229+ //fprintf(stdout, "ThreadPool: ExecuteTask: no IdleThread\n");
230+
227231 break;
228232 }
229233 pTask = GetWaitedTask();
230234 //fprintf(stdout, "ThreadPool: ExecuteTask = %x at thread %x\n", pTask, pThread);
231− pThread->SetTask (pTask);
235+ if (pTask) {
236+ pThread->SetTask (pTask);
237+ } else {
238+ AddThreadToIdleQueue (pThread);
239+ }
232240 }
233241 }
234242
@@ -309,32 +317,33 @@ bool CWelsThreadPool::AddTaskToWaitedList (IWelsTask* pTask) { · 74 unmodified lines
309317 CWelsTaskThread* CWelsThreadPool::GetIdleThread() {
310318 CWelsAutoLock cLock (m_cLockIdleTasks);
311319
312− //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size());
313− if (m_cIdleThreads->size() == 0) {
320+ if (NULL == m_cIdleThreads || m_cIdleThreads->size() == 0) {
314321 return NULL;
315322 }
316323
324+ //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size());
325+
317326 CWelsTaskThread* pThread = m_cIdleThreads->begin();
318327 m_cIdleThreads->pop_front();
319328 return pThread;
320329 }
321330
322331 int32_t CWelsThreadPool::GetBusyThreadNum() {
323− return m_cBusyThreads->size();
332+ return (m_cBusyThreads?m_cBusyThreads->size():0);
324333 }
325334
326335 int32_t CWelsThreadPool::GetIdleThreadNum() {
327− return m_cIdleThreads->size();
336+ return (m_cIdleThreads?m_cIdleThreads->size():0);
328337 }
329338
330339 int32_t CWelsThreadPool::GetWaitedTaskNum() {
331− return m_cWaitedTasks->size();
340+ return (m_cWaitedTasks?m_cWaitedTasks->size():0);
332341 }
333342
334343 IWelsTask* CWelsThreadPool::GetWaitedTask() {
335344 CWelsAutoLock lock (m_cLockWaitedTasks);
336345
337− if (m_cWaitedTasks->size() == 0) {
346+ if (NULL==m_cWaitedTasks || m_cWaitedTasks->size() == 0) {
338347 return NULL;
339348 }
340349
@@ -347,6 +356,9 @@ IWelsTask* CWelsThreadPool::GetWaitedTask() { · 6 unmodified lines
347356
348357 void CWelsThreadPool::ClearWaitedTasks() {
349358 CWelsAutoLock cLock (m_cLockWaitedTasks);
359+ if (NULL == m_cWaitedTasks) {
360+ return;
361+ }
350362 IWelsTask* pTask = NULL;
351363 while (0 != m_cWaitedTasks->size()) {
352364 pTask = m_cWaitedTasks->begin();

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t