History

put m_cIdleThreads to CWelsCircleQueue rather than std::map https://rbcommons.com/s/OpenH264/r/1313/

Sijia Chen committed 11 years ago

Commit bc566f01 parent eb00d5c6 files · +183 −43Browse files

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

Unified · Split

codec/common/src/WelsThreadPool.cpp+15−25
@@ -51,6 +51,7 @@ namespace WelsCommon { · 50 unmodified lines
51CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink, int32_t iMaxThreadNum) :51CWelsThreadPool::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
66WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStart (CWelsTaskThread* pThread, IWelsTask* pTask) {68WELS_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
72WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IWelsTask* pTask) {74WELS_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
194WELS_THREAD_ERROR_CODE CWelsThreadPool::AddThreadToIdleMap (CWelsTaskThread* pThread) {195WELS_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
249CWelsTaskThread* CWelsThreadPool::GetIdleThread() {240CWelsTaskThread* 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
268int32_t CWelsThreadPool::GetIdleThreadNum() {256int32_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
272int32_t CWelsThreadPool::GetWaitedTaskNum() {260int32_t CWelsThreadPool::GetWaitedTaskNum() {
@@ -275,6 +263,7 @@ int32_t CWelsThreadPool::GetWaitedTaskNum() { · 2 unmodified lines
275 263
276IWelsTask* CWelsThreadPool::GetWaitedTask() {264IWelsTask* 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
289void CWelsThreadPool::ClearWaitedTasks() {278void 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());

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