From 5bd06c4b174082d6062e267565342c568ba6454d Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 30 Aug 2008 10:21:21 +0300 Subject: [PATCH] Remove the broken reference checker --- src/libvlc.h | 8 --- src/misc/objects.c | 156 ------------------------------------------- src/misc/variables.c | 8 --- 3 files changed, 172 deletions(-) diff --git a/src/libvlc.h b/src/libvlc.h index b743776c01..b934f0addb 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -46,11 +46,6 @@ void system_End ( libvlc_int_t * ); int vlc_threads_init( void ); void vlc_threads_end( void ); vlc_object_t *vlc_threadobj (void); -#ifdef LIBVLC_REFCHECK -void vlc_refcheck (vlc_object_t *obj); -#else -# define vlc_refcheck( obj ) (void)0 -#endif /* Hopefully, no need to export this. There is a new thread API instead. */ void vlc_thread_cancel (vlc_object_t *); @@ -190,9 +185,6 @@ struct vlc_object_internals_t vlc_spinlock_t ref_spin; unsigned i_refcount; vlc_destructor_t pf_destructor; -#ifndef LIBVLC_REFCHECK - vlc_thread_t creator_id; -#endif /* Objects tree structure */ vlc_object_t *prev, *next; diff --git a/src/misc/objects.c b/src/misc/objects.c index 951c5f9896..6244439426 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -84,16 +84,6 @@ static void ListChildren ( vlc_list_t *, vlc_object_t *, int ); static void vlc_object_destroy( vlc_object_t *p_this ); static void vlc_object_detach_unlocked (vlc_object_t *p_this); -#ifdef LIBVLC_REFCHECK -static vlc_threadvar_t held_objects; -typedef struct held_list_t -{ - struct held_list_t *next; - vlc_object_t *obj; -} held_list_t; -static void held_objects_destroy (void *); -#endif - /***************************************************************************** * Local structure lock *****************************************************************************/ @@ -162,10 +152,6 @@ void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size, object_counter = 0; /* reset */ p_priv->next = p_priv->prev = p_new; vlc_mutex_init( &structure_lock ); -#ifdef LIBVLC_REFCHECK - /* TODO: use the destruction callback to track ref leaks */ - vlc_threadvar_create( &held_objects, held_objects_destroy ); -#endif } else { @@ -194,13 +180,6 @@ void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size, p_priv->pipes[0] = p_priv->pipes[1] = -1; p_priv->next = VLC_OBJECT (p_libvlc_global); -#if !defined (LIBVLC_REFCHECK) - /* ... */ -#elif defined (LIBVLC_USE_PTHREAD) - p_priv->creator_id = pthread_self (); -#elif defined (WIN32) - p_priv->creator_id = GetCurrentThreadId (); -#endif vlc_mutex_lock( &structure_lock ); p_priv->prev = vlc_internals (p_libvlc_global)->prev; vlc_internals (p_libvlc_global)->prev = p_new; @@ -366,10 +345,6 @@ static void vlc_object_destroy( vlc_object_t *p_this ) /* We are the global object ... no need to lock. */ vlc_mutex_destroy( &structure_lock ); -#ifdef LIBVLC_REFCHECK - held_objects_destroy( vlc_threadvar_get( &held_objects ) ); - vlc_threadvar_delete( &held_objects ); -#endif } FREENULL( p_this->psz_object_name ); @@ -757,16 +732,6 @@ void __vlc_object_yield( vlc_object_t *p_this ) /* Increment the counter */ internals->i_refcount++; vlc_spin_unlock( &internals->ref_spin ); -#ifdef LIBVLC_REFCHECK - /* Update the list of referenced objects */ - /* Using TLS, so no need to lock */ - /* The following line may leak memory if a thread leaks objects. */ - held_list_t *newhead = malloc (sizeof (*newhead)); - held_list_t *oldhead = vlc_threadvar_get (&held_objects); - newhead->next = oldhead; - newhead->obj = p_this; - vlc_threadvar_set (&held_objects, newhead); -#endif } /***************************************************************************** @@ -778,27 +743,6 @@ void __vlc_object_release( vlc_object_t *p_this ) vlc_object_internals_t *internals = vlc_internals( p_this ); bool b_should_destroy; -#ifdef LIBVLC_REFCHECK - /* Update the list of referenced objects */ - /* Using TLS, so no need to lock */ - for (held_list_t *hlcur = vlc_threadvar_get (&held_objects), - *hlprev = NULL; - hlcur != NULL; - hlprev = hlcur, hlcur = hlcur->next) - { - if (hlcur->obj == p_this) - { - if (hlprev == NULL) - vlc_threadvar_set (&held_objects, hlcur->next); - else - hlprev->next = hlcur->next; - free (hlcur); - break; - } - } - /* TODO: what if releasing without references? */ -#endif - vlc_spin_lock( &internals->ref_spin ); assert( internals->i_refcount > 0 ); @@ -1488,103 +1432,3 @@ static void ListChildren( vlc_list_t *p_list, vlc_object_t *p_this, int i_type ) ListChildren( p_list, p_tmp, i_type ); } } - -#ifdef LIBVLC_REFCHECK -# if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) -# include -# endif - -void vlc_refcheck (vlc_object_t *obj) -{ - static unsigned errors = 0; - if (errors > 100) - return; - - /* Anyone can use the root object (though it should not exist) */ - if (obj == VLC_OBJECT (vlc_global ())) - return; - - /* Anyone can use its libvlc instance object */ - if (obj == VLC_OBJECT (obj->p_libvlc)) - return; - - /* The thread that created the object holds the initial reference */ - vlc_object_internals_t *priv = vlc_internals (obj); -#if defined (LIBVLC_USE_PTHREAD) - if (pthread_equal (priv->creator_id, pthread_self ())) -#elif defined WIN32 - if (priv->creator_id == GetCurrentThreadId ()) -#else - if (0) -#endif - return; - - /* A thread can use its own object without references! */ - vlc_object_t *caller = vlc_threadobj (); - if (caller == obj) - return; -#if 0 - /* The calling thread is younger than the object. - * Access could be valid through cross-thread synchronization; - * we would need better accounting. */ - if (caller && (caller->i_object_id > obj->i_object_id)) - return; -#endif - int refs; - vlc_spin_lock (&priv->ref_spin); - refs = priv->i_refcount; - vlc_spin_unlock (&priv->ref_spin); - - for (held_list_t *hlcur = vlc_threadvar_get (&held_objects); - hlcur != NULL; hlcur = hlcur->next) - if (hlcur->obj == obj) - return; - - int canc = vlc_savecancel (); - - fprintf (stderr, "The %s %s thread object is accessing...\n" - "the %s %s object without references.\n", - caller && caller->psz_object_name - ? caller->psz_object_name : "unnamed", - caller ? caller->psz_object_type : "main", - obj->psz_object_name ? obj->psz_object_name : "unnamed", - obj->psz_object_type); - fflush (stderr); - -#ifdef HAVE_BACKTRACE - void *stack[20]; - int stackdepth = backtrace (stack, sizeof (stack) / sizeof (stack[0])); - backtrace_symbols_fd (stack, stackdepth, 2); -#endif - - if (++errors == 100) - fprintf (stderr, "Too many reference errors!\n"); - vlc_restorecancel (canc); -} - -static void held_objects_destroy (void *data) -{ - VLC_UNUSED( data ); - held_list_t *hl = vlc_threadvar_get (&held_objects); - vlc_object_t *caller = vlc_threadobj (); - - int canc = vlc_savecancel (); - - while (hl != NULL) - { - held_list_t *buf = hl->next; - vlc_object_t *obj = hl->obj; - - fprintf (stderr, "The %s %s thread object leaked a reference to...\n" - "the %s %s object.\n", - caller && caller->psz_object_name - ? caller->psz_object_name : "unnamed", - caller ? caller->psz_object_type : "main", - obj->psz_object_name ? obj->psz_object_name : "unnamed", - obj->psz_object_type); - free (hl); - hl = buf; - } - vlc_restorecancel (canc); -} -#endif diff --git a/src/misc/variables.c b/src/misc/variables.c index 8771c440f0..89faf07eef 100644 --- a/src/misc/variables.c +++ b/src/misc/variables.c @@ -168,7 +168,6 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) static vlc_list_t dummy_null_list = {0, NULL, NULL}; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); /* FIXME: if the variable already exists, we don't duplicate it. But we @@ -332,7 +331,6 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name ) variable_t *p_var; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); i_var = GetUnused( p_this, psz_name ); @@ -409,7 +407,6 @@ int __var_Change( vlc_object_t *p_this, const char *psz_name, vlc_value_t oldval; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); i_var = Lookup( p_priv->p_vars, p_priv->i_vars, psz_name ); @@ -750,7 +747,6 @@ int __var_Set( vlc_object_t *p_this, const char *psz_name, vlc_value_t val ) vlc_value_t oldval; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); i_var = GetUnused( p_this, psz_name ); @@ -828,7 +824,6 @@ int __var_Get( vlc_object_t *p_this, const char *psz_name, vlc_value_t *p_val ) variable_t *p_var; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); i_var = Lookup( p_priv->p_vars, p_priv->i_vars, psz_name ); @@ -895,7 +890,6 @@ int __var_AddCallback( vlc_object_t *p_this, const char *psz_name, callback_entry_t entry; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); entry.pf_callback = pf_callback; entry.p_data = p_data; @@ -933,7 +927,6 @@ int __var_DelCallback( vlc_object_t *p_this, const char *psz_name, variable_t *p_var; vlc_object_internals_t *p_priv = vlc_internals( p_this ); - vlc_refcheck( p_this ); vlc_mutex_lock( &p_priv->var_lock ); i_var = GetUnused( p_this, psz_name ); @@ -1570,7 +1563,6 @@ int __var_Command( vlc_object_t *p_this, const char *psz_name, return VLC_ENOOBJ; } - vlc_refcheck( p_this ); i_type = var_Type( p_obj, psz_cmd ); if( !( i_type&VLC_VAR_ISCOMMAND ) ) { -- 2.39.2