Commit a2e0eaa1 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont
Browse files

Use OP then fetch, more straight forward with most atomic APIs

parent 3519bb1d
...@@ -127,7 +127,7 @@ void *vlc_gc_init (gc_object_t *p_gc, void (*pf_destruct) (gc_object_t *)) ...@@ -127,7 +127,7 @@ void *vlc_gc_init (gc_object_t *p_gc, void (*pf_destruct) (gc_object_t *))
p_gc->refs = 1; p_gc->refs = 1;
#if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
__sync_synchronize (); __sync_synchronize ();
#elif defined (WIN32) #elif defined (WIN32) && defined (__GNUC__)
#elif defined(__APPLE__) #elif defined(__APPLE__)
OSMemoryBarrier (); OSMemoryBarrier ();
#else #else
...@@ -150,20 +150,19 @@ void *vlc_hold (gc_object_t * p_gc) ...@@ -150,20 +150,19 @@ void *vlc_hold (gc_object_t * p_gc)
assert( p_gc ); assert( p_gc );
#if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
refs = __sync_fetch_and_add (&p_gc->refs, 1); refs = __sync_add_and_fetch (&p_gc->refs, 1);
#elif defined (WIN32) #elif defined (WIN32) && defined (__GNUC__)
refs = -1 + refs = __builtin_choose_expr (sizeof (uintptr_t) == 4,
__builtin_choose_expr (sizeof (uintptr_t) == 4, InterlockedIncrement (&p_gc->refs),
InterlockedIncrement (&p_gc->refs), InterlockedIncrement64 (&p_gc->refs));
InterlockedIncrement64 (&p_gc->refs));
#elif defined(__APPLE__) #elif defined(__APPLE__)
refs = OSAtomicIncrement32Barrier((int*)&p_gc->refs) - 1; refs = OSAtomicIncrement32Barrier((int*)&p_gc->refs);
#else #else
vlc_spin_lock (&p_gc->spin); vlc_spin_lock (&p_gc->spin);
refs = p_gc->refs++; refs = p_gc->refs++;
vlc_spin_unlock (&p_gc->spin); vlc_spin_unlock (&p_gc->spin);
#endif #endif
assert (refs > 0); assert (refs != 1); /* there had to be a reference already */
return p_gc; return p_gc;
} }
...@@ -178,22 +177,21 @@ void vlc_release (gc_object_t *p_gc) ...@@ -178,22 +177,21 @@ void vlc_release (gc_object_t *p_gc)
assert( p_gc ); assert( p_gc );
#if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
refs = __sync_fetch_and_sub (&p_gc->refs, 1); refs = __sync_sub_and_fetch (&p_gc->refs, 1);
#elif defined (WIN32) #elif defined (WIN32) && defined (__GNUC__)
refs = 1 + refs = __builtin_choose_expr (sizeof (uintptr_t) == 4,
__builtin_choose_expr (sizeof (uintptr_t) == 4, InterlockedDecrement (&p_gc->refs),
InterlockedDecrement (&p_gc->refs), InterlockedDecrement64 (&p_gc->refs));
InterlockedDecrement64 (&p_gc->refs));
#elif defined(__APPLE__) #elif defined(__APPLE__)
refs = OSAtomicDecrement32Barrier((int*)&p_gc->refs) + 1; refs = OSAtomicDecrement32Barrier((int*)&p_gc->refs);
#else #else
vlc_spin_lock (&p_gc->spin); vlc_spin_lock (&p_gc->spin);
refs = p_gc->refs--; refs = p_gc->refs--;
vlc_spin_unlock (&p_gc->spin); vlc_spin_unlock (&p_gc->spin);
#endif #endif
assert (refs > 0); assert (refs != (uintptr_t)(-1)); /* reference underflow?! */
if (refs == 1) if (refs == 0)
{ {
#ifdef USE_SYNC #ifdef USE_SYNC
#elif defined(__APPLE__) #elif defined(__APPLE__)
......
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