mirror of
https://github.com/webmproject/libwebp.git
synced 2025-08-28 14:52:28 +02:00
Remove pthread code for Windows older than Vista
Assume the CONDITION_VARIABLE added in Windows Vista is available. Remove an unneeded WaitForSingleObject() macro that converts WaitForSingleObject() calls to WaitForSingleObjectEx() calls with bAlertable=FALSE. The WaitForSingleObject() function does not enter an alertable wait state, so it is equivalent to WaitForSingleObjectEx() with bAlertable=FALSE. Remove code for Windows older than Vista in src/dsp/cpu.h. Change-Id: I7df95557713923e05a7bfb62e095ec6172cfd708
This commit is contained in:
@@ -193,7 +193,9 @@
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#if _WIN32_WINNT >= 0x0600
|
#if _WIN32_WINNT < 0x0600
|
||||||
|
#error _WIN32_WINNT must target Windows Vista / Server 2008 or newer.
|
||||||
|
#endif
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define WEBP_DSP_INIT_VARS(func) \
|
#define WEBP_DSP_INIT_VARS(func) \
|
||||||
static VP8CPUInfo func##_last_cpuinfo_used = \
|
static VP8CPUInfo func##_last_cpuinfo_used = \
|
||||||
@@ -207,20 +209,7 @@
|
|||||||
ReleaseSRWLockExclusive(&func##_lock); \
|
ReleaseSRWLockExclusive(&func##_lock); \
|
||||||
} while (0)
|
} while (0)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
#else // _WIN32_WINNT < 0x0600
|
#else // !defined(_WIN32)
|
||||||
// clang-format off
|
|
||||||
#define WEBP_DSP_INIT_VARS(func) \
|
|
||||||
static volatile VP8CPUInfo func##_last_cpuinfo_used = \
|
|
||||||
(VP8CPUInfo)&func##_last_cpuinfo_used
|
|
||||||
#define WEBP_DSP_INIT(func) \
|
|
||||||
do { \
|
|
||||||
if (func##_last_cpuinfo_used == VP8GetCPUInfo) break; \
|
|
||||||
func(); \
|
|
||||||
func##_last_cpuinfo_used = VP8GetCPUInfo; \
|
|
||||||
} while (0)
|
|
||||||
// clang-format on
|
|
||||||
#endif // _WIN32_WINNT >= 0x0600
|
|
||||||
#else // !defined(_WIN32)
|
|
||||||
// NOLINTNEXTLINE
|
// NOLINTNEXTLINE
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
@@ -29,16 +29,10 @@ WEBP_ASSUME_UNSAFE_INDEXABLE_ABI
|
|||||||
typedef HANDLE pthread_t;
|
typedef HANDLE pthread_t;
|
||||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||||
|
|
||||||
#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater
|
#if _WIN32_WINNT < 0x0600
|
||||||
#define USE_WINDOWS_CONDITION_VARIABLE
|
#error _WIN32_WINNT must target Windows Vista / Server 2008 or newer.
|
||||||
|
#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
|
||||||
@@ -72,11 +66,6 @@ typedef struct {
|
|||||||
#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, /*bAlertable=*/FALSE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int pthread_create(pthread_t* const thread, const void* attr,
|
static int pthread_create(pthread_t* const thread, const void* attr,
|
||||||
unsigned int(__stdcall* start)(void*), void* arg) {
|
unsigned int(__stdcall* start)(void*), void* arg) {
|
||||||
(void)attr;
|
(void)attr;
|
||||||
@@ -104,11 +93,7 @@ static int pthread_join(pthread_t thread, void** value_ptr) {
|
|||||||
// Mutex
|
// Mutex
|
||||||
static int pthread_mutex_init(pthread_mutex_t* const mutex, void* mutexattr) {
|
static int pthread_mutex_init(pthread_mutex_t* const mutex, void* mutexattr) {
|
||||||
(void)mutexattr;
|
(void)mutexattr;
|
||||||
#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater
|
|
||||||
InitializeCriticalSectionEx(mutex, /*dwSpinCount=*/0, /*Flags=*/0);
|
InitializeCriticalSectionEx(mutex, /*dwSpinCount=*/0, /*Flags=*/0);
|
||||||
#else
|
|
||||||
InitializeCriticalSection(mutex);
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,67 +114,24 @@ static int pthread_mutex_destroy(pthread_mutex_t* const mutex) {
|
|||||||
|
|
||||||
// Condition
|
// Condition
|
||||||
static int pthread_cond_destroy(pthread_cond_t* const condition) {
|
static int pthread_cond_destroy(pthread_cond_t* const condition) {
|
||||||
int ok = 1;
|
|
||||||
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
|
||||||
(void)condition;
|
(void)condition;
|
||||||
#else
|
return 0;
|
||||||
ok &= (CloseHandle(condition->waiting_sem) != 0);
|
|
||||||
ok &= (CloseHandle(condition->received_sem) != 0);
|
|
||||||
ok &= (CloseHandle(condition->signal_event) != 0);
|
|
||||||
#endif
|
|
||||||
return !ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pthread_cond_init(pthread_cond_t* const condition, void* cond_attr) {
|
static int pthread_cond_init(pthread_cond_t* const condition, 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, 1, NULL);
|
|
||||||
condition->received_sem = CreateSemaphore(NULL, 0, 1, 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 int pthread_cond_signal(pthread_cond_t* const condition) {
|
static int pthread_cond_signal(pthread_cond_t* const condition) {
|
||||||
int ok = 1;
|
|
||||||
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
|
||||||
WakeConditionVariable(condition);
|
WakeConditionVariable(condition);
|
||||||
#else
|
return 0;
|
||||||
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 int pthread_cond_wait(pthread_cond_t* const condition,
|
static int pthread_cond_wait(pthread_cond_t* const condition,
|
||||||
pthread_mutex_t* const mutex) {
|
pthread_mutex_t* const mutex) {
|
||||||
int ok;
|
const int ok = SleepConditionVariableCS(condition, mutex, INFINITE);
|
||||||
#ifdef USE_WINDOWS_CONDITION_VARIABLE
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user