From e0784be1ce6d3f6a1b34f7f3a47707e3a9887a4f Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 30 Sep 2007 14:01:24 +0000 Subject: [PATCH] Hide object reference counter. 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 | 1 - src/control/media_instance.c | 2 +- src/input/vlm.c | 2 +- src/libvlc.h | 1 + src/misc/objects.c | 52 ++++++++++++++++++++---------------- src/osd/osd.c | 3 ++- 6 files changed, 34 insertions(+), 27 deletions(-) diff --git a/include/vlc_common.h b/include/vlc_common.h index 84eb662b32..2953193036 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -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; \ diff --git a/src/control/media_instance.c b/src/control/media_instance.c index e6ab260a40..332cd06caf 100644 --- a/src/control/media_instance.c +++ b/src/control/media_instance.c @@ -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 ); diff --git a/src/input/vlm.c b/src/input/vlm.c index d0803969e7..52af065bee 100644 --- a/src/input/vlm.c +++ b/src/input/vlm.c @@ -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; diff --git a/src/libvlc.h b/src/libvlc.h index fde5b9e10c..3e98a79b48 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -112,6 +112,7 @@ struct vlc_object_internals_t vlc_bool_t b_thread; /* Objects management */ + unsigned i_refcount; vlc_bool_t b_attached; }; diff --git a/src/misc/objects.c b/src/misc/objects.c index 22d89e8d5e..92f82f991c 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -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++; diff --git a/src/osd/osd.c b/src/osd/osd.c index efebccd1f2..5c73a69d87 100644 --- a/src/osd/osd.c +++ b/src/osd/osd.c @@ -28,6 +28,7 @@ #include #include #include +#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; -- 2.39.2