mirror of
https://git.proxmox.com/git/libgit2
synced 2026-01-03 01:48:57 +00:00
Fixes for Windows cas/threading stuff
This commit is contained in:
parent
e976b56dda
commit
c628918625
@ -71,16 +71,15 @@ GIT_INLINE(int) git_atomic_dec(git_atomic *a)
|
||||
GIT_INLINE(void *) git___compare_and_swap(
|
||||
volatile void **ptr, void *oldval, void *newval)
|
||||
{
|
||||
bool swapped;
|
||||
void *foundval;
|
||||
#if defined(GIT_WIN32)
|
||||
swapped = ((LONGLONG)oldval == InterlockedCompareExchange64(
|
||||
(LONGLONG volatile *)ptr, (LONGLONG)newval, (LONGLONG)oldval));
|
||||
foundval = InterlockedCompareExchangePointer(ptr, newval, oldval);
|
||||
#elif defined(__GNUC__)
|
||||
swapped = (__sync_val_compare_and_swap(ptr, oldval, newval) == oldval);
|
||||
foundval = __sync_val_compare_and_swap(ptr, oldval, newval);
|
||||
#else
|
||||
# error "Unsupported architecture for atomic operations"
|
||||
#endif
|
||||
return swapped ? oldval : newval;
|
||||
return (foundval == oldval) ? oldval : newval;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@ -14,18 +14,23 @@ int pthread_create(
|
||||
void *GIT_RESTRICT arg)
|
||||
{
|
||||
GIT_UNUSED(attr);
|
||||
*thread = (pthread_t) CreateThread(
|
||||
*thread = CreateThread(
|
||||
NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);
|
||||
return *thread ? 0 : -1;
|
||||
}
|
||||
|
||||
int pthread_join(pthread_t thread, void **value_ptr)
|
||||
{
|
||||
int ret;
|
||||
ret = WaitForSingleObject(thread, INFINITE);
|
||||
if (ret && value_ptr)
|
||||
GetExitCodeThread(thread, (void*) value_ptr);
|
||||
return -(!!ret);
|
||||
DWORD ret = WaitForSingleObject(thread, INFINITE);
|
||||
|
||||
if (ret == WAIT_OBJECT_0) {
|
||||
if (value_ptr != NULL)
|
||||
GetExitCodeThread(thread, (void *)value_ptr);
|
||||
CloseHandle(thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT mutex,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user