Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
threads: add platform-independent thread initialization function
  • Loading branch information
pks-t committed Jun 20, 2016
commit aab266c93256fbf89a000778b454c5d60bae43a9
2 changes: 1 addition & 1 deletion src/global.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,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;
Expand Down
1 change: 1 addition & 0 deletions src/unix/pthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
57 changes: 28 additions & 29 deletions src/win32/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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*),
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
4 changes: 2 additions & 2 deletions src/win32/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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__ */