267 lines
7.4 KiB
Diff
267 lines
7.4 KiB
Diff
From b551d6199014c99982e121f4948bf1db7147ca1d Mon Sep 17 00:00:00 2001
|
|
From: martell <martellmalone@gmail.com>
|
|
Date: Thu, 24 Jul 2014 01:29:13 +0100
|
|
Subject: [PATCH 13/15] Remove custom pthread layer
|
|
|
|
---
|
|
compat/mingw.c | 5 +++
|
|
compat/win32/pthread-mingw.h | 104 +++++++++++++++++++++++++++++++++++++++++++
|
|
compat/win32/pthread.h | 104 -------------------------------------------
|
|
config.mak.uname | 2 +-
|
|
4 files changed, 110 insertions(+), 105 deletions(-)
|
|
create mode 100644 compat/win32/pthread-mingw.h
|
|
delete mode 100644 compat/win32/pthread.h
|
|
|
|
diff --git a/compat/mingw.c b/compat/mingw.c
|
|
index 69ea532..d21fc56 100644
|
|
--- a/compat/mingw.c
|
|
+++ b/compat/mingw.c
|
|
@@ -1074,6 +1074,11 @@ int pipe(int filedes[2])
|
|
return 0;
|
|
}
|
|
|
|
+#ifdef __MINGW64_VERSION_MAJOR
|
|
+#undef gmtime_r
|
|
+#undef localtime_r
|
|
+#endif
|
|
+
|
|
struct tm *gmtime_r(const time_t *timep, struct tm *result)
|
|
{
|
|
/* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
|
|
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 cef8974..acd4f19 100644
|
|
--- a/config.mak.uname
|
|
+++ b/config.mak.uname
|
|
@@ -505,7 +505,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
|
|
--
|
|
2.0.1
|
|
|