Showing the changes to codec/common/src/WelsThreadLib.cpp (1 of 6 files). Show all
Unified · Split
| @@ -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 | ||
| 143 | WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) { | 143 | WELS_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 | ||
| 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) { |
| 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 | ||
| 330 | WELS_THREAD_ERROR_CODE WelsEventSignal (WELS_EVENT* event) { | 330 | WELS_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 | #else | 342 | #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 | #endif | 353 | #endif |
| 354 | //fprintf( stderr, "after signal it, event=%x iCondition= %d..\n",event, *iCondition ); | ||
| 343 | return err; | 355 | return err; |
| 344 | } | 356 | } |
| 345 | 357 | ||
| 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) { |
| 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 | #else | 368 | #else |
| 350 | return sem_wait (*event); // blocking until signaled | 369 | return sem_wait (*event); // blocking until signaled |
| 351 | #endif | 370 | #endif |