29 #ifndef FFMPEG_COMPAT_W32PTHREADS_H
30 #define FFMPEG_COMPAT_W32PTHREADS_H
38 #define WIN32_LEAN_AND_MEAN
49 void *(*func)(
void*
arg);
60 #if HAVE_CONDITION_VARIABLE_PTR
68 #if _WIN32_WINNT >= 0x0600
69 #define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
70 #define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
81 void *(*start_routine)(
void*),
void *
arg)
83 thread->
func = start_routine;
92 DWORD ret = WaitForSingleObject(thread.
handle, INFINITE);
93 if (ret != WAIT_OBJECT_0)
96 *value_ptr = thread.
ret;
97 CloseHandle(thread.
handle);
102 InitializeCriticalSection(m);
107 DeleteCriticalSection(m);
112 EnterCriticalSection(m);
117 LeaveCriticalSection(m);
121 #if _WIN32_WINNT >= 0x0600
124 InitializeConditionVariable(cond);
136 WakeAllConditionVariable(cond);
141 SleepConditionVariableCS(cond, mutex, INFINITE);
147 WakeConditionVariable(cond);
150 #else // _WIN32_WINNT < 0x0600
181 cond->
Ptr = win32_cond;
215 if (cond_broadcast) {
216 cond_broadcast(cond);
233 WaitForSingleObject(win32_cond->
waiters_done, INFINITE);
246 cond_wait(cond, mutex, INFINITE);
259 WaitForSingleObject(win32_cond->
semaphore, INFINITE);
291 WaitForSingleObject(win32_cond->
waiters_done, INFINITE);
301 #if _WIN32_WINNT < 0x0600
302 HANDLE kernel_dll = GetModuleHandle(TEXT(
"kernel32.dll"));
static av_unused void pthread_cond_signal(pthread_cond_t *cond)
static av_unused void w32thread_init(void)
volatile int is_broadcast
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
memory handling functions
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
volatile int waiter_count
Macro definitions for various function/variable attributes.
static pthread_mutex_t DWORD milliseconds
CRITICAL_SECTION pthread_mutex_t
static av_unused int pthread_create(pthread_t *thread, const void *unused_attr, void *(*start_routine)(void *), void *arg)
static int pthread_mutex_init(pthread_mutex_t *m, void *attr)
void *(* func)(void *arg)
static int pthread_mutex_unlock(pthread_mutex_t *m)
static av_unused void pthread_join(pthread_t thread, void **value_ptr)
common internal API header
static int pthread_mutex_destroy(pthread_mutex_t *m)
static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
static pthread_mutex_t * mutex
pthread_mutex_t mtx_broadcast
static int pthread_mutex_lock(pthread_mutex_t *m)
static void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
common internal and external API header
pthread_mutex_t mtx_waiter_count
static BOOL(WINAPI *cond_wait)(pthread_cond_t *cond
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...