[vlc-devel] commit: Use OP then fetch, more straight forward with most atomic APIs ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Sep 21 20:46:16 CEST 2008


vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Sep 21 21:48:19 2008 +0300| [a2e0eaa1708f05680d0c6bc1ba25873e6d2b6b3f] | committer: Rémi Denis-Courmont 

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

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a2e0eaa1708f05680d0c6bc1ba25873e6d2b6b3f
---

 src/libvlc.c |   34 ++++++++++++++++------------------
 1 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/src/libvlc.c b/src/libvlc.c
index 191ef86..99ccf71 100644
--- a/src/libvlc.c
+++ b/src/libvlc.c
@@ -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__)




More information about the vlc-devel mailing list