summaryrefslogtreecommitdiff
path: root/compat/os2threads.h
diff options
context:
space:
mode:
authorMatt Oliver <protogonoi@gmail.com>2016-12-07 16:55:35 +1100
committerMarton Balint <cus@passwd.hu>2020-01-21 22:34:15 +0100
commitfc6fde22c34ac9ae39f16494238140ba40456efd (patch)
tree3cdec30db06d618a115dddbd7cce2d8d72b097cb /compat/os2threads.h
parent00447b6f523e5b86bec6c3944ad917edea4ed50c (diff)
avutil/thread: Add pthread_cond_timedwait function
v2: fix calculating milisecond times and use SleepConditionVariableSRW. Signed-off-by: Matt Oliver <protogonoi@gmail.com>
Diffstat (limited to 'compat/os2threads.h')
-rw-r--r--compat/os2threads.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/compat/os2threads.h b/compat/os2threads.h
index 2177a033ec..eec6f40ae7 100644
--- a/compat/os2threads.h
+++ b/compat/os2threads.h
@@ -31,11 +31,14 @@
#undef __STRICT_ANSI__ /* for _beginthread() */
#include <stdlib.h>
+#include <time.h>
#include <sys/builtin.h>
#include <sys/fmutex.h>
#include "libavutil/attributes.h"
+#include "libavutil/common.h"
+#include "libavutil/time.h"
typedef struct {
TID tid;
@@ -163,6 +166,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)
{