From eb868b1e98d7cea8796f9b92be04843a7f819e5e Mon Sep 17 00:00:00 2001 From: Russell Belfer Date: Thu, 22 Aug 2013 14:34:21 -0700 Subject: [PATCH] Drop support for THREADSAFE on Windows XP This makes libgit2 require Windows Vista or newer if it is going to be compiled with the THREADSAFE option --- CMakeLists.txt | 7 ++++++- src/thread-utils.h | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c70ec2d6..019777e78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,8 +287,13 @@ FILE(GLOB SRC_H include/git2.h include/git2/*.h include/git2/sys/*.h) # On Windows use specific platform sources IF (WIN32 AND NOT CYGWIN) - ADD_DEFINITIONS(-DWIN32 -D_WIN32_WINNT=0x0501) + ADD_DEFINITIONS(-DWIN32) FILE(GLOB SRC_OS src/win32/*.c src/win32/*.h) + IF (THREADSAFE) + ADD_DEFINITIONS(-D_WIN32_WINNT=0x0600) + ELSE() + ADD_DEFINITIONS(-D_WIN32_WINNT=0x0501) + ENDIF() ELSEIF (AMIGA) ADD_DEFINITIONS(-DNO_ADDRINFO -DNO_READDIR_R) FILE(GLOB SRC_OS src/amiga/*.c src/amiga/*.h) diff --git a/src/thread-utils.h b/src/thread-utils.h index 819e24e7b..371dc0b26 100644 --- a/src/thread-utils.h +++ b/src/thread-utils.h @@ -40,6 +40,10 @@ typedef git_atomic git_atomic_ssize; #ifdef GIT_THREADS +#if defined(GIT_WIN32) && _WIN32_WINNT < 0x0600 +# error "Unsupported Windows version for thread support" +#endif + #define git_thread pthread_t #define git_thread_create(thread, attr, start_routine, arg) \ pthread_create(thread, attr, start_routine, arg) @@ -62,7 +66,15 @@ typedef git_atomic git_atomic_ssize; #define git_cond_signal(c) pthread_cond_signal(c) #define git_cond_broadcast(c) pthread_cond_broadcast(c) -/* Pthreads rwlock */ +/* Pthread (-ish) rwlock + * + * This differs from normal pthreads rwlocks in two ways: + * 1. Separate APIs for releasing read locks and write locks (as + * opposed to the pure POSIX API which only has one unlock fn) + * 2. You should not use recursive read locks (i.e. grabbing a read + * lock in a thread that already holds a read lock) because the + * Windows implementation doesn't support it + */ #define git_rwlock pthread_rwlock_t #define git_rwlock_init(a) pthread_rwlock_init(a, NULL) #define git_rwlock_rdlock(a) pthread_rwlock_rdlock(a)