mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-21 22:57:31 +09:00
libaom: restore NT5-friendly aom_thread.h
This commit is contained in:
parent
8c22c8bd35
commit
df02fe6ef7
1 changed files with 79 additions and 8 deletions
|
|
@ -23,6 +23,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Set maximum decode threads to be 8 due to the limit of frame buffers
|
||||||
|
// and not enough semaphores in the emulation layer on windows.
|
||||||
|
#define MAX_DECODE_THREADS 8
|
||||||
#define MAX_NUM_THREADS 64
|
#define MAX_NUM_THREADS 64
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
|
|
@ -34,10 +37,16 @@ extern "C" {
|
||||||
typedef HANDLE pthread_t;
|
typedef HANDLE pthread_t;
|
||||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||||
|
|
||||||
#if _WIN32_WINNT < 0x0600
|
#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater
|
||||||
#error _WIN32_WINNT must target Windows Vista / Server 2008 or newer.
|
#define USE_WINDOWS_CONDITION_VARIABLE
|
||||||
#endif
|
|
||||||
typedef CONDITION_VARIABLE pthread_cond_t;
|
typedef CONDITION_VARIABLE pthread_cond_t;
|
||||||
|
#else
|
||||||
|
typedef struct {
|
||||||
|
HANDLE waiting_sem_;
|
||||||
|
HANDLE received_sem_;
|
||||||
|
HANDLE signal_event_;
|
||||||
|
} pthread_cond_t;
|
||||||
|
#endif // _WIN32_WINNT >= 0x600
|
||||||
|
|
||||||
#ifndef WINAPI_FAMILY_PARTITION
|
#ifndef WINAPI_FAMILY_PARTITION
|
||||||
#define WINAPI_PARTITION_DESKTOP 1
|
#define WINAPI_PARTITION_DESKTOP 1
|
||||||
|
|
@ -55,6 +64,11 @@ typedef CONDITION_VARIABLE pthread_cond_t;
|
||||||
#define THREADFN unsigned int __stdcall
|
#define THREADFN unsigned int __stdcall
|
||||||
#define THREAD_RETURN(val) (unsigned int)((DWORD_PTR)val)
|
#define THREAD_RETURN(val) (unsigned int)((DWORD_PTR)val)
|
||||||
|
|
||||||
|
#if _WIN32_WINNT >= 0x0501 // Windows XP or greater
|
||||||
|
#define WaitForSingleObject(obj, timeout) \
|
||||||
|
WaitForSingleObjectEx(obj, timeout, FALSE /*bAlertable*/)
|
||||||
|
#endif
|
||||||
|
|
||||||
static INLINE int pthread_create(pthread_t *const thread, const void *attr,
|
static INLINE int pthread_create(pthread_t *const thread, const void *attr,
|
||||||
unsigned int(__stdcall *start)(void *),
|
unsigned int(__stdcall *start)(void *),
|
||||||
void *arg) {
|
void *arg) {
|
||||||
|
|
@ -77,8 +91,7 @@ static INLINE int pthread_create(pthread_t *const thread, const void *attr,
|
||||||
|
|
||||||
static INLINE int pthread_join(pthread_t thread, void **value_ptr) {
|
static INLINE int pthread_join(pthread_t thread, void **value_ptr) {
|
||||||
(void)value_ptr;
|
(void)value_ptr;
|
||||||
return (WaitForSingleObjectEx(thread, INFINITE, FALSE /*bAlertable*/) !=
|
return (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0 ||
|
||||||
WAIT_OBJECT_0 ||
|
|
||||||
CloseHandle(thread) == 0);
|
CloseHandle(thread) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,7 +99,11 @@ static INLINE int pthread_join(pthread_t thread, void **value_ptr) {
|
||||||
static INLINE int pthread_mutex_init(pthread_mutex_t *const mutex,
|
static INLINE int pthread_mutex_init(pthread_mutex_t *const mutex,
|
||||||
void *mutexattr) {
|
void *mutexattr) {
|
||||||
(void)mutexattr;
|
(void)mutexattr;
|
||||||
|
#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater
|
||||||
InitializeCriticalSectionEx(mutex, 0 /*dwSpinCount*/, 0 /*Flags*/);
|
InitializeCriticalSectionEx(mutex, 0 /*dwSpinCount*/, 0 /*Flags*/);
|
||||||
|
#else
|
||||||
|
InitializeCriticalSection(mutex);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,31 +128,85 @@ static INLINE int pthread_mutex_destroy(pthread_mutex_t *const mutex) {
|
||||||
|
|
||||||
// Condition
|
// Condition
|
||||||
static INLINE int pthread_cond_destroy(pthread_cond_t *const condition) {
|
static INLINE int pthread_cond_destroy(pthread_cond_t *const condition) {
|
||||||
|
int ok = 1;
|
||||||
|
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
||||||
(void)condition;
|
(void)condition;
|
||||||
return 0;
|
#else
|
||||||
|
ok &= (CloseHandle(condition->waiting_sem_) != 0);
|
||||||
|
ok &= (CloseHandle(condition->received_sem_) != 0);
|
||||||
|
ok &= (CloseHandle(condition->signal_event_) != 0);
|
||||||
|
#endif
|
||||||
|
return !ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE int pthread_cond_init(pthread_cond_t *const condition,
|
static INLINE int pthread_cond_init(pthread_cond_t *const condition,
|
||||||
void *cond_attr) {
|
void *cond_attr) {
|
||||||
(void)cond_attr;
|
(void)cond_attr;
|
||||||
|
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
||||||
InitializeConditionVariable(condition);
|
InitializeConditionVariable(condition);
|
||||||
|
#else
|
||||||
|
condition->waiting_sem_ = CreateSemaphore(NULL, 0, MAX_DECODE_THREADS, NULL);
|
||||||
|
condition->received_sem_ = CreateSemaphore(NULL, 0, MAX_DECODE_THREADS, NULL);
|
||||||
|
condition->signal_event_ = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if (condition->waiting_sem_ == NULL || condition->received_sem_ == NULL ||
|
||||||
|
condition->signal_event_ == NULL) {
|
||||||
|
pthread_cond_destroy(condition);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE int pthread_cond_signal(pthread_cond_t *const condition) {
|
static INLINE int pthread_cond_signal(pthread_cond_t *const condition) {
|
||||||
|
int ok = 1;
|
||||||
|
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
||||||
WakeConditionVariable(condition);
|
WakeConditionVariable(condition);
|
||||||
return 0;
|
#else
|
||||||
|
if (WaitForSingleObject(condition->waiting_sem_, 0) == WAIT_OBJECT_0) {
|
||||||
|
// a thread is waiting in pthread_cond_wait: allow it to be notified
|
||||||
|
ok = SetEvent(condition->signal_event_);
|
||||||
|
// wait until the event is consumed so the signaler cannot consume
|
||||||
|
// the event via its own pthread_cond_wait.
|
||||||
|
ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) !=
|
||||||
|
WAIT_OBJECT_0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return !ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE int pthread_cond_broadcast(pthread_cond_t *const condition) {
|
static INLINE int pthread_cond_broadcast(pthread_cond_t *const condition) {
|
||||||
|
int ok = 1;
|
||||||
|
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
||||||
WakeAllConditionVariable(condition);
|
WakeAllConditionVariable(condition);
|
||||||
return 0;
|
#else
|
||||||
|
while (WaitForSingleObject(condition->waiting_sem_, 0) == WAIT_OBJECT_0) {
|
||||||
|
// a thread is waiting in pthread_cond_wait: allow it to be notified
|
||||||
|
ok &= SetEvent(condition->signal_event_);
|
||||||
|
// wait until the event is consumed so the signaler cannot consume
|
||||||
|
// the event via its own pthread_cond_wait.
|
||||||
|
ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) !=
|
||||||
|
WAIT_OBJECT_0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return !ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE int pthread_cond_wait(pthread_cond_t *const condition,
|
static INLINE int pthread_cond_wait(pthread_cond_t *const condition,
|
||||||
pthread_mutex_t *const mutex) {
|
pthread_mutex_t *const mutex) {
|
||||||
int ok;
|
int ok;
|
||||||
|
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
||||||
ok = SleepConditionVariableCS(condition, mutex, INFINITE);
|
ok = SleepConditionVariableCS(condition, mutex, INFINITE);
|
||||||
|
#else
|
||||||
|
// note that there is a consumer available so the signal isn't dropped in
|
||||||
|
// pthread_cond_signal
|
||||||
|
if (!ReleaseSemaphore(condition->waiting_sem_, 1, NULL)) return 1;
|
||||||
|
// now unlock the mutex so pthread_cond_signal may be issued
|
||||||
|
pthread_mutex_unlock(mutex);
|
||||||
|
ok = (WaitForSingleObject(condition->signal_event_, INFINITE) ==
|
||||||
|
WAIT_OBJECT_0);
|
||||||
|
ok &= ReleaseSemaphore(condition->received_sem_, 1, NULL);
|
||||||
|
pthread_mutex_lock(mutex);
|
||||||
|
#endif
|
||||||
return !ok;
|
return !ok;
|
||||||
}
|
}
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue