Showing the changes to codec/common/src/WelsThreadPool.cpp (1 of 6 files). Show all
Unified · Split
| @@ -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 | 99 | ++ m_iRefCount; |
| 100 | 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 | 135 | RemoveThreadFromBusyList (pThread); |
| 136 | 136 | AddThreadToIdleQueue (pThread); |
| 137 | 137 | |
| 138 | − if (pTask->GetSink()) { | |
| 139 | − pTask->GetSink()->OnTaskExecuted(); | |
| 138 | + if (pTask && pTask->GetSink()) { | |
| 140 | 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 | 143 | //if (m_pSink) { |
| 143 | 144 | // m_pSink->OnTaskExecuted (pTask); |
| @@ -222,13 +223,20 @@ void CWelsThreadPool::ExecuteTask() { · 78 unmodified lines | ||
| 222 | 223 | CWelsTaskThread* pThread = NULL; |
| 223 | 224 | IWelsTask* pTask = NULL; |
| 224 | 225 | while (GetWaitedTaskNum() > 0) { |
| 226 | + //fprintf(stdout, "ThreadPool: ExecuteTask: waiting task %d\n", GetWaitedTaskNum()); | |
| 225 | 227 | pThread = GetIdleThread(); |
| 226 | 228 | if (pThread == NULL) { |
| 229 | + //fprintf(stdout, "ThreadPool: ExecuteTask: no IdleThread\n"); | |
| 230 | + | |
| 227 | 231 | break; |
| 228 | 232 | } |
| 229 | 233 | pTask = GetWaitedTask(); |
| 230 | 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 | ||
| 309 | 317 | CWelsTaskThread* CWelsThreadPool::GetIdleThread() { |
| 310 | 318 | CWelsAutoLock cLock (m_cLockIdleTasks); |
| 311 | 319 | |
| 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) { | |
| 314 | 321 | return NULL; |
| 315 | 322 | } |
| 316 | 323 | |
| 324 | + //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size()); | |
| 325 | + | |
| 317 | 326 | CWelsTaskThread* pThread = m_cIdleThreads->begin(); |
| 318 | 327 | m_cIdleThreads->pop_front(); |
| 319 | 328 | return pThread; |
| 320 | 329 | } |
| 321 | 330 | |
| 322 | 331 | int32_t CWelsThreadPool::GetBusyThreadNum() { |
| 323 | − return m_cBusyThreads->size(); | |
| 332 | + return (m_cBusyThreads?m_cBusyThreads->size():0); | |
| 324 | 333 | } |
| 325 | 334 | |
| 326 | 335 | int32_t CWelsThreadPool::GetIdleThreadNum() { |
| 327 | − return m_cIdleThreads->size(); | |
| 336 | + return (m_cIdleThreads?m_cIdleThreads->size():0); | |
| 328 | 337 | } |
| 329 | 338 | |
| 330 | 339 | int32_t CWelsThreadPool::GetWaitedTaskNum() { |
| 331 | − return m_cWaitedTasks->size(); | |
| 340 | + return (m_cWaitedTasks?m_cWaitedTasks->size():0); | |
| 332 | 341 | } |
| 333 | 342 | |
| 334 | 343 | IWelsTask* CWelsThreadPool::GetWaitedTask() { |
| 335 | 344 | CWelsAutoLock lock (m_cLockWaitedTasks); |
| 336 | 345 | |
| 337 | − if (m_cWaitedTasks->size() == 0) { | |
| 346 | + if (NULL==m_cWaitedTasks || m_cWaitedTasks->size() == 0) { | |
| 338 | 347 | return NULL; |
| 339 | 348 | } |
| 340 | 349 | |
| @@ -347,6 +356,9 @@ IWelsTask* CWelsThreadPool::GetWaitedTask() { · 6 unmodified lines | ||
| 347 | 356 | |
| 348 | 357 | void CWelsThreadPool::ClearWaitedTasks() { |
| 349 | 358 | CWelsAutoLock cLock (m_cLockWaitedTasks); |
| 359 | + if (NULL == m_cWaitedTasks) { | |
| 360 | + return; | |
| 361 | + } | |
| 350 | 362 | IWelsTask* pTask = NULL; |
| 351 | 363 | while (0 != m_cWaitedTasks->size()) { |
| 352 | 364 | pTask = m_cWaitedTasks->begin(); |