Commit c6289186 by Russell Belfer Committed by Vicent Marti

Fixes for Windows cas/threading stuff

parent e976b56d
......@@ -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,
......
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