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
94 }94 }
95 }95 }
96 96
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);
98 98
99 ++ m_iRefCount;99 ++ m_iRefCount;
100 //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);100 //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);
@@ -135,9 +135,10 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IW · 34 unmodified lines
135 RemoveThreadFromBusyList (pThread);135 RemoveThreadFromBusyList (pThread);
136 AddThreadToIdleQueue (pThread);136 AddThreadToIdleQueue (pThread);
137 137
138 if (pTask->GetSink()) {138 if (pTask && pTask->GetSink()) {
139 pTask->GetSink()->OnTaskExecuted();
140 //fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, pTask->GetSink());139 //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());
141 }142 }
142 //if (m_pSink) {143 //if (m_pSink) {
143 // m_pSink->OnTaskExecuted (pTask);144 // m_pSink->OnTaskExecuted (pTask);
@@ -222,13 +223,20 @@ void CWelsThreadPool::ExecuteTask() { · 78 unmodified lines
222 CWelsTaskThread* pThread = NULL;223 CWelsTaskThread* pThread = NULL;
223 IWelsTask* pTask = NULL;224 IWelsTask* pTask = NULL;
224 while (GetWaitedTaskNum() > 0) {225 while (GetWaitedTaskNum() > 0) {
226 //fprintf(stdout, "ThreadPool: ExecuteTask: waiting task %d\n", GetWaitedTaskNum());
225 pThread = GetIdleThread();227 pThread = GetIdleThread();
226 if (pThread == NULL) {228 if (pThread == NULL) {
229 //fprintf(stdout, "ThreadPool: ExecuteTask: no IdleThread\n");
230
227 break;231 break;
228 }232 }
229 pTask = GetWaitedTask();233 pTask = GetWaitedTask();
230 //fprintf(stdout, "ThreadPool: ExecuteTask = %x at thread %x\n", pTask, pThread);234 //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 }
232 }240 }
233}241}
234 242
@@ -309,32 +317,33 @@ bool CWelsThreadPool::AddTaskToWaitedList (IWelsTask* pTask) { · 74 unmodified lines
309CWelsTaskThread* CWelsThreadPool::GetIdleThread() {317CWelsTaskThread* CWelsThreadPool::GetIdleThread() {
310 CWelsAutoLock cLock (m_cLockIdleTasks);318 CWelsAutoLock cLock (m_cLockIdleTasks);
311 319
312 //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size());320 if (NULL == m_cIdleThreads || m_cIdleThreads->size() == 0) {
313 if (m_cIdleThreads->size() == 0) {
314 return NULL;321 return NULL;
315 }322 }
316 323
324 //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size());
325
317 CWelsTaskThread* pThread = m_cIdleThreads->begin();326 CWelsTaskThread* pThread = m_cIdleThreads->begin();
318 m_cIdleThreads->pop_front();327 m_cIdleThreads->pop_front();
319 return pThread;328 return pThread;
320}329}
321 330
322int32_t CWelsThreadPool::GetBusyThreadNum() {331int32_t CWelsThreadPool::GetBusyThreadNum() {
323 return m_cBusyThreads->size();332 return (m_cBusyThreads?m_cBusyThreads->size():0);
324}333}
325 334
326int32_t CWelsThreadPool::GetIdleThreadNum() {335int32_t CWelsThreadPool::GetIdleThreadNum() {
327 return m_cIdleThreads->size();336 return (m_cIdleThreads?m_cIdleThreads->size():0);
328}337}
329 338
330int32_t CWelsThreadPool::GetWaitedTaskNum() {339int32_t CWelsThreadPool::GetWaitedTaskNum() {
331 return m_cWaitedTasks->size();340 return (m_cWaitedTasks?m_cWaitedTasks->size():0);
332}341}
333 342
334IWelsTask* CWelsThreadPool::GetWaitedTask() {343IWelsTask* CWelsThreadPool::GetWaitedTask() {
335 CWelsAutoLock lock (m_cLockWaitedTasks);344 CWelsAutoLock lock (m_cLockWaitedTasks);
336 345
337 if (m_cWaitedTasks->size() == 0) {346 if (NULL==m_cWaitedTasks || m_cWaitedTasks->size() == 0) {
338 return NULL;347 return NULL;
339 }348 }
340 349
@@ -347,6 +356,9 @@ IWelsTask* CWelsThreadPool::GetWaitedTask() { · 6 unmodified lines
347 356
348void CWelsThreadPool::ClearWaitedTasks() {357void CWelsThreadPool::ClearWaitedTasks() {
349 CWelsAutoLock cLock (m_cLockWaitedTasks);358 CWelsAutoLock cLock (m_cLockWaitedTasks);
359 if (NULL == m_cWaitedTasks) {
360 return;
361 }
350 IWelsTask* pTask = NULL;362 IWelsTask* pTask = NULL;
351 while (0 != m_cWaitedTasks->size()) {363 while (0 != m_cWaitedTasks->size()) {
352 pTask = m_cWaitedTasks->begin();364 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