26#ifndef COMPAT_OS2THREADS_H
27#define COMPAT_OS2THREADS_H
37#include <sys/builtin.h>
38#include <sys/fmutex.h>
46 void *(*start_routine)(
void *);
56#define PTHREAD_MUTEX_INITIALIZER _FMUTEX_INITIALIZER
71#define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER}
82 void *(*start_routine)(
void*),
96 DosWaitThread(&thread.
tid, DCWW_WAIT);
99 *value_ptr = thread.
result;
107 _fmutex_create(
mutex, 0);
114 _fmutex_close(
mutex);
121 _fmutex_request(
mutex, 0);
128 return _fmutex_request(
mutex, _FMR_NOWAIT) == ERROR_MUTEX_OWNED ?
134 _fmutex_release(
mutex);
142 DosCreateEventSem(
NULL, &
cond->event_sem, DCE_POSTONE, FALSE);
143 DosCreateEventSem(
NULL, &
cond->ack_sem, DCE_POSTONE, FALSE);
145 cond->wait_count = 0;
152 DosCloseEventSem(
cond->event_sem);
153 DosCloseEventSem(
cond->ack_sem);
160 if (!__atomic_cmpxchg32(&
cond->wait_count, 0, 0)) {
161 DosPostEventSem(
cond->event_sem);
162 DosWaitEventSem(
cond->ack_sem, SEM_INDEFINITE_WAIT);
170 while (!__atomic_cmpxchg32(&
cond->wait_count, 0, 0))
178 const struct timespec *abstime)
180 int64_t abs_milli = abstime->tv_sec * 1000LL + abstime->tv_nsec / 1000000;
183 __atomic_increment(&
cond->wait_count);
187 APIRET ret = DosWaitEventSem(
cond->event_sem, t);
189 __atomic_decrement(&
cond->wait_count);
191 DosPostEventSem(
cond->ack_sem);
195 return (ret == ERROR_TIMEOUT) ? ETIMEDOUT : 0;
201 __atomic_increment(&
cond->wait_count);
205 DosWaitEventSem(
cond->event_sem, SEM_INDEFINITE_WAIT);
207 __atomic_decrement(&
cond->wait_count);
209 DosPostEventSem(
cond->ack_sem);
217 void (*init_routine)(
void))
219 if (!once_control->
done)
221 _fmutex_request(&once_control->
mtx, 0);
223 if (!once_control->
done)
227 once_control->
done = 1;
230 _fmutex_release(&once_control->
mtx);
common internal and external API header
Macro definitions for various function/variable attributes.
static void thread_entry(void *arg)
static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
static av_always_inline int pthread_mutex_trylock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
static av_always_inline int pthread_once(pthread_once_t *once_control, void(*init_routine)(void))
static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
static av_always_inline int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
int(* cond)(enum AVPixelFormat pix_fmt)
volatile unsigned wait_count
void *(* start_routine)(void *)
int64_t av_gettime(void)
Get the current time in microseconds.