threads: split up OS-dependent thread code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
diff --git a/src/pack-objects.c b/src/pack-objects.c
index 11e13f7..29231e0 100644
--- a/src/pack-objects.c
+++ b/src/pack-objects.c
@@ -1186,7 +1186,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
git_mutex_init(&p[i].mutex);
git_cond_init(&p[i].cond);
- ret = git_thread_create(&p[i].thread, NULL,
+ ret = git_thread_create(&p[i].thread,
threaded_find_deltas, &p[i]);
if (ret) {
giterr_set(GITERR_THREAD, "unable to create thread");
diff --git a/src/thread-utils.h b/src/thread-utils.h
index 14c8a41..11c026f 100644
--- a/src/thread-utils.h
+++ b/src/thread-utils.h
@@ -41,16 +41,7 @@ typedef git_atomic git_atomic_ssize;
#ifdef GIT_THREADS
#if !defined(GIT_WIN32)
-
-typedef struct {
- pthread_t thread;
-} git_thread;
-
-#define git_thread_create(git_thread_ptr, attr, start_routine, arg) \
- pthread_create(&(git_thread_ptr)->thread, attr, start_routine, arg)
-#define git_thread_join(git_thread_ptr, status) \
- pthread_join((git_thread_ptr)->thread, status)
-
+# include "unix/pthread.h"
#endif
/* Pthreads Mutex */
@@ -178,7 +169,7 @@ GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
#else
#define git_thread unsigned int
-#define git_thread_create(thread, attr, start_routine, arg) 0
+#define git_thread_create(thread, start_routine, arg) 0
#define git_thread_join(id, status) (void)0
/* Pthreads Mutex */
diff --git a/src/unix/pthread.h b/src/unix/pthread.h
new file mode 100644
index 0000000..87384a4
--- /dev/null
+++ b/src/unix/pthread.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#ifndef INCLUDE_unix_pthread_h__
+#define INCLUDE_unix_pthread_h__
+
+typedef struct {
+ pthread_t thread;
+} git_thread;
+
+#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) \
+ pthread_join((git_thread_ptr)->thread, status)
+
+#endif /* INCLUDE_unix_pthread_h__ */
diff --git a/src/win32/pthread.c b/src/win32/pthread.c
index a1cc189..d8ed4bb 100644
--- a/src/win32/pthread.c
+++ b/src/win32/pthread.c
@@ -16,7 +16,7 @@
* void pointer. This requires the indirection. */
static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
{
- git_win32_thread *thread = lpParameter;
+ git_thread *thread = lpParameter;
thread->result = thread->proc(thread->param);
@@ -25,14 +25,11 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
return CLEAN_THREAD_EXIT;
}
-int git_win32__thread_create(
- git_win32_thread *GIT_RESTRICT thread,
- const pthread_attr_t *GIT_RESTRICT attr,
+int git_thread_create(
+ git_thread *GIT_RESTRICT thread,
void *(*start_routine)(void*),
void *GIT_RESTRICT arg)
{
- GIT_UNUSED(attr);
-
thread->result = NULL;
thread->param = arg;
thread->proc = start_routine;
@@ -42,8 +39,8 @@ int git_win32__thread_create(
return thread->thread ? 0 : -1;
}
-int git_win32__thread_join(
- git_win32_thread *thread,
+int git_thread_join(
+ git_thread *thread,
void **value_ptr)
{
DWORD exit;
diff --git a/src/win32/pthread.h b/src/win32/pthread.h
index e4826ca..fa99b01 100644
--- a/src/win32/pthread.h
+++ b/src/win32/pthread.h
@@ -21,7 +21,7 @@ typedef struct {
void *(*proc)(void *);
void *param;
void *result;
-} git_win32_thread;
+} git_thread;
typedef int pthread_mutexattr_t;
typedef int pthread_condattr_t;
@@ -42,26 +42,10 @@ typedef struct {
#define PTHREAD_MUTEX_INITIALIZER {(void*)-1}
-int git_win32__thread_create(
- git_win32_thread *GIT_RESTRICT,
- const pthread_attr_t *GIT_RESTRICT,
+int git_thread_create(git_thread *GIT_RESTRICT,
void *(*) (void *),
void *GIT_RESTRICT);
-
-int git_win32__thread_join(
- git_win32_thread *,
- void **);
-
-#ifdef GIT_THREADS
-
-typedef git_win32_thread git_thread;
-
-#define git_thread_create(git_thread_ptr, attr, start_routine, arg) \
- git_win32__thread_create(git_thread_ptr, attr, start_routine, arg)
-#define git_thread_join(git_thread_ptr, status) \
- git_win32__thread_join(git_thread_ptr, status)
-
-#endif
+int git_thread_join(git_thread *, void **);
int pthread_mutex_init(
pthread_mutex_t *GIT_RESTRICT mutex,
diff --git a/tests/object/cache.c b/tests/object/cache.c
index bdf12da..680f236 100644
--- a/tests/object/cache.c
+++ b/tests/object/cache.c
@@ -220,7 +220,7 @@ void test_object_cache__threadmania(void)
fn = (th & 1) ? cache_parsed : cache_raw;
#ifdef GIT_THREADS
- cl_git_pass(git_thread_create(&t[th], NULL, fn, data));
+ cl_git_pass(git_thread_create(&t[th], fn, data));
#else
cl_assert(fn(data) == data);
git__free(data);
@@ -267,7 +267,7 @@ void test_object_cache__fast_thread_rush(void)
data[th] = th;
#ifdef GIT_THREADS
cl_git_pass(
- git_thread_create(&t[th], NULL, cache_quick, &data[th]));
+ git_thread_create(&t[th], cache_quick, &data[th]));
#else
cl_assert(cache_quick(&data[th]) == &data[th]);
#endif
diff --git a/tests/threads/refdb.c b/tests/threads/refdb.c
index 6589e39..f869bcb 100644
--- a/tests/threads/refdb.c
+++ b/tests/threads/refdb.c
@@ -75,7 +75,7 @@ void test_threads_refdb__iterator(void)
for (t = 0; t < THREADS; ++t) {
id[t] = t;
#ifdef GIT_THREADS
- cl_git_pass(git_thread_create(&th[t], NULL, iterate_refs, &id[t]));
+ cl_git_pass(git_thread_create(&th[t], iterate_refs, &id[t]));
#else
th[t] = t;
iterate_refs(&id[t]);
@@ -196,7 +196,7 @@ void test_threads_refdb__edit_while_iterate(void)
* for now by just running on a single thread...
*/
/* #ifdef GIT_THREADS */
-/* cl_git_pass(git_thread_create(&th[t], NULL, fn, &id[t])); */
+/* cl_git_pass(git_thread_create(&th[t], fn, &id[t])); */
/* #else */
fn(&id[t]);
/* #endif */
@@ -211,7 +211,7 @@ void test_threads_refdb__edit_while_iterate(void)
for (t = 0; t < THREADS; ++t) {
id[t] = t;
- cl_git_pass(git_thread_create(&th[t], NULL, iterate_refs, &id[t]));
+ cl_git_pass(git_thread_create(&th[t], iterate_refs, &id[t]));
}
for (t = 0; t < THREADS; ++t) {
diff --git a/tests/threads/thread_helpers.c b/tests/threads/thread_helpers.c
index 760a7bd..54bf609 100644
--- a/tests/threads/thread_helpers.c
+++ b/tests/threads/thread_helpers.c
@@ -24,7 +24,7 @@ void run_in_parallel(
for (t = 0; t < threads; ++t) {
id[t] = t;
#ifdef GIT_THREADS
- cl_git_pass(git_thread_create(&th[t], NULL, func, &id[t]));
+ cl_git_pass(git_thread_create(&th[t], func, &id[t]));
#else
cl_assert(func(&id[t]) == &id[t]);
#endif