diff options
author | James Zern <jzern@google.com> | 2016-07-01 14:29:04 -0700 |
---|---|---|
committer | James Zern <jzern@google.com> | 2016-07-01 19:36:58 -0700 |
commit | 8cc525e82b639932870e4666c524420ff2c8536a (patch) | |
tree | e021375ad2ed27668ce00eb21346bb01790e4f67 /vpx_util/vpx_thread.h | |
parent | d4d6c58e37ebfe52b8e56d41979dda093c7cbef6 (diff) | |
download | libvpx-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.h | 22 |
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__) |