1. Manipulate waiting count in pthread_cond_wait() 2. Use builtin atomic functions to manipulate waiting count --- compat/os2threads.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/compat/os2threads.h b/compat/os2threads.h index 7c0fe13..b461f83 100644 --- a/compat/os2threads.h +++ b/compat/os2threads.h @@ -32,6 +32,7 @@ #undef __STRICT_ANSI__ /* for _beginthread() */ #include <stdlib.h> +#include <sys/builtin.h> #include <sys/fmutex.h> #include "libavutil/mem.h" @@ -44,7 +45,7 @@ typedef void pthread_mutexattr_t; typedef struct { HEV event_sem; - int wait_count; + volatile unsigned wait_count; } pthread_cond_t; typedef void pthread_condattr_t; @@ -139,21 +140,17 @@ static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond) static av_always_inline int pthread_cond_signal(pthread_cond_t *cond) { - if (cond->wait_count > 0) { + if (!__atomic_cmpxchg32(&cond->wait_count, 0, 0)) DosPostEventSem(cond->event_sem); - cond->wait_count--; - } - return 0; } static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond) { - while (cond->wait_count > 0) { - DosPostEventSem(cond->event_sem); - - cond->wait_count--; + while (!__atomic_cmpxchg32(&cond->wait_count, 0, 0)) { + if (DosPostEventSem(cond->event_sem)) + DosSleep(1); } return 0; @@ -161,12 +158,14 @@ static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond) static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { - cond->wait_count++; + __atomic_increment(&cond->wait_count); pthread_mutex_unlock(mutex); DosWaitEventSem(cond->event_sem, SEM_INDEFINITE_WAIT); + __atomic_decrement(&cond->wait_count); + pthread_mutex_lock(mutex); return 0; -- 2.7.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel