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
140 return WELS_THREAD_ERROR_OK;140 return WELS_THREAD_ERROR_OK;
141}141}
142 142
143WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) {143WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event, WELS_MUTEX *pMutex, int* iCondition) {
144 if (SetEvent (*event)) {144 if (SetEvent (*event)) {
145 return WELS_THREAD_ERROR_OK;145 return WELS_THREAD_ERROR_OK;
146 }146 }
147 return WELS_THREAD_ERROR_GENERAL;147 return WELS_THREAD_ERROR_GENERAL;
148}148}
149 149
150WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex) {150WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex, int& iCondition) {
151 return WaitForSingleObject (*event, INFINITE);151 return WaitForSingleObject (*event, INFINITE);
152}152}
153 153
@@ -327,25 +327,44 @@ void WelsSleep (uint32_t dwMilliSecond) { · 173 unmodified lines
327 usleep (dwMilliSecond * 1000);327 usleep (dwMilliSecond * 1000);
328}328}
329 329
330WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) {330WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event, WELS_MUTEX *pMutex, int* iCondition) {
331 WELS_THREAD_ERROR_CODE err = 0;331 WELS_THREAD_ERROR_CODE err = 0;
332 //fprintf( stderr, "before signal it, event=%x iCondition= %d..\n", event, *iCondition );
332#ifdef __APPLE__333#ifdef __APPLE__
334 WelsMutexLock (pMutex);
335 (*iCondition) --;
336 WelsMutexUnlock (pMutex);
337 if ((*iCondition) <= 0) {
333 err = pthread_cond_signal (event);338 err = pthread_cond_signal (event);
339 //fprintf( stderr, "signal it, event=%x iCondition= %d..\n",event, *iCondition );
340
341 }
334#else342#else
343 (*iCondition) --;
344 if ((*iCondition) <= 0) {
335// int32_t val = 0;345// int32_t val = 0;
336// sem_getvalue(event, &val);346// sem_getvalue(event, &val);
337// fprintf( stderr, "before signal it, val= %d..\n",val );347// fprintf( stderr, "before signal it, val= %d..\n",val );
338 if (event != NULL)348 if (event != NULL)
339 err = sem_post (*event);349 err = sem_post (*event);
340// sem_getvalue(event, &val);350// 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 }
342#endif353#endif
354 //fprintf( stderr, "after signal it, event=%x iCondition= %d..\n",event, *iCondition );
343 return err;355 return err;
344}356}
345 357
346WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex) {358WELS_THREAD_ERROR_CODE WelsEventWait (WELS_EVENT* event, WELS_MUTEX* pMutex, int& iCondition) {
347#ifdef __APPLE__359#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;
349#else368#else
350 return sem_wait (*event); // blocking until signaled369 return sem_wait (*event); // blocking until signaled
351#endif370#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