summaryrefslogtreecommitdiff
path: root/vpx_util/vpx_thread.h
diff options
context:
space:
mode:
authorJames Zern <jzern@google.com>2016-07-01 14:29:04 -0700
committerJames Zern <jzern@google.com>2016-07-01 19:36:58 -0700
commit8cc525e82b639932870e4666c524420ff2c8536a (patch)
treee021375ad2ed27668ce00eb21346bb01790e4f67 /vpx_util/vpx_thread.h
parentd4d6c58e37ebfe52b8e56d41979dda093c7cbef6 (diff)
downloadlibvpx-8cc525e82b639932870e4666c524420ff2c8536a.tar
libvpx-8cc525e82b639932870e4666c524420ff2c8536a.tar.gz
libvpx-8cc525e82b639932870e4666c524420ff2c8536a.tar.bz2
libvpx-8cc525e82b639932870e4666c524420ff2c8536a.zip
vpx_thread: use native windows cond var if available
BUG=b/29583578 original webp change: commit 110ad5835ecd66995d0e7f66dca1b90dea595f5a Author: James Zern <jzern@google.com> Date: Mon Nov 23 19:49:58 2015 -0800 thread: use native windows cond var if available Vista / Server 2008 and up. no speed difference observed. Change-Id: Ice19704777cb679b290dc107a751a0f36dd0c0a9 100644 blob 4fc372b7bc6980a9ed3618c8cce5b67ed7b0f412 src/utils/thread.c 100644 blob 840831185502d42a3246e4b7ff870121c8064791 src/utils/thread.h Change-Id: Iede7ae8a7184e4b17a4050b33956918fc84e15b5
Diffstat (limited to 'vpx_util/vpx_thread.h')
-rw-r--r--vpx_util/vpx_thread.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/vpx_util/vpx_thread.h b/vpx_util/vpx_thread.h
index 0964f4784..b63a01eba 100644
--- a/vpx_util/vpx_thread.h
+++ b/vpx_util/vpx_thread.h
@@ -33,11 +33,17 @@ extern "C" {
#include <windows.h> // NOLINT
typedef HANDLE pthread_t;
typedef CRITICAL_SECTION pthread_mutex_t;
+
+#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater
+#define USE_WINDOWS_CONDITION_VARIABLE
+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
//------------------------------------------------------------------------------
// simplistic pthread emulation layer
@@ -97,15 +103,22 @@ static INLINE int pthread_mutex_destroy(pthread_mutex_t *const mutex) {
// Condition
static INLINE int pthread_cond_destroy(pthread_cond_t *const condition) {
int ok = 1;
+#ifdef USE_WINDOWS_CONDITION_VARIABLE
+ (void)condition;
+#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,
void* cond_attr) {
(void)cond_attr;
+#ifdef USE_WINDOWS_CONDITION_VARIABLE
+ 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);
@@ -115,11 +128,15 @@ static INLINE int pthread_cond_init(pthread_cond_t *const condition,
pthread_cond_destroy(condition);
return 1;
}
+#endif
return 0;
}
static INLINE int pthread_cond_signal(pthread_cond_t *const condition) {
int ok = 1;
+#ifdef USE_WINDOWS_CONDITION_VARIABLE
+ WakeConditionVariable(condition);
+#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_);
@@ -128,12 +145,16 @@ static INLINE int pthread_cond_signal(pthread_cond_t *const condition) {
ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) !=
WAIT_OBJECT_0);
}
+#endif
return !ok;
}
static INLINE int pthread_cond_wait(pthread_cond_t *const condition,
pthread_mutex_t *const mutex) {
int ok;
+#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))
@@ -144,6 +165,7 @@ static INLINE int pthread_cond_wait(pthread_cond_t *const condition,
WAIT_OBJECT_0);
ok &= ReleaseSemaphore(condition->received_sem_, 1, NULL);
pthread_mutex_lock(mutex);
+#endif
return !ok;
}
#elif defined(__OS2__)