Commit aab266c9 by Patrick Steinhardt

threads: add platform-independent thread initialization function

parent 8aaa9fb6
...@@ -134,7 +134,7 @@ static int synchronized_threads_init(void) ...@@ -134,7 +134,7 @@ static int synchronized_threads_init(void)
_tls_index = TlsAlloc(); _tls_index = TlsAlloc();
win32_pthread_initialize(); git_threads_init();
if (git_mutex_init(&git__mwindow_mutex)) if (git_mutex_init(&git__mwindow_mutex))
return -1; return -1;
......
...@@ -12,6 +12,7 @@ typedef struct { ...@@ -12,6 +12,7 @@ typedef struct {
pthread_t thread; pthread_t thread;
} git_thread; } git_thread;
#define git_threads_init() (void)0
#define git_thread_create(git_thread_ptr, start_routine, arg) \ #define git_thread_create(git_thread_ptr, start_routine, arg) \
pthread_create(&(git_thread_ptr)->thread, NULL, start_routine, arg) pthread_create(&(git_thread_ptr)->thread, NULL, start_routine, arg)
#define git_thread_join(git_thread_ptr, status) \ #define git_thread_join(git_thread_ptr, status) \
......
...@@ -10,6 +10,14 @@ ...@@ -10,6 +10,14 @@
#define CLEAN_THREAD_EXIT 0x6F012842 #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 /* The thread procedure stub used to invoke the caller's procedure
* and capture the return value for later collection. Windows will * and capture the return value for later collection. Windows will
* only hold a DWORD, but we need to be able to store an entire * 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) ...@@ -25,6 +33,26 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
return CLEAN_THREAD_EXIT; 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( int git_thread_create(
git_thread *GIT_RESTRICT thread, git_thread *GIT_RESTRICT thread,
void *(*start_routine)(void*), void *(*start_routine)(void*),
...@@ -152,15 +180,6 @@ int git_cond_signal(git_cond *cond) ...@@ -152,15 +180,6 @@ int git_cond_signal(git_cond *cond)
return 0; 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) int git_rwlock_init(git_rwlock *GIT_RESTRICT lock)
{ {
if (win32_srwlock_initialize) if (win32_srwlock_initialize)
...@@ -218,23 +237,3 @@ int git_rwlock_free(git_rwlock *lock) ...@@ -218,23 +237,3 @@ int git_rwlock_free(git_rwlock *lock)
git__memzero(lock, sizeof(*lock)); git__memzero(lock, sizeof(*lock));
return 0; 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;
}
...@@ -35,6 +35,8 @@ typedef struct { ...@@ -35,6 +35,8 @@ typedef struct {
} native; } native;
} git_rwlock; } git_rwlock;
int git_threads_init(void);
int git_thread_create(git_thread *GIT_RESTRICT, int git_thread_create(git_thread *GIT_RESTRICT,
void *(*) (void *), void *(*) (void *),
void *GIT_RESTRICT); void *GIT_RESTRICT);
...@@ -57,6 +59,4 @@ int git_rwlock_wrlock(git_rwlock *); ...@@ -57,6 +59,4 @@ int git_rwlock_wrlock(git_rwlock *);
int git_rwlock_wrunlock(git_rwlock *); int git_rwlock_wrunlock(git_rwlock *);
int git_rwlock_free(git_rwlock *); int git_rwlock_free(git_rwlock *);
extern int win32_pthread_initialize(void);
#endif /* INCLUDE_win32_thread_h__ */ #endif /* INCLUDE_win32_thread_h__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment