From e803d17e70f4e750b840dc921bda29d531406553 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Sun, 26 Oct 2014 21:19:12 +0000 Subject: [PATCH 13/16] Make pthread wrapper only for mingw Requires renaming pthread.h to pthread-mingw.h and only building pthread.o for mingw. This is because we have and use winpthreads on MinGW-w64 instead. --- compat/win32/pthread-mingw.h | 104 +++++++++++++++++++++++++++++++++++++++++++ compat/win32/pthread.h | 104 ------------------------------------------- config.mak.uname | 3 +- 3 files changed, 106 insertions(+), 105 deletions(-) create mode 100644 compat/win32/pthread-mingw.h delete mode 100644 compat/win32/pthread.h diff --git a/compat/win32/pthread-mingw.h b/compat/win32/pthread-mingw.h new file mode 100644 index 0000000..8ad1873 --- /dev/null +++ b/compat/win32/pthread-mingw.h @@ -0,0 +1,104 @@ +/* + * Header used to adapt pthread-based POSIX code to Windows API threads. + * + * Copyright (C) 2009 Andrzej K. Haczewski + */ + +#ifndef PTHREAD_H +#define PTHREAD_H + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include + +/* + * Defines that adapt Windows API threads to pthreads API + */ +#define pthread_mutex_t CRITICAL_SECTION + +#define pthread_mutex_init(a,b) (InitializeCriticalSection((a)), 0) +#define pthread_mutex_destroy(a) DeleteCriticalSection((a)) +#define pthread_mutex_lock EnterCriticalSection +#define pthread_mutex_unlock LeaveCriticalSection + +typedef int pthread_mutexattr_t; +#define pthread_mutexattr_init(a) (*(a) = 0) +#define pthread_mutexattr_destroy(a) do {} while (0) +#define pthread_mutexattr_settype(a, t) 0 +#define PTHREAD_MUTEX_RECURSIVE 0 + +/* + * Implement simple condition variable for Windows threads, based on ACE + * implementation. + * + * See original implementation: http://bit.ly/1vkDjo + * ACE homepage: http://www.cse.wustl.edu/~schmidt/ACE.html + * See also: http://www.cse.wustl.edu/~schmidt/win32-cv-1.html + */ +typedef struct { + LONG waiters; + int was_broadcast; + CRITICAL_SECTION waiters_lock; + HANDLE sema; + HANDLE continue_broadcast; +} pthread_cond_t; + +extern int pthread_cond_init(pthread_cond_t *cond, const void *unused); +extern int pthread_cond_destroy(pthread_cond_t *cond); +extern int pthread_cond_wait(pthread_cond_t *cond, CRITICAL_SECTION *mutex); +extern int pthread_cond_signal(pthread_cond_t *cond); +extern int pthread_cond_broadcast(pthread_cond_t *cond); + +/* + * Simple thread creation implementation using pthread API + */ +typedef struct { + HANDLE handle; + void *(*start_routine)(void*); + void *arg; + DWORD tid; +} pthread_t; + +extern int pthread_create(pthread_t *thread, const void *unused, + void *(*start_routine)(void*), void *arg); + +/* + * To avoid the need of copying a struct, we use small macro wrapper to pass + * pointer to win32_pthread_join instead. + */ +#define pthread_join(a, b) win32_pthread_join(&(a), (b)) + +extern int win32_pthread_join(pthread_t *thread, void **value_ptr); + +#define pthread_equal(t1, t2) ((t1).tid == (t2).tid) +extern pthread_t pthread_self(void); + +static inline int pthread_exit(void *ret) +{ + ExitThread((DWORD)ret); +} + +typedef DWORD pthread_key_t; +static inline int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *value)) +{ + return (*keyp = TlsAlloc()) == TLS_OUT_OF_INDEXES ? EAGAIN : 0; +} + +static inline int pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : EINVAL; +} + +static inline int pthread_setspecific(pthread_key_t key, const void *value) +{ + return TlsSetValue(key, (void *)value) ? 0 : EINVAL; +} + +static inline void *pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +#endif /* PTHREAD_H */ diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h deleted file mode 100644 index 8ad1873..0000000 --- a/compat/win32/pthread.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Header used to adapt pthread-based POSIX code to Windows API threads. - * - * Copyright (C) 2009 Andrzej K. Haczewski - */ - -#ifndef PTHREAD_H -#define PTHREAD_H - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#include - -/* - * Defines that adapt Windows API threads to pthreads API - */ -#define pthread_mutex_t CRITICAL_SECTION - -#define pthread_mutex_init(a,b) (InitializeCriticalSection((a)), 0) -#define pthread_mutex_destroy(a) DeleteCriticalSection((a)) -#define pthread_mutex_lock EnterCriticalSection -#define pthread_mutex_unlock LeaveCriticalSection - -typedef int pthread_mutexattr_t; -#define pthread_mutexattr_init(a) (*(a) = 0) -#define pthread_mutexattr_destroy(a) do {} while (0) -#define pthread_mutexattr_settype(a, t) 0 -#define PTHREAD_MUTEX_RECURSIVE 0 - -/* - * Implement simple condition variable for Windows threads, based on ACE - * implementation. - * - * See original implementation: http://bit.ly/1vkDjo - * ACE homepage: http://www.cse.wustl.edu/~schmidt/ACE.html - * See also: http://www.cse.wustl.edu/~schmidt/win32-cv-1.html - */ -typedef struct { - LONG waiters; - int was_broadcast; - CRITICAL_SECTION waiters_lock; - HANDLE sema; - HANDLE continue_broadcast; -} pthread_cond_t; - -extern int pthread_cond_init(pthread_cond_t *cond, const void *unused); -extern int pthread_cond_destroy(pthread_cond_t *cond); -extern int pthread_cond_wait(pthread_cond_t *cond, CRITICAL_SECTION *mutex); -extern int pthread_cond_signal(pthread_cond_t *cond); -extern int pthread_cond_broadcast(pthread_cond_t *cond); - -/* - * Simple thread creation implementation using pthread API - */ -typedef struct { - HANDLE handle; - void *(*start_routine)(void*); - void *arg; - DWORD tid; -} pthread_t; - -extern int pthread_create(pthread_t *thread, const void *unused, - void *(*start_routine)(void*), void *arg); - -/* - * To avoid the need of copying a struct, we use small macro wrapper to pass - * pointer to win32_pthread_join instead. - */ -#define pthread_join(a, b) win32_pthread_join(&(a), (b)) - -extern int win32_pthread_join(pthread_t *thread, void **value_ptr); - -#define pthread_equal(t1, t2) ((t1).tid == (t2).tid) -extern pthread_t pthread_self(void); - -static inline int pthread_exit(void *ret) -{ - ExitThread((DWORD)ret); -} - -typedef DWORD pthread_key_t; -static inline int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *value)) -{ - return (*keyp = TlsAlloc()) == TLS_OUT_OF_INDEXES ? EAGAIN : 0; -} - -static inline int pthread_key_delete(pthread_key_t key) -{ - return TlsFree(key) ? 0 : EINVAL; -} - -static inline int pthread_setspecific(pthread_key_t key, const void *value) -{ - return TlsSetValue(key, (void *)value) ? 0 : EINVAL; -} - -static inline void *pthread_getspecific(pthread_key_t key) -{ - return TlsGetValue(key); -} - -#endif /* PTHREAD_H */ diff --git a/config.mak.uname b/config.mak.uname index 95a092e..548e377 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -512,7 +512,7 @@ ifneq (,$(findstring MINGW,$(uname_S))) endif COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" COMPAT_OBJS += compat/mingw.o compat/winansi.o \ - compat/win32/pthread.o compat/win32/syslog.o \ + compat/win32/syslog.o \ compat/win32/dirent.o compat/win32/fscache.o SOCKET_LIB = -lws2_32 GITLIBS += git.res @@ -526,6 +526,7 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT)) prefix = INSTALL = /bin/install EXTLIBS += /mingw/lib/libz.a + COMPAT_OBJS += compat/win32/pthread.o NO_R_TO_GCC_LINKER = YesPlease INTERNAL_QSORT = YesPlease HAVE_LIBCHARSET_H = YesPlease -- 2.1.2