Hide object reference counter.
authorRémi Denis-Courmont <rem@videolan.org>
Sun, 30 Sep 2007 14:01:24 +0000 (14:01 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Sun, 30 Sep 2007 14:01:24 +0000 (14:01 +0000)
Good news is, no plugins used it anyway.
Bad news is, some parts of libvlc still use which is wrong (i_refcount is protected by the "structure lock", meaning only misc/objects.c functions can use it safely).

include/vlc_common.h
src/control/media_instance.c
src/input/vlm.c
src/libvlc.h
src/misc/objects.c
src/osd/osd.c

index 84eb662..2953193 100644 (file)
@@ -576,7 +576,6 @@ typedef struct vlc_object_internals_t vlc_object_internals_t;
     /* Stuff related to the libvlc structure */                             \
     libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
                                                                             \
-    volatile int    i_refcount;                         /**< usage count */ \
     vlc_object_t *  p_parent;                            /**< our parent */ \
     vlc_object_t ** pp_children;                       /**< our children */ \
     volatile int    i_children;                                             \
index e6ab260..332cd06 100644 (file)
@@ -52,7 +52,7 @@ static void release_input_thread( libvlc_media_instance_t *p_mi )
     /* release for previous vlc_object_get */
     vlc_object_release( p_input_thread );
 
-    should_destroy = p_input_thread->i_refcount == 1;
+    should_destroy = p_input_thread->p_internals->i_refcount == 1;
 
     /* release for initial p_input_thread yield (see _new()) */
     vlc_object_release( p_input_thread );
index d080396..52af065 100644 (file)
@@ -167,7 +167,7 @@ void vlm_Delete( vlm_t *p_vlm )
 
     vlc_object_release( p_vlm );
 
-    if( p_vlm->i_refcount > 0 )
+    if( p_vlm->p_internals->i_refcount > 0 )
     {
         vlc_mutex_unlock( lockval.p_address );
         return;
index fde5b9e..3e98a79 100644 (file)
@@ -112,6 +112,7 @@ struct vlc_object_internals_t
     vlc_bool_t      b_thread;
 
     /* Objects management */
+    unsigned        i_refcount;
     vlc_bool_t      b_attached;
 };
 
index 22d89e8..92f82f9 100644 (file)
@@ -177,7 +177,7 @@ vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
         vlc_mutex_unlock( &structure_lock );
     }
 
-    p_new->i_refcount = 0;
+    p_priv->i_refcount = 0;
     p_new->p_parent = NULL;
     p_new->pp_children = NULL;
     p_new->i_children = 0;
@@ -358,7 +358,7 @@ void __vlc_object_destroy( vlc_object_t *p_this )
         return;
     }
 
-    while( p_this->i_refcount )
+    while( p_priv->i_refcount > 0 )
     {
         i_delay++;
 
@@ -366,15 +366,15 @@ void __vlc_object_destroy( vlc_object_t *p_this )
         if( i_delay == 2 )
         {
             msg_Warn( p_this,
-                  "refcount is %i, delaying before deletion (id=%d,type=%d)",
-                  p_this->i_refcount, p_this->i_object_id,
+                  "refcount is %u, delaying before deletion (id=%d,type=%d)",
+                  p_priv->i_refcount, p_this->i_object_id,
                   p_this->i_object_type );
         }
         else if( i_delay == 10 )
         {
             msg_Err( p_this,
-                  "refcount is %i, delaying again (id=%d,type=%d)",
-                  p_this->i_refcount, p_this->i_object_id,
+                  "refcount is %u, delaying again (id=%d,type=%d)",
+                  p_priv->i_refcount, p_this->i_object_id,
                   p_this->i_object_type );
         }
         else if( i_delay == 20 )
@@ -558,7 +558,7 @@ void * __vlc_object_get( vlc_object_t *p_this, int i_id )
                 if( pp_objects[i_middle+1]->i_object_id == i_id )
                 {
                     vlc_mutex_unlock( &structure_lock );
-                    pp_objects[i_middle+1]->i_refcount++;
+                    pp_objects[i_middle+1]->p_internals->i_refcount++;
                     return pp_objects[i_middle+1];
                 }
                 break;
@@ -567,7 +567,7 @@ void * __vlc_object_get( vlc_object_t *p_this, int i_id )
         else
         {
             vlc_mutex_unlock( &structure_lock );
-            pp_objects[i_middle]->i_refcount++;
+            pp_objects[i_middle]->p_internals->i_refcount++;
             return pp_objects[i_middle];
         }
 
@@ -599,7 +599,7 @@ void * __vlc_object_find( vlc_object_t *p_this, int i_type, int i_mode )
     /* If we are of the requested type ourselves, don't look further */
     if( !(i_mode & FIND_STRICT) && p_this->i_object_type == i_type )
     {
-        p_this->i_refcount++;
+        p_this->p_internals->i_refcount++;
         vlc_mutex_unlock( &structure_lock );
         return p_this;
     }
@@ -652,7 +652,7 @@ void * __vlc_object_find_name( vlc_object_t *p_this, const char *psz_name,
         && p_this->psz_object_name
         && !strcmp( p_this->psz_object_name, psz_name ) )
     {
-        p_this->i_refcount++;
+        p_this->p_internals->i_refcount++;
         vlc_mutex_unlock( &structure_lock );
         return p_this;
     }
@@ -694,18 +694,23 @@ void * __vlc_object_find_name( vlc_object_t *p_this, const char *psz_name,
 void __vlc_object_yield( vlc_object_t *p_this )
 {
     vlc_mutex_lock( &structure_lock );
-    p_this->i_refcount++;
+    p_this->p_internals->i_refcount++;
     vlc_mutex_unlock( &structure_lock );
 }
 
-/**
- ****************************************************************************
+static inline void Release( vlc_object_t *obj )
+{
+    assert( obj->p_internals->i_refcount > 0 );
+    obj->p_internals->i_refcount--;
+}
+
+/*****************************************************************************
  * decrement an object refcount
  *****************************************************************************/
 void __vlc_object_release( vlc_object_t *p_this )
 {
     vlc_mutex_lock( &structure_lock );
-    p_this->i_refcount--;
+    Release( p_this );
     vlc_mutex_unlock( &structure_lock );
 }
 
@@ -1030,7 +1035,7 @@ void vlc_list_release( vlc_list_t *p_list )
     vlc_mutex_lock( &structure_lock );
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
-        p_list->p_values[i_index].p_object->i_refcount--;
+        Release( p_list->p_values[i_index].p_object );
     }
     vlc_mutex_unlock( &structure_lock );
 
@@ -1093,7 +1098,7 @@ static vlc_object_t * FindObject( vlc_object_t *p_this, int i_type, int i_mode )
         {
             if( p_tmp->i_object_type == i_type )
             {
-                p_tmp->i_refcount++;
+                p_tmp->p_internals->i_refcount++;
                 return p_tmp;
             }
             else
@@ -1109,7 +1114,7 @@ static vlc_object_t * FindObject( vlc_object_t *p_this, int i_type, int i_mode )
             p_tmp = p_this->pp_children[i];
             if( p_tmp->i_object_type == i_type )
             {
-                p_tmp->i_refcount++;
+                p_tmp->p_internals->i_refcount++;
                 return p_tmp;
             }
             else if( p_tmp->i_children )
@@ -1147,7 +1152,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this,
             if( p_tmp->psz_object_name
                 && !strcmp( p_tmp->psz_object_name, psz_name ) )
             {
-                p_tmp->i_refcount++;
+                p_tmp->p_internals->i_refcount++;
                 return p_tmp;
             }
             else
@@ -1164,7 +1169,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this,
             if( p_tmp->psz_object_name
                 && !strcmp( p_tmp->psz_object_name, psz_name ) )
             {
-                p_tmp->i_refcount++;
+                p_tmp->p_internals->i_refcount++;
                 return p_tmp;
             }
             else if( p_tmp->i_children )
@@ -1264,8 +1269,9 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
     }
 
     psz_refcount[0] = '\0';
-    if( p_this->i_refcount )
-        snprintf( psz_refcount, 19, ", refcount %i", p_this->i_refcount );
+    if( p_this->p_internals->i_refcount > 0 )
+        snprintf( psz_refcount, 19, ", refcount %u",
+                  p_this->p_internals->i_refcount );
 
     psz_thread[0] = '\0';
     if( p_this->p_internals->b_thread )
@@ -1364,7 +1370,7 @@ static void ListReplace( vlc_list_t *p_list, vlc_object_t *p_object,
         return;
     }
 
-    p_object->i_refcount++;
+    p_object->p_internals->i_refcount++;
 
     p_list->p_values[i_index].p_object = p_object;
 
@@ -1386,7 +1392,7 @@ static void ListReplace( vlc_list_t *p_list, vlc_object_t *p_object,
         return;
     }
 
-    p_object->i_refcount++;
+    p_object->p_internals->i_refcount++;
 
     p_list->p_values[p_list->i_count].p_object = p_object;
     p_list->i_count++;
index efebccd..5c73a69 100644 (file)
@@ -28,6 +28,7 @@
 #include <vlc/vlc.h>
 #include <vlc_keys.h>
 #include <vlc_osd.h>
+#include "libvlc.h"
 
 #undef OSD_MENU_DEBUG
 
@@ -130,7 +131,7 @@ void __osd_MenuDelete( vlc_object_t *p_this, osd_menu_t *p_osd )
     vlc_mutex_lock( lockval.p_address );
 
     vlc_object_release( p_osd );
-    if( p_osd->i_refcount > 0 )
+    if( p_osd->p_internals->i_refcount > 0 )
     {
         vlc_mutex_unlock( lockval.p_address );
         return;