29 #ifndef LIBAV_COMPAT_W32PTHREADS_H 30 #define LIBAV_COMPAT_W32PTHREADS_H 38 #define WIN32_LEAN_AND_MEAN 48 void *(*func)(
void*
arg);
65 #if _WIN32_WINNT < 0x0600 72 #define cond_init InitializeConditionVariable 73 #define cond_broadcast WakeAllConditionVariable 74 #define cond_signal WakeConditionVariable 75 #define cond_wait SleepConditionVariableCS 77 #define CreateEvent(a, reset, init, name) \ 78 CreateEventEx(a, name, \ 79 (reset ? CREATE_EVENT_MANUAL_RESET : 0) | \ 80 (init ? CREATE_EVENT_INITIAL_SET : 0), \ 84 #define CreateSemaphore(a, b, c, d) \ 85 CreateSemaphoreExW(a, b, c, d, 0, SEMAPHORE_ALL_ACCESS) 86 #define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0) 87 #define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE) 98 void *(*start_routine)(
void*),
void *
arg)
100 thread->
func = start_routine;
109 DWORD
ret = WaitForSingleObject(thread.
handle, INFINITE);
110 if (ret != WAIT_OBJECT_0)
113 *value_ptr = thread.
ret;
114 CloseHandle(thread.
handle);
119 InitializeCriticalSection(m);
124 DeleteCriticalSection(m);
129 EnterCriticalSection(m);
134 LeaveCriticalSection(m);
161 cond->
ptr = win32_cond;
194 if (cond_broadcast) {
195 cond_broadcast(cond);
212 WaitForSingleObject(win32_cond->
waiters_done, INFINITE);
225 cond_wait(cond, mutex, INFINITE);
238 WaitForSingleObject(win32_cond->
semaphore, INFINITE);
270 WaitForSingleObject(win32_cond->
waiters_done, INFINITE);
279 #if _WIN32_WINNT < 0x0600 280 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 void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
memory handling functions
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
volatile int waiter_count
Macro definitions for various function/variable attributes.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
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)
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)
void *(* func)(void *arg)
static pthread_mutex_t * mutex
pthread_mutex_t mtx_broadcast
#define attribute_align_arg
static int pthread_mutex_lock(pthread_mutex_t *m)
static void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
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 ...