Showing the changes to codec/common/src/WelsThreadPool.cpp (1 of 6 files). Show all
Unified · Split
| @@ -51,6 +51,7 @@ namespace WelsCommon { · 50 unmodified lines | |||
| 51 | CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink, int32_t iMaxThreadNum) : | 51 | CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink, int32_t iMaxThreadNum) : |
| 52 | m_pSink (pSink) { | 52 | m_pSink (pSink) { |
| 53 | m_cWaitedTasks = new CWelsCircleQueue<IWelsTask>(); | 53 | m_cWaitedTasks = new CWelsCircleQueue<IWelsTask>(); |
| 54 | m_cIdleThreads = new CWelsCircleQueue<CWelsTaskThread>(); | ||
| 54 | m_iMaxThreadNum = 0; | 55 | m_iMaxThreadNum = 0; |
| 55 | 56 | ||
| 56 | Init (iMaxThreadNum); | 57 | Init (iMaxThreadNum); |
| @@ -61,6 +62,7 @@ CWelsThreadPool::~CWelsThreadPool() { · 4 unmodified lines | |||
| 61 | Uninit(); | 62 | Uninit(); |
| 62 | 63 | ||
| 63 | delete m_cWaitedTasks; | 64 | delete m_cWaitedTasks; |
| 65 | delete m_cIdleThreads; | ||
| 64 | } | 66 | } |
| 65 | 67 | ||
| 66 | WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStart (CWelsTaskThread* pThread, IWelsTask* pTask) { | 68 | WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStart (CWelsTaskThread* pThread, IWelsTask* pTask) { |
| @@ -71,7 +73,7 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStart (CWelsTaskThread* pThread, I · 4 unmodified lines | |||
| 71 | 73 | ||
| 72 | WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IWelsTask* pTask) { | 74 | WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IWelsTask* pTask) { |
| 73 | RemoveThreadFromBusyMap (pThread); | 75 | RemoveThreadFromBusyMap (pThread); |
| 74 | AddThreadToIdleMap (pThread); | 76 | AddThreadToIdleQueue (pThread); |
| 75 | 77 | ||
| 76 | if (m_pSink) { | 78 | if (m_pSink) { |
| 77 | m_pSink->OnTaskExecuted (pTask); | 79 | m_pSink->OnTaskExecuted (pTask); |
| @@ -121,10 +123,9 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() { · 43 unmodified lines | |||
| 121 | } | 123 | } |
| 122 | 124 | ||
| 123 | m_cLockIdleTasks.Lock(); | 125 | m_cLockIdleTasks.Lock(); |
| 124 | std::map<uintptr_t, CWelsTaskThread*>::iterator iter = m_cIdleThreads.begin(); | 126 | while (m_cIdleThreads->size() > 0) { |
| 125 | while (iter != m_cIdleThreads.end()) { | 127 | DestroyThread (m_cIdleThreads->begin()); |
| 126 | DestroyThread (iter->second); | 128 | m_cIdleThreads->pop_front(); |
| 127 | ++ iter; | ||
| 128 | } | 129 | } |
| 129 | m_cLockIdleTasks.Unlock(); | 130 | m_cLockIdleTasks.Unlock(); |
| 130 | 131 | ||
| @@ -179,7 +180,7 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::CreateIdleThread() { · 48 unmodified lines | |||
| 179 | } | 180 | } |
| 180 | 181 | ||
| 181 | pThread->Start(); | 182 | pThread->Start(); |
| 182 | AddThreadToIdleMap (pThread); | 183 | AddThreadToIdleQueue (pThread); |
| 183 | 184 | ||
| 184 | return WELS_THREAD_ERROR_OK; | 185 | return WELS_THREAD_ERROR_OK; |
| 185 | } | 186 | } |
| @@ -191,19 +192,9 @@ void CWelsThreadPool::DestroyThread (CWelsTaskThread* pThread) { · 5 unmodified lines | |||
| 191 | return; | 192 | return; |
| 192 | } | 193 | } |
| 193 | 194 | ||
| 194 | WELS_THREAD_ERROR_CODE CWelsThreadPool::AddThreadToIdleMap (CWelsTaskThread* pThread) { | 195 | WELS_THREAD_ERROR_CODE CWelsThreadPool::AddThreadToIdleQueue (CWelsTaskThread* pThread) { |
| 195 | CWelsAutoLock cLock (m_cLockIdleTasks); | 196 | CWelsAutoLock cLock (m_cLockIdleTasks); |
| 196 | 197 | m_cIdleThreads->push_back (pThread); | |
| 197 | uintptr_t id = pThread->GetID(); | ||
| 198 | |||
| 199 | std::map<uintptr_t, CWelsTaskThread*>::iterator iter = m_cIdleThreads.find (id); | ||
| 200 | |||
| 201 | if (iter != m_cIdleThreads.end()) { | ||
| 202 | return WELS_THREAD_ERROR_GENERAL; | ||
| 203 | } | ||
| 204 | |||
| 205 | m_cIdleThreads[id] = pThread; | ||
| 206 | |||
| 207 | return WELS_THREAD_ERROR_OK; | 198 | return WELS_THREAD_ERROR_OK; |
| 208 | } | 199 | } |
| 209 | 200 | ||
| @@ -249,15 +240,12 @@ void CWelsThreadPool::AddTaskToWaitedList (IWelsTask* pTask) { · 39 unmodified lines | |||
| 249 | CWelsTaskThread* CWelsThreadPool::GetIdleThread() { | 240 | CWelsTaskThread* CWelsThreadPool::GetIdleThread() { |
| 250 | CWelsAutoLock cLock (m_cLockIdleTasks); | 241 | CWelsAutoLock cLock (m_cLockIdleTasks); |
| 251 | 242 | ||
| 252 | if (m_cIdleThreads.size() == 0) { | 243 | if (m_cIdleThreads->size() == 0) { |
| 253 | return NULL; | 244 | return NULL; |
| 254 | } | 245 | } |
| 255 | 246 | ||
| 256 | std::map<uintptr_t, CWelsTaskThread*>::iterator it = m_cIdleThreads.begin(); | 247 | CWelsTaskThread* pThread = m_cIdleThreads->begin(); |
| 257 | CWelsTaskThread* pThread = it->second; | 248 | m_cIdleThreads->pop_front(); |
| 258 | |||
| 259 | m_cIdleThreads.erase (it); | ||
| 260 | |||
| 261 | return pThread; | 249 | return pThread; |
| 262 | } | 250 | } |
| 263 | 251 | ||
| @@ -266,7 +254,7 @@ int32_t CWelsThreadPool::GetBusyThreadNum() { · 2 unmodified lines | |||
| 266 | } | 254 | } |
| 267 | 255 | ||
| 268 | int32_t CWelsThreadPool::GetIdleThreadNum() { | 256 | int32_t CWelsThreadPool::GetIdleThreadNum() { |
| 269 | return static_cast<int32_t> (m_cIdleThreads.size()); | 257 | return static_cast<int32_t> (m_cIdleThreads->size()); |
| 270 | } | 258 | } |
| 271 | 259 | ||
| 272 | int32_t CWelsThreadPool::GetWaitedTaskNum() { | 260 | int32_t CWelsThreadPool::GetWaitedTaskNum() { |
| @@ -275,6 +263,7 @@ int32_t CWelsThreadPool::GetWaitedTaskNum() { · 2 unmodified lines | |||
| 275 | 263 | ||
| 276 | IWelsTask* CWelsThreadPool::GetWaitedTask() { | 264 | IWelsTask* CWelsThreadPool::GetWaitedTask() { |
| 277 | CWelsAutoLock lock (m_cLockWaitedTasks); | 265 | CWelsAutoLock lock (m_cLockWaitedTasks); |
| 266 | |||
| 278 | if (m_cWaitedTasks->size() == 0) { | 267 | if (m_cWaitedTasks->size() == 0) { |
| 279 | return NULL; | 268 | return NULL; |
| 280 | } | 269 | } |
| @@ -288,6 +277,7 @@ IWelsTask* CWelsThreadPool::GetWaitedTask() { · 7 unmodified lines | |||
| 288 | 277 | ||
| 289 | void CWelsThreadPool::ClearWaitedTasks() { | 278 | void CWelsThreadPool::ClearWaitedTasks() { |
| 290 | CWelsAutoLock cLock (m_cLockWaitedTasks); | 279 | CWelsAutoLock cLock (m_cLockWaitedTasks); |
| 280 | |||
| 291 | if (m_pSink) { | 281 | if (m_pSink) { |
| 292 | while (0 != m_cWaitedTasks->size()) { | 282 | while (0 != m_cWaitedTasks->size()) { |
| 293 | m_pSink->OnTaskCancelled (m_cWaitedTasks->begin()); | 283 | m_pSink->OnTaskCancelled (m_cWaitedTasks->begin()); |