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

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