Use OP then fetch, more straight forward with most atomic APIs
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 18:48:19 +0000 (21:48 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 18:49:15 +0000 (21:49 +0300)
src/libvlc.c

index 191ef86..99ccf71 100644 (file)
@@ -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__)