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 | 51 | CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink, int32_t iMaxThreadNum) : |
| 52 | 52 | m_pSink (pSink) { |
| 53 | 53 | m_cWaitedTasks = new CWelsCircleQueue<IWelsTask>(); |
| 54 | + m_cIdleThreads = new CWelsCircleQueue<CWelsTaskThread>(); | |
| 54 | 55 | m_iMaxThreadNum = 0; |
| 55 | 56 | |
| 56 | 57 | Init (iMaxThreadNum); |
| @@ -61,6 +62,7 @@ CWelsThreadPool::~CWelsThreadPool() { · 4 unmodified lines | ||
| 61 | 62 | Uninit(); |
| 62 | 63 | |
| 63 | 64 | delete m_cWaitedTasks; |
| 65 | + delete m_cIdleThreads; | |
| 64 | 66 | } |
| 65 | 67 | |
| 66 | 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 | 74 | WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IWelsTask* pTask) { |
| 73 | 75 | RemoveThreadFromBusyMap (pThread); |
| 74 | − AddThreadToIdleMap (pThread); | |
| 76 | + AddThreadToIdleQueue (pThread); | |
| 75 | 77 | |
| 76 | 78 | if (m_pSink) { |
| 77 | 79 | m_pSink->OnTaskExecuted (pTask); |
| @@ -121,10 +123,9 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() { · 43 unmodified lines | ||
| 121 | 123 | } |
| 122 | 124 | |
| 123 | 125 | m_cLockIdleTasks.Lock(); |
| 124 | − std::map<uintptr_t, CWelsTaskThread*>::iterator iter = m_cIdleThreads.begin(); | |
| 125 | − while (iter != m_cIdleThreads.end()) { | |
| 126 | − DestroyThread (iter->second); | |
| 127 | − ++ iter; | |
| 126 | + while (m_cIdleThreads->size() > 0) { | |
| 127 | + DestroyThread (m_cIdleThreads->begin()); | |
| 128 | + m_cIdleThreads->pop_front(); | |
| 128 | 129 | } |
| 129 | 130 | m_cLockIdleTasks.Unlock(); |
| 130 | 131 | |
| @@ -179,7 +180,7 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::CreateIdleThread() { · 48 unmodified lines | ||
| 179 | 180 | } |
| 180 | 181 | |
| 181 | 182 | pThread->Start(); |
| 182 | − AddThreadToIdleMap (pThread); | |
| 183 | + AddThreadToIdleQueue (pThread); | |
| 183 | 184 | |
| 184 | 185 | return WELS_THREAD_ERROR_OK; |
| 185 | 186 | } |
| @@ -191,19 +192,9 @@ void CWelsThreadPool::DestroyThread (CWelsTaskThread* pThread) { · 5 unmodified lines | ||
| 191 | 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 | 196 | CWelsAutoLock cLock (m_cLockIdleTasks); |
| 196 | − | |
| 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 | − | |
| 197 | + m_cIdleThreads->push_back (pThread); | |
| 207 | 198 | return WELS_THREAD_ERROR_OK; |
| 208 | 199 | } |
| 209 | 200 | |
| @@ -249,15 +240,12 @@ void CWelsThreadPool::AddTaskToWaitedList (IWelsTask* pTask) { · 39 unmodified lines | ||
| 249 | 240 | CWelsTaskThread* CWelsThreadPool::GetIdleThread() { |
| 250 | 241 | CWelsAutoLock cLock (m_cLockIdleTasks); |
| 251 | 242 | |
| 252 | − if (m_cIdleThreads.size() == 0) { | |
| 243 | + if (m_cIdleThreads->size() == 0) { | |
| 253 | 244 | return NULL; |
| 254 | 245 | } |
| 255 | 246 | |
| 256 | − std::map<uintptr_t, CWelsTaskThread*>::iterator it = m_cIdleThreads.begin(); | |
| 257 | − CWelsTaskThread* pThread = it->second; | |
| 258 | − | |
| 259 | − m_cIdleThreads.erase (it); | |
| 260 | − | |
| 247 | + CWelsTaskThread* pThread = m_cIdleThreads->begin(); | |
| 248 | + m_cIdleThreads->pop_front(); | |
| 261 | 249 | return pThread; |
| 262 | 250 | } |
| 263 | 251 | |
| @@ -266,7 +254,7 @@ int32_t CWelsThreadPool::GetBusyThreadNum() { · 2 unmodified lines | ||
| 266 | 254 | } |
| 267 | 255 | |
| 268 | 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 | 260 | int32_t CWelsThreadPool::GetWaitedTaskNum() { |
| @@ -275,6 +263,7 @@ int32_t CWelsThreadPool::GetWaitedTaskNum() { · 2 unmodified lines | ||
| 275 | 263 | |
| 276 | 264 | IWelsTask* CWelsThreadPool::GetWaitedTask() { |
| 277 | 265 | CWelsAutoLock lock (m_cLockWaitedTasks); |
| 266 | + | |
| 278 | 267 | if (m_cWaitedTasks->size() == 0) { |
| 279 | 268 | return NULL; |
| 280 | 269 | } |
| @@ -288,6 +277,7 @@ IWelsTask* CWelsThreadPool::GetWaitedTask() { · 7 unmodified lines | ||
| 288 | 277 | |
| 289 | 278 | void CWelsThreadPool::ClearWaitedTasks() { |
| 290 | 279 | CWelsAutoLock cLock (m_cLockWaitedTasks); |
| 280 | + | |
| 291 | 281 | if (m_pSink) { |
| 292 | 282 | while (0 != m_cWaitedTasks->size()) { |
| 293 | 283 | m_pSink->OnTaskCancelled (m_cWaitedTasks->begin()); |