From: RĂ©mi Denis-Courmont Date: Wed, 4 Jun 2008 17:16:47 +0000 (+0300) Subject: vlc_threadobj under NDEBUG and refcheck under LIBVLC_REFCHECK X-Git-Tag: 0.9.0-test0~378 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=cc01f686c5f807d6b53ea5298c4687f5a41dac28;hp=c15a5164ddd9105ce4de09fc9dcd95d4263ad3df;p=vlc vlc_threadobj under NDEBUG and refcheck under LIBVLC_REFCHECK vlc_threadobj() is no use otherwise. People may want not to enable reference checking all the time also... --- diff --git a/src/libvlc.h b/src/libvlc.h index 1998ceec02..7a7665036b 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -46,7 +46,7 @@ void system_End ( libvlc_int_t * ); int vlc_threads_init( void ); void vlc_threads_end( void ); vlc_object_t *vlc_threadobj (void); -#ifndef NDEBUG +#ifdef LIBVLC_REFCHECK void vlc_refcheck (vlc_object_t *obj); #else # define vlc_refcheck( obj ) (void)0 @@ -186,7 +186,7 @@ struct vlc_object_internals_t vlc_spinlock_t ref_spin; unsigned i_refcount; vlc_destructor_t pf_destructor; -#ifndef NDEBUG +#ifndef LIBVLC_REFCHECK vlc_thread_t creator_id; #endif diff --git a/src/misc/objects.c b/src/misc/objects.c index 6791737610..52d3246999 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -81,7 +81,7 @@ 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); -#ifndef NDEBUG +#ifdef LIBVLC_REFCHECK static vlc_threadvar_t held_objects; typedef struct held_list_t { @@ -151,7 +151,7 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size, p_libvlc_global->i_counter = 0; p_priv->next = p_priv->prev = p_new; vlc_mutex_init( &structure_lock ); -#ifndef NDEBUG +#ifdef LIBVLC_REFCHECK /* TODO: use the destruction callback to track ref leaks */ vlc_threadvar_create( &held_objects, held_objects_destroy ); #endif @@ -183,7 +183,7 @@ 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 (NDEBUG) +#if !defined (LIBVLC_REFCHECK) /* ... */ #elif defined (LIBVLC_USE_PTHREAD) p_priv->creator_id = pthread_self (); @@ -384,7 +384,7 @@ static void vlc_object_destroy( vlc_object_t *p_this ) /* We are the global object ... no need to lock. */ vlc_mutex_destroy( &structure_lock ); -#ifndef NDEBUG +#ifdef LIBVLC_REFCHECK held_objects_destroy( vlc_threadvar_get( &held_objects ) ); vlc_threadvar_delete( &held_objects ); #endif @@ -663,6 +663,7 @@ void * vlc_object_get( int i_id ) { libvlc_global_data_t *p_libvlc_global = vlc_global(); vlc_object_t *obj = NULL; +#ifndef NDEBUG vlc_object_t *caller = vlc_threadobj (); if (caller) @@ -670,7 +671,7 @@ void * vlc_object_get( int i_id ) else fprintf (stderr, "main thread uses deprecated vlc_object_get(%d)\n", i_id); - +#endif vlc_mutex_lock( &structure_lock ); for( obj = vlc_internals (p_libvlc_global)->next; @@ -684,10 +685,12 @@ void * vlc_object_get( int i_id ) } } obj = NULL; +#ifndef NDEBUG if (caller) msg_Warn (caller, "wants non-existing object %d", i_id); else fprintf (stderr, "main thread wants non-existing object %d\n", i_id); +#endif out: vlc_mutex_unlock( &structure_lock ); return obj; @@ -795,7 +798,7 @@ void __vlc_object_yield( vlc_object_t *p_this ) /* Increment the counter */ internals->i_refcount++; vlc_spin_unlock( &internals->ref_spin ); -#ifndef NDEBUG +#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. */ @@ -816,7 +819,7 @@ void __vlc_object_release( vlc_object_t *p_this ) vlc_object_internals_t *internals = vlc_internals( p_this ); bool b_should_destroy; -#ifndef NDEBUG +#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), @@ -1528,7 +1531,7 @@ static void ListChildren( vlc_list_t *p_list, vlc_object_t *p_this, int i_type ) } } -#ifndef NDEBUG +#ifdef LIBVLC_REFCHECK # if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) # include # endif diff --git a/src/misc/threads.c b/src/misc/threads.c index 33270df4a6..282e118462 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -63,6 +63,7 @@ libvlc_global_data_t *vlc_global( void ) return p_root; } +#ifndef NDEBUG /** * Object running the current thread */ @@ -72,6 +73,7 @@ vlc_object_t *vlc_threadobj (void) { return vlc_threadvar_get (&thread_object_key); } +#endif vlc_threadvar_t msg_context_global_key; @@ -170,7 +172,9 @@ int vlc_threads_init( void ) } /* We should be safe now. Do all the initialization stuff we want. */ +#ifndef NDEBUG vlc_threadvar_create( &thread_object_key, NULL ); +#endif vlc_threadvar_create( &msg_context_global_key, msg_StackDestroy ); } i_initializations++; @@ -202,7 +206,9 @@ void vlc_threads_end( void ) { vlc_object_release( p_root ); vlc_threadvar_delete( &msg_context_global_key ); +#ifndef NDEBUG vlc_threadvar_delete( &thread_object_key ); +#endif } i_initializations--; @@ -453,7 +459,9 @@ static THREAD_RTYPE thread_entry (void *data) void *(*func) (void *) = ((struct vlc_thread_boot *)data)->entry; free (data); +#ifdef NDEBUG vlc_threadvar_set (&thread_object_key, obj); +#endif msg_Dbg (obj, "thread started"); func (obj); msg_Dbg (obj, "thread ended");