@ -32,6 +32,7 @@
# undef __STRICT_ANSI__ /* for _beginthread() */
# include <stdlib.h>
# include <sys/builtin.h>
# include <sys/fmutex.h>
# include "libavutil/mem.h"
@ -43,8 +44,9 @@ typedef HMTX pthread_mutex_t;
typedef void pthread_mutexattr_t ;
typedef struct {
HEV event_sem ;
int wait_count ;
HEV event_sem ;
HEV ack_sem ;
volatile unsigned wait_count ;
} pthread_cond_t ;
typedef void pthread_condattr_t ;
@ -124,6 +126,7 @@ static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_init ( pthread_cond_t * cond , const pthread_condattr_t * attr )
{
DosCreateEventSem ( NULL , & cond - > event_sem , DCE_POSTONE , FALSE ) ;
DosCreateEventSem ( NULL , & cond - > ack_sem , DCE_POSTONE , FALSE ) ;
cond - > wait_count = 0 ;
@ -133,16 +136,16 @@ static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthrea
static av_always_inline int pthread_cond_destroy ( pthread_cond_t * cond )
{
DosCloseEventSem ( cond - > event_sem ) ;
DosCloseEventSem ( cond - > ack_sem ) ;
return 0 ;
}
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 - - ;
DosWaitEventSem ( cond - > ack_sem , SEM_INDEFINITE_WAIT ) ;
}
return 0 ;
@ -150,23 +153,24 @@ static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
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 ) )
pthread_cond_signal ( cond ) ;
return 0 ;
}
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 ) ;
DosPostEventSem ( cond - > ack_sem ) ;
pthread_mutex_lock ( mutex ) ;
return 0 ;