Commit fc6fde22 authored by Matt Oliver's avatar Matt Oliver Committed by Marton Balint

avutil/thread: Add pthread_cond_timedwait function

v2: fix calculating milisecond times and use SleepConditionVariableSRW.
Signed-off-by: 's avatarMatt Oliver <protogonoi@gmail.com>
parent 00447b6f
...@@ -31,11 +31,14 @@ ...@@ -31,11 +31,14 @@
#undef __STRICT_ANSI__ /* for _beginthread() */ #undef __STRICT_ANSI__ /* for _beginthread() */
#include <stdlib.h> #include <stdlib.h>
#include <time.h>
#include <sys/builtin.h> #include <sys/builtin.h>
#include <sys/fmutex.h> #include <sys/fmutex.h>
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/common.h"
#include "libavutil/time.h"
typedef struct { typedef struct {
TID tid; TID tid;
...@@ -163,6 +166,28 @@ static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond) ...@@ -163,6 +166,28 @@ static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
return 0; 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, static av_always_inline int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex) pthread_mutex_t *mutex)
{ {
......
...@@ -38,11 +38,13 @@ ...@@ -38,11 +38,13 @@
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <process.h> #include <process.h>
#include <time.h>
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem.h" #include "libavutil/mem.h"
#include "libavutil/time.h"
typedef struct pthread_t { typedef struct pthread_t {
void *handle; void *handle;
...@@ -156,6 +158,22 @@ static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex ...@@ -156,6 +158,22 @@ static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex
return 0; return 0;
} }
static 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;
DWORD t = av_clip64(abs_milli - av_gettime() / 1000, 0, UINT32_MAX);
if (!SleepConditionVariableSRW(cond, mutex, t, 0)) {
DWORD err = GetLastError();
if (err == ERROR_TIMEOUT)
return ETIMEDOUT;
else
return EINVAL;
}
return 0;
}
static inline int pthread_cond_signal(pthread_cond_t *cond) static inline int pthread_cond_signal(pthread_cond_t *cond)
{ {
WakeConditionVariable(cond); WakeConditionVariable(cond);
......
...@@ -109,6 +109,12 @@ static inline int strict_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t ...@@ -109,6 +109,12 @@ static inline int strict_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t
ASSERT_PTHREAD(pthread_cond_wait, cond, mutex); ASSERT_PTHREAD(pthread_cond_wait, cond, mutex);
} }
static inline int strict_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime)
{
ASSERT_PTHREAD(pthread_cond_timedwait, cond, mutex, abstime);
}
static inline int strict_pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) static inline int strict_pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
{ {
ASSERT_PTHREAD(pthread_once, once_control, init_routine); ASSERT_PTHREAD(pthread_once, once_control, init_routine);
...@@ -124,6 +130,7 @@ static inline int strict_pthread_once(pthread_once_t *once_control, void (*init_ ...@@ -124,6 +130,7 @@ static inline int strict_pthread_once(pthread_once_t *once_control, void (*init_
#define pthread_cond_signal strict_pthread_cond_signal #define pthread_cond_signal strict_pthread_cond_signal
#define pthread_cond_broadcast strict_pthread_cond_broadcast #define pthread_cond_broadcast strict_pthread_cond_broadcast
#define pthread_cond_wait strict_pthread_cond_wait #define pthread_cond_wait strict_pthread_cond_wait
#define pthread_cond_timedwait strict_pthread_cond_timedwait
#define pthread_once strict_pthread_once #define pthread_once strict_pthread_once
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment