[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