mirror of https://git.ffmpeg.org/ffmpeg.git
avutil/thread: Add pthread_cond_timedwait function
v2: fix calculating milisecond times and use SleepConditionVariableSRW. Signed-off-by: Matt Oliver <protogonoi@gmail.com>
This commit is contained in:
parent
00447b6f52
commit
fc6fde22c3
|
@ -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)
|
||||||
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 @@
|
||||||
#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
|
||||||
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
|
||||||
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_
|
||||||
#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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue