w32threads: Use newer thread synchronization functions when targeting Vista

Message ID 1407780349-29192-1-git-send-email-martin@martin.st
State Committed
Commit 428b0578c64241fc677fed7083cc8fe65e10f32e
Headers show

Commit Message

Martin Storsjö Aug. 11, 2014, 6:05 p.m.
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.
---
 compat/w32pthreads.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Derek Buitenhuis Aug. 12, 2014, 12:27 p.m. | #1
On 8/11/2014 7:05 PM, Martin Storsjö wrote:
> 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.
> ---
>  compat/w32pthreads.h | 12 ++++++++++++
>  1 file changed, 12 insertions(+)

+1

- Derek

Patch

diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index be275ed..7f4e6c9 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)