261 lines
7.4 KiB
Diff
261 lines
7.4 KiB
Diff
From e803d17e70f4e750b840dc921bda29d531406553 Mon Sep 17 00:00:00 2001
|
|
From: Ray Donnelly <mingw.android@gmail.com>
|
|
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 <ahaczewski@gmail.com>
|
|
+ */
|
|
+
|
|
+#ifndef PTHREAD_H
|
|
+#define PTHREAD_H
|
|
+
|
|
+#ifndef WIN32_LEAN_AND_MEAN
|
|
+#define WIN32_LEAN_AND_MEAN
|
|
+#endif
|
|
+
|
|
+#include <windows.h>
|
|
+
|
|
+/*
|
|
+ * 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 <ahaczewski@gmail.com>
|
|
- */
|
|
-
|
|
-#ifndef PTHREAD_H
|
|
-#define PTHREAD_H
|
|
-
|
|
-#ifndef WIN32_LEAN_AND_MEAN
|
|
-#define WIN32_LEAN_AND_MEAN
|
|
-#endif
|
|
-
|
|
-#include <windows.h>
|
|
-
|
|
-/*
|
|
- * 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
|
|
|