From 428b0578c64241fc677fed7083cc8fe65e10f32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 6 Aug 2014 09:52:38 +0300 Subject: [PATCH] w32threads: Use newer thread synchronization functions when targeting Vista MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When explicitly targeting Vista or newer (which only happens if the caller explicitly sets _WIN32_WINNT to a high enough value via the extra cflags option - otherwise configure script sets -D_WIN32_WINNT=0x0502), we already unconditionally link to the ConditionVariable functions, since 4622f11f9. Similarly use the newer -Ex versions of CreateEvent, CreateSemaphore, InitializeCriticalSection and WaitForSingleObject, that all appeared in Vista. When building Windows Store applications, the older versions of these functions aren't available, only the -Ex functions. When doing such a build, the user can set -D_WIN32_WINNT=0x0600 to forcibly use the newer functions instead. Signed-off-by: Martin Storsjö --- compat/w32pthreads.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h index be275edce7..7f4e6c9ba4 100644 --- a/compat/w32pthreads.h +++ b/compat/w32pthreads.h @@ -72,6 +72,18 @@ static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex, #define cond_broadcast WakeAllConditionVariable #define cond_signal WakeConditionVariable #define cond_wait SleepConditionVariableCS + +#define CreateEvent(a, reset, init, name) \ + CreateEventEx(a, name, \ + (reset ? CREATE_EVENT_MANUAL_RESET : 0) | \ + (init ? CREATE_EVENT_INITIAL_SET : 0), \ + EVENT_ALL_ACCESS) +// CreateSemaphoreExA seems to be desktop-only, but as long as we don't +// use named semaphores, it doesn't matter if we use the W version. +#define CreateSemaphore(a, b, c, d) \ + CreateSemaphoreExW(a, b, c, d, 0, SEMAPHORE_ALL_ACCESS) +#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0) +#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE) #endif static unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)