X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=compat%2Fos2threads.h;h=a061eaa63de88101787d6991f2308f7aaf880572;hb=d40bb518b50561db60ef71ab0e37eb7f3fb9043b;hp=2177a033ecbb029aa0a3855a360e4123fb920d20;hpb=23ce57af3ad684363881cdd66d5724f40963a65c;p=ffmpeg diff --git a/compat/os2threads.h b/compat/os2threads.h index 2177a033ecb..a061eaa63de 100644 --- a/compat/os2threads.h +++ b/compat/os2threads.h @@ -27,15 +27,19 @@ #define COMPAT_OS2THREADS_H #define INCL_DOS +#define INCL_DOSERRORS #include #undef __STRICT_ANSI__ /* for _beginthread() */ #include +#include #include #include #include "libavutil/attributes.h" +#include "libavutil/common.h" +#include "libavutil/time.h" typedef struct { TID tid; @@ -163,6 +167,28 @@ static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond) return 0; } +static av_always_inline int pthread_cond_timedwait(pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + int64_t abs_milli = abstime->tv_sec * 1000LL + abstime->tv_nsec / 1000000; + ULONG t = av_clip64(abs_milli - av_gettime() / 1000, 0, ULONG_MAX); + + __atomic_increment(&cond->wait_count); + + pthread_mutex_unlock(mutex); + + APIRET ret = DosWaitEventSem(cond->event_sem, t); + + __atomic_decrement(&cond->wait_count); + + DosPostEventSem(cond->ack_sem); + + pthread_mutex_lock(mutex); + + return (ret == ERROR_TIMEOUT) ? ETIMEDOUT : 0; +} + static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) {