History

put CWelsThreadPool to singleTon for future usage (including add sink for IWelsTask)

sijchen committed 10 years ago

Commit d4f09d91 parent 52d25f510 files · +273 −85Browse files

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

Unified · Split

codec/common/src/WelsThreadPool.cpp+112−44
@@ -43,70 +43,119 @@ · 42 unmodified lines
4343
4444 namespace WelsCommon {
4545
46+int32_t CWelsThreadPool::m_iRefCount = 0;
47+CWelsLock CWelsThreadPool::m_cInitLock;
48+int32_t CWelsThreadPool::m_iMaxThreadNum = DEFAULT_THREAD_NUM;
4649
47−CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink, int32_t iMaxThreadNum) :
48− m_pSink (pSink) {
49− m_cWaitedTasks = new CWelsCircleQueue<IWelsTask>();
50− m_cIdleThreads = new CWelsCircleQueue<CWelsTaskThread>();
51− m_cBusyThreads = new CWelsList<CWelsTaskThread>();
52− m_iMaxThreadNum = 0;
50+CWelsThreadPool::CWelsThreadPool (IWelsThreadPoolSink* pSink) :
51+ m_cWaitedTasks (NULL), m_cIdleThreads (NULL), m_cBusyThreads (NULL), m_pSink (pSink) {
52+}
5353
54− if (NULL == m_cWaitedTasks || NULL == m_cIdleThreads || NULL == m_cBusyThreads) {
55− WELS_DELETE_OP(m_cWaitedTasks);
56− WELS_DELETE_OP(m_cIdleThreads);
57− WELS_DELETE_OP(m_cBusyThreads);
5854
59− return;
55+CWelsThreadPool::~CWelsThreadPool() {
56+ //fprintf(stdout, "CWelsThreadPool::~CWelsThreadPool: delete %x, %x, %x\n", m_cWaitedTasks, m_cIdleThreads, m_cBusyThreads);
57+ if (0 != m_iRefCount) {
58+ m_iRefCount = 0;
59+ Uninit();
60+ }
61+}
62+
63+WELS_THREAD_ERROR_CODE CWelsThreadPool::SetThreadNum (int32_t iMaxThreadNum) {
64+ CWelsAutoLock cLock (m_cInitLock);
65+
66+ if (m_iRefCount != 0) {
67+ return WELS_THREAD_ERROR_GENERAL;
6068 }
6169
62− if (WELS_THREAD_ERROR_OK != Init (iMaxThreadNum)) {
63− Uninit();
70+ if (iMaxThreadNum <= 0) {
71+ iMaxThreadNum = 1;
72+ }
73+ m_iMaxThreadNum = iMaxThreadNum;
74+ return WELS_THREAD_ERROR_OK;
75+}
6476
65− WELS_DELETE_OP(m_cWaitedTasks);
66− WELS_DELETE_OP(m_cIdleThreads);
67− WELS_DELETE_OP(m_cBusyThreads);
77+CWelsThreadPool& CWelsThreadPool::AddReference (IWelsThreadPoolSink* pSink) {
78+ CWelsAutoLock cLock (m_cInitLock);
79+ static CWelsThreadPool m_cThreadPoolSelf (pSink);
80+ if (m_iRefCount == 0) {
81+ //TODO: will remove this afterwards
82+ if (WELS_THREAD_ERROR_OK != m_cThreadPoolSelf.Init(pSink)) {
83+ m_cThreadPoolSelf.Uninit();
84+ }
85+ m_cThreadPoolSelf.UpdateSink (pSink);
6886 }
87+
88+ //fprintf(stdout, "m_iRefCount=%d, pSink=%x, iMaxThreadNum=%d\n", m_iRefCount, pSink, iMaxThreadNum);
89+
90+ ++ m_iRefCount;
91+ //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);
92+ return m_cThreadPoolSelf;
6993 }
7094
95+void CWelsThreadPool::RemoveInstance() {
96+ CWelsAutoLock cLock (m_cInitLock);
97+ //fprintf(stdout, "m_iRefCount=%d\n", m_iRefCount);
98+ -- m_iRefCount;
99+ if (0 == m_iRefCount) {
100+ StopAllRunning();
101+ m_pSink = NULL;
102+ Uninit();
103+ //fprintf(stdout, "m_iRefCount=%d, IdleThreadNum=%d, BusyThreadNum=%d, WaitedTask=%d\n", m_iRefCount, GetIdleThreadNum(), GetBusyThreadNum(), GetWaitedTaskNum());
104+ }
105+}
71106
72−CWelsThreadPool::~CWelsThreadPool() {
73− Uninit();
107+bool CWelsThreadPool::IsReferenced() {
108+ CWelsAutoLock cLock (m_cInitLock);
109+ return (m_iRefCount>0);
110+}
74111
75− WELS_DELETE_OP(m_cWaitedTasks);
76− WELS_DELETE_OP(m_cIdleThreads);
77− WELS_DELETE_OP(m_cBusyThreads);
112+void CWelsThreadPool::UpdateSink (IWelsThreadPoolSink* pSink) {
113+ m_pSink = pSink;
114+ //fprintf(stdout, "UpdateSink: m_pSink=%x\n", m_pSink);
115+ //fprintf(stdout, "m_iRefCount=%d, IdleThreadNum=%d, BusyThreadNum=%d, WaitedTask=%d\n", m_iRefCount, GetIdleThreadNum(), GetBusyThreadNum(), GetWaitedTaskNum());
78116 }
79117
118+
80119 WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStart (CWelsTaskThread* pThread, IWelsTask* pTask) {
81120 AddThreadToBusyList (pThread);
82−
121+ //fprintf(stdout, "CWelsThreadPool::AddThreadToBusyList: Task %x at Thread %x\n", pTask, pThread);
83122 return WELS_THREAD_ERROR_OK;
84123 }
85124
86125 WELS_THREAD_ERROR_CODE CWelsThreadPool::OnTaskStop (CWelsTaskThread* pThread, IWelsTask* pTask) {
126+ //fprintf(stdout, "CWelsThreadPool::OnTaskStop 0: Task %x at Thread %x Finished\n", pTask, pThread);
127+
87128 RemoveThreadFromBusyList (pThread);
88129 AddThreadToIdleQueue (pThread);
130+ //fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, m_pSink);
89131
90− if (m_pSink) {
91− m_pSink->OnTaskExecuted (pTask);
132+ if (pTask->GetSink()) {
133+ pTask->GetSink()->OnTaskExecuted();
92134 }
93−
94− //WELS_INFO_TRACE("ThreadPool: Task "<<(uint32_t)pTask<<" Finished, Thread "<<(uint32_t)pThread<<" put to idle list");
135+ //if (m_pSink) {
136+ // m_pSink->OnTaskExecuted (pTask);
137+ //}
138+ //fprintf(stdout, "CWelsThreadPool::OnTaskStop 2: Task %x at Thread %x Finished\n", pTask, pThread);
95139
96140 SignalThread();
141+
142+ //fprintf(stdout, "ThreadPool: Task %x at Thread %x Finished\n", pTask, pThread);
97143 return WELS_THREAD_ERROR_OK;
98144 }
99145
100−WELS_THREAD_ERROR_CODE CWelsThreadPool::Init (int32_t iMaxThreadNum) {
101− CWelsAutoLock cLock (m_cLockPool);
102− //WELS_INFO_TRACE("Enter WelsThreadPool Init");
146+WELS_THREAD_ERROR_CODE CWelsThreadPool::Init (IWelsThreadPoolSink* pSink) {
147+ //fprintf(stdout, "Enter WelsThreadPool Init\n");
103148
104− int32_t i;
149+ CWelsAutoLock cLock (m_cLockPool);
105150
106− if (iMaxThreadNum <= 0) iMaxThreadNum = 1;
107− m_iMaxThreadNum = iMaxThreadNum;
151+ m_cWaitedTasks = new CWelsCircleQueue<IWelsTask>();
152+ m_cIdleThreads = new CWelsCircleQueue<CWelsTaskThread>();
153+ m_cBusyThreads = new CWelsList<CWelsTaskThread>();
154+ if (NULL == m_cWaitedTasks || NULL == m_cIdleThreads || NULL == m_cBusyThreads) {
155+ return WELS_THREAD_ERROR_GENERAL;
156+ }
108157
109− for (i = 0; i < m_iMaxThreadNum; i++) {
158+ for (int32_t i = 0; i < m_iMaxThreadNum; i++) {
110159 if (WELS_THREAD_ERROR_OK != CreateIdleThread()) {
111160 return WELS_THREAD_ERROR_GENERAL;
112161 }
@@ -119,9 +168,8 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::Init (int32_t iMaxThreadNum) { · 6 unmodified lines
119168 return WELS_THREAD_ERROR_OK;
120169 }
121170
122−WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() {
171+WELS_THREAD_ERROR_CODE CWelsThreadPool::StopAllRunning() {
123172 WELS_THREAD_ERROR_CODE iReturn = WELS_THREAD_ERROR_OK;
124− CWelsAutoLock cLock (m_cLockPool);
125173
126174 ClearWaitedTasks();
127175
@@ -134,6 +182,18 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() { · 6 unmodified lines
134182 iReturn = WELS_THREAD_ERROR_GENERAL;
135183 }
136184
185+ return iReturn;
186+}
187+
188+WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() {
189+ WELS_THREAD_ERROR_CODE iReturn = WELS_THREAD_ERROR_OK;
190+ CWelsAutoLock cLock (m_cLockPool);
191+
192+ iReturn = StopAllRunning();
193+ if (WELS_THREAD_ERROR_OK != iReturn) {
194+ return iReturn;
195+ }
196+
137197 m_cLockIdleTasks.Lock();
138198 while (m_cIdleThreads->size() > 0) {
139199 DestroyThread (m_cIdleThreads->begin());
@@ -141,14 +201,17 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::Uninit() { · 1 unmodified line
141201 }
142202 m_cLockIdleTasks.Unlock();
143203
144− m_iMaxThreadNum = 0;
145204 Kill();
146205
206+ WELS_DELETE_OP(m_cWaitedTasks);
207+ WELS_DELETE_OP(m_cIdleThreads);
208+ WELS_DELETE_OP(m_cBusyThreads);
209+
147210 return iReturn;
148211 }
149212
150213 void CWelsThreadPool::ExecuteTask() {
151− //fprintf(stdout, "ThreadPool: schedule tasks\n");
214+ //fprintf(stdout, "ThreadPool: scheduled tasks: ExecuteTask\n");
152215 CWelsTaskThread* pThread = NULL;
153216 IWelsTask* pTask = NULL;
154217 while (GetWaitedTaskNum() > 0) {
@@ -165,20 +228,21 @@ void CWelsThreadPool::ExecuteTask() { · 10 unmodified lines
165228 WELS_THREAD_ERROR_CODE CWelsThreadPool::QueueTask (IWelsTask* pTask) {
166229 CWelsAutoLock cLock (m_cLockPool);
167230
168− //fprintf(stdout, "ThreadPool: QueueTask = %x\n", pTask);
231+ //fprintf(stdout, "CWelsThreadPool::QueueTask: %d, pTask=%x\n", m_iRefCount, pTask);
169232 if (GetWaitedTaskNum() == 0) {
170233 CWelsTaskThread* pThread = GetIdleThread();
171234
172235 if (pThread != NULL) {
173− //fprintf(stdout, "ThreadPool: ExecuteTask = %x\n", pTask);
236+ //fprintf(stdout, "ThreadPool: ExecuteTask = %x at thread %x\n", pTask, pThread);
174237 pThread->SetTask (pTask);
175238
176239 return WELS_THREAD_ERROR_OK;
177240 }
178241 }
179−
180− AddTaskToWaitedList (pTask);
181242 //fprintf(stdout, "ThreadPool: AddTaskToWaitedList: %x\n", pTask);
243+ AddTaskToWaitedList (pTask);
244+
245+ //fprintf(stdout, "ThreadPool: SignalThread: %x\n", pTask);
182246 SignalThread();
183247 return WELS_THREAD_ERROR_OK;
184248 }
@@ -193,6 +257,7 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::CreateIdleThread() { · 8 unmodified lines
193257 if (WELS_THREAD_ERROR_OK != pThread->Start()) {
194258 return WELS_THREAD_ERROR_GENERAL;
195259 }
260+ //fprintf(stdout, "ThreadPool: AddThreadToIdleQueue: %x\n", pThread);
196261 AddThreadToIdleQueue (pThread);
197262
198263 return WELS_THREAD_ERROR_OK;
@@ -219,10 +284,10 @@ WELS_THREAD_ERROR_CODE CWelsThreadPool::AddThreadToBusyList (CWelsTaskThread* pT · 20 unmodified lines
219284
220285 WELS_THREAD_ERROR_CODE CWelsThreadPool::RemoveThreadFromBusyList (CWelsTaskThread* pThread) {
221286 CWelsAutoLock cLock (m_cLockBusyTasks);
222− if (m_cBusyThreads->erase(pThread)) {
223− return WELS_THREAD_ERROR_OK;
287+ if (m_cBusyThreads->erase (pThread)) {
288+ return WELS_THREAD_ERROR_OK;
224289 } else {
225− return WELS_THREAD_ERROR_GENERAL;
290+ return WELS_THREAD_ERROR_GENERAL;
226291 }
227292 }
228293
@@ -230,12 +295,14 @@ void CWelsThreadPool::AddTaskToWaitedList (IWelsTask* pTask) { · 1 unmodified line
230295 CWelsAutoLock cLock (m_cLockWaitedTasks);
231296
232297 m_cWaitedTasks->push_back (pTask);
298+ //fprintf(stdout, "CWelsThreadPool::AddTaskToWaitedList=%d, pTask=%x\n", m_cWaitedTasks->size(), pTask);
233299 return;
234300 }
235301
236302 CWelsTaskThread* CWelsThreadPool::GetIdleThread() {
237303 CWelsAutoLock cLock (m_cLockIdleTasks);
238304
305+ //fprintf(stdout, "CWelsThreadPool::GetIdleThread=%d\n", m_cIdleThreads->size());
239306 if (m_cIdleThreads->size() == 0) {
240307 return NULL;
241308 }
@@ -254,6 +321,7 @@ int32_t CWelsThreadPool::GetIdleThreadNum() { · 12 unmodified lines
254321 }
255322
256323 int32_t CWelsThreadPool::GetWaitedTaskNum() {
324+ //fprintf(stdout, "CWelsThreadPool::m_cWaitedTasks=%d\n", m_cWaitedTasks->size());
257325 return m_cWaitedTasks->size();
258326 }
259327

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