History

fix potential deadlock prob in multi-thread

sijchen@cisco.com committed 9 years ago

Commit c51a4ff1 parent 4484df46 files · +65 −26Browse files

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

Unified · Split

codec/common/src/WelsThreadLib.cpp+25−6
@@ -140,14 +140,14 @@ WELS_THREAD_ERROR_CODE WelsEventOpen (WELS_EVENT* event, const char* event_na · 139 unmodified lines
140140 return WELS_THREAD_ERROR_OK;
141141 }
142142
143−WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) {
143+WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event, WELS_MUTEX *pMutex, int* iCondition) {
144144 if (SetEvent (*event)) {
145145 return WELS_THREAD_ERROR_OK;
146146 }
147147 return WELS_THREAD_ERROR_GENERAL;
148148 }
149149
150−WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex) {
150+WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex, int& iCondition) {
151151 return WaitForSingleObject (*event, INFINITE);
152152 }
153153
@@ -327,25 +327,44 @@ void WelsSleep (uint32_t dwMilliSecond) { · 173 unmodified lines
327327 usleep (dwMilliSecond * 1000);
328328 }
329329
330−WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) {
330+WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event, WELS_MUTEX *pMutex, int* iCondition) {
331331 WELS_THREAD_ERROR_CODE err = 0;
332+ //fprintf( stderr, "before signal it, event=%x iCondition= %d..\n", event, *iCondition );
332333 #ifdef __APPLE__
334+ WelsMutexLock (pMutex);
335+ (*iCondition) --;
336+ WelsMutexUnlock (pMutex);
337+ if ((*iCondition) <= 0) {
333338 err = pthread_cond_signal (event);
339+ //fprintf( stderr, "signal it, event=%x iCondition= %d..\n",event, *iCondition );
340+
341+ }
334342 #else
343+ (*iCondition) --;
344+ if ((*iCondition) <= 0) {
335345 // int32_t val = 0;
336346 // sem_getvalue(event, &val);
337347 // fprintf( stderr, "before signal it, val= %d..\n",val );
338348 if (event != NULL)
339349 err = sem_post (*event);
340350 // sem_getvalue(event, &val);
341−// fprintf( stderr, "after signal it, val= %d..\n",val );
351+ //fprintf( stderr, "signal it, event=%x iCondition= %d..\n",event, *iCondition );
352+ }
342353 #endif
354+ //fprintf( stderr, "after signal it, event=%x iCondition= %d..\n",event, *iCondition );
343355 return err;
344356 }
345357
346−WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex) {
358+WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex, int& iCondition) {
347359 #ifdef __APPLE__
348− return pthread_cond_wait (event, pMutex);
360+ int err = 0;
361+ WelsMutexLock(pMutex);
362+ //fprintf( stderr, "WelsEventWait event %x %d..\n", event, iCondition );
363+ while (iCondition>0) {
364+ err = pthread_cond_wait (event, pMutex);
365+ }
366+ WelsMutexUnlock(pMutex);
367+ return err;
349368 #else
350369 return sem_wait (*event); // blocking until signaled
351370 #endif

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