*/
void *vlc_gc_init (gc_object_t *p_gc, void (*pf_destruct) (gc_object_t *))
{
- /* There is no point in using the GC if there is destructor... */
+ /* There is no point in using the GC if there is no destructor... */
assert (pf_destruct);
p_gc->pf_destructor = pf_destruct;
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
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++;
+ 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;
}
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--;
+ 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 (WIN32) && defined (__GNUC__)
#elif defined(__APPLE__)
#else
vlc_spin_destroy (&p_gc->spin);
vlc_mutex_init( &p_libvlc->p_stats->lock );
priv->p_stats_computer = NULL;
+ priv->i_last_input_id = 0; /* Not very safe, should be removed */
+
/*
* Initialize hotkey handling
*/