summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2016-06-20 20:07:33 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2016-10-01 17:40:40 +0200
commitbb582f073c7f8356f79b767dc70755a900e54dcd (patch)
tree158f5676aa3e1acd7c7d17de13f36d94f19c9f8c
parent5d03db81469b871065baecdee2965e2e9d708724 (diff)
downloadlibgit2-bb582f073c7f8356f79b767dc70755a900e54dcd.tar.gz
threads: add platform-independent thread initialization function
-rw-r--r--src/global.c2
-rw-r--r--src/unix/pthread.h1
-rw-r--r--src/win32/thread.c57
-rw-r--r--src/win32/thread.h4
4 files changed, 32 insertions, 32 deletions
diff --git a/src/global.c b/src/global.c
index 603135e07..e36912cbe 100644
--- a/src/global.c
+++ b/src/global.c
@@ -132,7 +132,7 @@ static int synchronized_threads_init(void)
_tls_index = TlsAlloc();
- win32_pthread_initialize();
+ git_threads_init();
if (git_mutex_init(&git__mwindow_mutex))
return -1;
diff --git a/src/unix/pthread.h b/src/unix/pthread.h
index 773ce22f9..0f3f17927 100644
--- a/src/unix/pthread.h
+++ b/src/unix/pthread.h
@@ -12,6 +12,7 @@ typedef struct {
pthread_t thread;
} git_thread;
+#define git_threads_init() (void)0
#define git_thread_create(git_thread_ptr, start_routine, arg) \
pthread_create(&(git_thread_ptr)->thread, NULL, start_routine, arg)
#define git_thread_join(git_thread_ptr, status) \
diff --git a/src/win32/thread.c b/src/win32/thread.c
index 8222c65fe..80d56ce5d 100644
--- a/src/win32/thread.c
+++ b/src/win32/thread.c
@@ -10,6 +10,14 @@
#define CLEAN_THREAD_EXIT 0x6F012842
+typedef void (WINAPI *win32_srwlock_fn)(GIT_SRWLOCK *);
+
+static win32_srwlock_fn win32_srwlock_initialize;
+static win32_srwlock_fn win32_srwlock_acquire_shared;
+static win32_srwlock_fn win32_srwlock_release_shared;
+static win32_srwlock_fn win32_srwlock_acquire_exclusive;
+static win32_srwlock_fn win32_srwlock_release_exclusive;
+
/* The thread procedure stub used to invoke the caller's procedure
* and capture the return value for later collection. Windows will
* only hold a DWORD, but we need to be able to store an entire
@@ -25,6 +33,26 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
return CLEAN_THREAD_EXIT;
}
+int git_threads_init(void)
+{
+ HMODULE hModule = GetModuleHandleW(L"kernel32");
+
+ if (hModule) {
+ win32_srwlock_initialize = (win32_srwlock_fn)
+ GetProcAddress(hModule, "InitializeSRWLock");
+ win32_srwlock_acquire_shared = (win32_srwlock_fn)
+ GetProcAddress(hModule, "AcquireSRWLockShared");
+ win32_srwlock_release_shared = (win32_srwlock_fn)
+ GetProcAddress(hModule, "ReleaseSRWLockShared");
+ win32_srwlock_acquire_exclusive = (win32_srwlock_fn)
+ GetProcAddress(hModule, "AcquireSRWLockExclusive");
+ win32_srwlock_release_exclusive = (win32_srwlock_fn)
+ GetProcAddress(hModule, "ReleaseSRWLockExclusive");
+ }
+
+ return 0;
+}
+
int git_thread_create(
git_thread *GIT_RESTRICT thread,
void *(*start_routine)(void*),
@@ -152,15 +180,6 @@ int git_cond_signal(git_cond *cond)
return 0;
}
-
-typedef void (WINAPI *win32_srwlock_fn)(GIT_SRWLOCK *);
-
-static win32_srwlock_fn win32_srwlock_initialize;
-static win32_srwlock_fn win32_srwlock_acquire_shared;
-static win32_srwlock_fn win32_srwlock_release_shared;
-static win32_srwlock_fn win32_srwlock_acquire_exclusive;
-static win32_srwlock_fn win32_srwlock_release_exclusive;
-
int git_rwlock_init(git_rwlock *GIT_RESTRICT lock)
{
if (win32_srwlock_initialize)
@@ -218,23 +237,3 @@ int git_rwlock_free(git_rwlock *lock)
git__memzero(lock, sizeof(*lock));
return 0;
}
-
-int win32_pthread_initialize(void)
-{
- HMODULE hModule = GetModuleHandleW(L"kernel32");
-
- if (hModule) {
- win32_srwlock_initialize = (win32_srwlock_fn)
- GetProcAddress(hModule, "InitializeSRWLock");
- win32_srwlock_acquire_shared = (win32_srwlock_fn)
- GetProcAddress(hModule, "AcquireSRWLockShared");
- win32_srwlock_release_shared = (win32_srwlock_fn)
- GetProcAddress(hModule, "ReleaseSRWLockShared");
- win32_srwlock_acquire_exclusive = (win32_srwlock_fn)
- GetProcAddress(hModule, "AcquireSRWLockExclusive");
- win32_srwlock_release_exclusive = (win32_srwlock_fn)
- GetProcAddress(hModule, "ReleaseSRWLockExclusive");
- }
-
- return 0;
-}
diff --git a/src/win32/thread.h b/src/win32/thread.h
index f5dd41ba3..0d01822a6 100644
--- a/src/win32/thread.h
+++ b/src/win32/thread.h
@@ -35,6 +35,8 @@ typedef struct {
} native;
} git_rwlock;
+int git_threads_init(void);
+
int git_thread_create(git_thread *GIT_RESTRICT,
void *(*) (void *),
void *GIT_RESTRICT);
@@ -57,6 +59,4 @@ int git_rwlock_wrlock(git_rwlock *);
int git_rwlock_wrunlock(git_rwlock *);
int git_rwlock_free(git_rwlock *);
-extern int win32_pthread_initialize(void);
-
#endif /* INCLUDE_win32_thread_h__ */