X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fobjects.c;h=dc9c09f76a5f7ee39214ce5ec14c1ba80822f702;hb=830bfb51bcd76d72fb9849281dde281018e0095f;hp=98704d90dd6b99afdac7b44d231f2d8fb29b23da;hpb=e24e108c767d00f3123c3d702f46595d31149c48;p=vlc diff --git a/src/misc/objects.c b/src/misc/objects.c index 98704d90dd..dc9c09f76a 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -48,17 +48,10 @@ #include #include "stream_output/stream_output.h" -#include "vlc_playlist.h" #include "vlc_interface.h" #include "vlc_codec.h" #include "vlc_filter.h" -#include "vlc_httpd.h" -#include "vlc_vlm.h" -#include "input/vlm_internal.h" -#include "vlc_osd.h" -#include "vlc_meta.h" - #include "variables.h" #ifndef WIN32 # include @@ -87,7 +80,7 @@ static void DetachObject ( vlc_object_t * ); static void PrintObject ( vlc_object_t *, const char * ); static void DumpStructure ( vlc_object_t *, int, char * ); static int FindIndex ( vlc_object_t *, vlc_object_t **, int ); -static void SetAttachment ( vlc_object_t *, vlc_bool_t ); +static void SetAttachment ( vlc_object_t *, bool ); static vlc_list_t * NewList ( int ); static void ListReplace ( vlc_list_t *, vlc_object_t *, int ); @@ -102,28 +95,28 @@ static void vlc_object_yield_locked( vlc_object_t *p_this ); * Local structure lock *****************************************************************************/ static vlc_mutex_t structure_lock; -static vlc_object_internals_t global_internals; -vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size, - int i_type, const char *psz_type ) +void *vlc_custom_create( vlc_object_t *p_this, size_t i_size, + int i_type, const char *psz_type ) { vlc_object_t *p_new; vlc_object_internals_t *p_priv; - if( i_type == VLC_OBJECT_GLOBAL ) - { - p_new = p_this; - p_priv = &global_internals; - memset( p_priv, 0, sizeof( *p_priv ) ); - } - else - { - p_priv = calloc( 1, sizeof( *p_priv ) + i_size ); - if( p_priv == NULL ) - return NULL; + /* NOTE: + * VLC objects are laid out as follow: + * - first the LibVLC-private per-object data, + * - then VLC_COMMON members from vlc_object_t, + * - finally, the type-specific data (if any). + * + * This function initializes the LibVLC and common data, + * and zeroes the rest. + */ + p_priv = calloc( 1, sizeof( *p_priv ) + i_size ); + if( p_priv == NULL ) + return NULL; - p_new = (vlc_object_t *)(p_priv + 1); - } + assert (i_size >= sizeof (vlc_object_t)); + p_new = (vlc_object_t *)(p_priv + 1); p_new->p_internals = p_priv; p_new->i_object_type = i_type; @@ -131,73 +124,65 @@ vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size, p_new->psz_object_name = NULL; - p_new->b_die = VLC_FALSE; - p_new->b_error = VLC_FALSE; - p_new->b_dead = VLC_FALSE; - p_priv->b_attached = VLC_FALSE; - p_new->b_force = VLC_FALSE; + p_new->b_die = false; + p_new->b_error = false; + p_new->b_dead = false; + p_priv->b_attached = false; + p_new->b_force = false; p_new->psz_header = NULL; - if( p_this->i_flags & OBJECT_FLAGS_NODBG ) - p_new->i_flags |= OBJECT_FLAGS_NODBG; - if( p_this->i_flags & OBJECT_FLAGS_QUIET ) - p_new->i_flags |= OBJECT_FLAGS_QUIET; - if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT ) - p_new->i_flags |= OBJECT_FLAGS_NOINTERACT; + if (p_this) + p_new->i_flags = p_this->i_flags + & (OBJECT_FLAGS_NODBG|OBJECT_FLAGS_QUIET|OBJECT_FLAGS_NOINTERACT); p_priv->p_vars = calloc( sizeof( variable_t ), 16 ); if( !p_priv->p_vars ) { - if( i_type != VLC_OBJECT_GLOBAL ) - free( p_priv ); + free( p_priv ); return NULL; } + libvlc_global_data_t *p_libvlc_global; if( i_type == VLC_OBJECT_GLOBAL ) { /* If i_type is global, then p_new is actually p_libvlc_global */ - libvlc_global_data_t *p_libvlc_global = (libvlc_global_data_t *)p_new; + p_libvlc_global = (libvlc_global_data_t *)p_new; p_new->p_libvlc = NULL; p_libvlc_global->i_counter = 0; - p_new->i_object_id = 0; - - p_libvlc_global->i_objects = 1; - p_libvlc_global->pp_objects = malloc( sizeof(vlc_object_t *) ); - p_libvlc_global->pp_objects[0] = p_new; - p_priv->b_attached = VLC_TRUE; + p_libvlc_global->i_objects = 0; + p_libvlc_global->pp_objects = NULL; + p_priv->b_attached = true; + vlc_mutex_init( p_new, &structure_lock ); } else { - libvlc_global_data_t *p_libvlc_global = vlc_global(); + p_libvlc_global = vlc_global(); if( i_type == VLC_OBJECT_LIBVLC ) { p_new->p_libvlc = (libvlc_int_t*)p_new; - p_priv->b_attached = VLC_TRUE; + p_priv->b_attached = true; } else { p_new->p_libvlc = p_this->p_libvlc; } + } - vlc_mutex_lock( &structure_lock ); - - p_libvlc_global->i_counter++; - p_new->i_object_id = p_libvlc_global->i_counter; - - /* Wooohaa! If *this* fails, we're in serious trouble! Anyway it's - * useless to try and recover anything if pp_objects gets smashed. */ - TAB_APPEND( p_libvlc_global->i_objects, p_libvlc_global->pp_objects, - p_new ); + vlc_mutex_lock( &structure_lock ); + p_new->i_object_id = p_libvlc_global->i_counter++; - vlc_mutex_unlock( &structure_lock ); - } + /* Wooohaa! If *this* fails, we're in serious trouble! Anyway it's + * useless to try and recover anything if pp_objects gets smashed. */ + TAB_APPEND( p_libvlc_global->i_objects, p_libvlc_global->pp_objects, + p_new ); + vlc_mutex_unlock( &structure_lock ); p_priv->i_refcount = 1; p_priv->pf_destructor = kVLCDestructor; - p_priv->b_thread = VLC_FALSE; + p_priv->b_thread = false; p_new->p_parent = NULL; p_new->pp_children = NULL; p_new->i_children = 0; @@ -211,11 +196,6 @@ vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size, vlc_spin_init( &p_priv->spin ); p_priv->pipes[0] = p_priv->pipes[1] = -1; - if( i_type == VLC_OBJECT_GLOBAL ) - { - vlc_mutex_init( p_new, &structure_lock ); - } - if( i_type == VLC_OBJECT_LIBVLC ) { var_Create( p_new, "list", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); @@ -245,10 +225,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type ) switch( i_type ) { - case VLC_OBJECT_GLOBAL: - i_size = sizeof(libvlc_global_data_t); - psz_type = "global"; - break; case VLC_OBJECT_LIBVLC: i_size = sizeof(libvlc_int_t); psz_type = "libvlc"; @@ -261,14 +237,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type ) i_size = sizeof(intf_thread_t); psz_type = "dialogs"; break; - case VLC_OBJECT_PLAYLIST: - i_size = sizeof(playlist_t); - psz_type = "playlist"; - break; - case VLC_OBJECT_INPUT: - i_size = sizeof(input_thread_t); - psz_type = "input"; - break; case VLC_OBJECT_DEMUX: i_size = sizeof(demux_t); psz_type = "demux"; @@ -305,10 +273,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type ) i_size = sizeof(sout_instance_t); psz_type = "stream output"; break; - case VLC_OBJECT_VLM: - i_size = sizeof( vlm_t ); - psz_type = "vlm dameon"; - break; case VLC_OBJECT_OPENGL: i_size = sizeof( vout_thread_t ); psz_type = "opengl"; @@ -317,14 +281,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type ) i_size = sizeof( announce_handler_t ); psz_type = "announce"; break; - case VLC_OBJECT_META_ENGINE: - i_size = sizeof( meta_engine_t ); - psz_type = "meta engine"; - break; - case VLC_OBJECT_OSDMENU: - i_size = sizeof( osd_menu_t ); - psz_type = "osd menu"; - break; case VLC_OBJECT_INTERACTION: i_size = sizeof( interaction_t ); psz_type = "interaction"; @@ -406,6 +362,10 @@ static void vlc_object_destroy( vlc_object_t *p_this ) p_this->pp_children[i]->psz_object_name ); } fflush(stderr); + + /* Dump libvlc object to ease debugging */ + vlc_object_dump( p_this->p_libvlc ); + abort(); } @@ -437,8 +397,16 @@ static void vlc_object_destroy( vlc_object_t *p_this ) p_global->pp_objects[i]->i_object_id, p_global->pp_objects[i]->psz_object_type, p_global->pp_objects[i]->psz_object_name ); + + /* Dump libvlc object to ease debugging */ + vlc_object_dump( p_global->pp_objects[i] ); + fflush(stderr); } + + /* Dump libvlc object to ease debugging */ + vlc_object_dump( p_this ); + /* Strongly abort, cause we want these to be fixed */ abort(); } @@ -450,6 +418,8 @@ static void vlc_object_destroy( vlc_object_t *p_this ) vlc_mutex_destroy( &structure_lock ); } + FREENULL( p_this->psz_object_name ); + #if defined(WIN32) || defined(UNDER_CE) /* if object has an associated thread, close it now */ if( p_priv->thread_id.hThread ) @@ -464,9 +434,7 @@ static void vlc_object_destroy( vlc_object_t *p_this ) if( p_priv->pipes[0] != -1 ) close( p_priv->pipes[0] ); - /* global is not dynamically allocated by vlc_object_create */ - if( p_this->i_object_type != VLC_OBJECT_GLOBAL ) - free( p_priv ); + free( p_priv ); } @@ -551,8 +519,8 @@ error: int __vlc_object_waitpipe( vlc_object_t *obj ) { int pfd[2] = { -1, -1 }; - struct vlc_object_internals_t *internals = obj->p_internals; - vlc_bool_t killed = VLC_FALSE; + vlc_object_internals_t *internals = vlc_internals( obj ); + bool killed = false; vlc_spin_lock (&internals->spin); if (internals->pipes[0] == -1) @@ -607,7 +575,7 @@ int __vlc_object_waitpipe( vlc_object_t *obj ) * * @return true if the object is dying and should terminate. */ -vlc_bool_t __vlc_object_wait( vlc_object_t *obj ) +bool __vlc_object_wait( vlc_object_t *obj ) { vlc_assert_locked( &obj->object_lock ); vlc_cond_wait( &obj->object_wait, &obj->object_lock ); @@ -660,7 +628,7 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline ) * * @return true iff the object has not been killed yet */ -vlc_bool_t __vlc_object_alive( vlc_object_t *obj ) +bool __vlc_object_alive( vlc_object_t *obj ) { vlc_assert_locked( &obj->object_lock ); return !obj->b_die; @@ -683,11 +651,11 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj ) */ void __vlc_object_kill( vlc_object_t *p_this ) { - struct vlc_object_internals_t *internals = p_this->p_internals; + vlc_object_internals_t *internals = vlc_internals( p_this ); int fd; vlc_mutex_lock( &p_this->object_lock ); - p_this->b_die = VLC_TRUE; + p_this->b_die = true; vlc_spin_lock (&internals->spin); fd = internals->pipes[1]; @@ -745,7 +713,7 @@ void * vlc_object_get( int i_id ) { /* This happens when there are only two remaining objects */ if( pp_objects[i_middle+1]->i_object_id == i_id - && pp_objects[i_middle+1]->p_internals->i_refcount > 0 ) + && vlc_internals( pp_objects[i_middle+1] )->i_refcount > 0 ) { vlc_object_yield_locked( pp_objects[i_middle+1] ); vlc_mutex_unlock( &structure_lock ); @@ -754,7 +722,7 @@ void * vlc_object_get( int i_id ) break; } } - else if( pp_objects[i_middle]->p_internals->i_refcount > 0 ) + else if( vlc_internals( pp_objects[i_middle] )->i_refcount > 0 ) { vlc_object_yield_locked( pp_objects[i_middle] ); vlc_mutex_unlock( &structure_lock ); @@ -788,7 +756,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->p_internals->i_refcount > 0 ) + && vlc_internals( p_this )->i_refcount > 0 ) { vlc_object_yield_locked( p_this ); vlc_mutex_unlock( &structure_lock ); @@ -839,13 +807,13 @@ void * __vlc_object_find_name( vlc_object_t *p_this, const char *psz_name, vlc_mutex_lock( &structure_lock ); /* Avoid obvious freed object uses */ - assert( p_this->p_internals->i_refcount > 0 ); + assert( vlc_internals( p_this )->i_refcount > 0 ); /* If have the requested name ourselves, don't look further */ if( !(i_mode & FIND_STRICT) && p_this->psz_object_name && !strcmp( p_this->psz_object_name, psz_name ) - && p_this->p_internals->i_refcount > 0 ) + && vlc_internals( p_this )->i_refcount > 0 ) { vlc_object_yield_locked( p_this ); vlc_mutex_unlock( &structure_lock ); @@ -893,10 +861,10 @@ static void vlc_object_yield_locked( vlc_object_t *p_this ) vlc_assert_locked (&structure_lock); /* Avoid obvious freed object uses */ - assert( p_this->p_internals->i_refcount > 0 ); + assert( vlc_internals( p_this )->i_refcount > 0 ); /* Increment the counter */ - p_this->p_internals->i_refcount++; + vlc_internals( p_this )->i_refcount++; } /* Public function */ @@ -914,13 +882,13 @@ void __vlc_object_yield( vlc_object_t *p_this ) *****************************************************************************/ void __vlc_object_release( vlc_object_t *p_this ) { - vlc_bool_t b_should_destroy; + bool b_should_destroy; vlc_mutex_lock( &structure_lock ); - assert( p_this->p_internals->i_refcount > 0 ); - p_this->p_internals->i_refcount--; - b_should_destroy = (p_this->p_internals->i_refcount == 0); + assert( vlc_internals( p_this )->i_refcount > 0 ); + vlc_internals( p_this )->i_refcount--; + b_should_destroy = (vlc_internals( p_this )->i_refcount == 0); if( b_should_destroy ) { @@ -957,7 +925,7 @@ void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent ) vlc_mutex_lock( &structure_lock ); /* Avoid obvious freed object uses */ - assert( p_this->p_internals->i_refcount > 0 ); + assert( vlc_internals( p_this )->i_refcount > 0 ); /* Attach the parent to its child */ p_this->p_parent = p_parent; @@ -967,9 +935,9 @@ void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent ) p_parent->i_children, p_this ); /* Climb up the tree to see whether we are connected with the root */ - if( p_parent->p_internals->b_attached ) + if( vlc_internals( p_parent )->b_attached ) { - SetAttachment( p_this, VLC_TRUE ); + SetAttachment( p_this, true ); } vlc_mutex_unlock( &structure_lock ); @@ -995,9 +963,9 @@ void __vlc_object_detach( vlc_object_t *p_this ) } /* Climb up the tree to see whether we are connected with the root */ - if( p_this->p_parent->p_internals->b_attached ) + if( vlc_internals( p_this->p_parent )->b_attached ) { - SetAttachment( p_this, VLC_FALSE ); + SetAttachment( p_this, false ); } DetachObject( p_this ); @@ -1030,7 +998,7 @@ vlc_list_t * __vlc_list_find( vlc_object_t *p_this, int i_type, int i_mode ) for( ; pp_current < pp_end ; pp_current++ ) { - if( (*pp_current)->p_internals->b_attached + if( vlc_internals(*pp_current)->b_attached && (*pp_current)->i_object_type == i_type ) { i_count++; @@ -1042,7 +1010,7 @@ vlc_list_t * __vlc_list_find( vlc_object_t *p_this, int i_type, int i_mode ) for( ; pp_current < pp_end ; pp_current++ ) { - if( (*pp_current)->p_internals->b_attached + if( vlc_internals(*pp_current)->b_attached && (*pp_current)->i_object_type == i_type ) { ListReplace( p_list, *pp_current, i_index ); @@ -1102,7 +1070,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd, for( ; pp_current < pp_end ; pp_current++ ) { - if( (*pp_current)->p_internals->b_attached ) + if( vlc_internals(*pp_current)->b_attached ) { PrintObject( *pp_current, "" ); } @@ -1174,11 +1142,11 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd, PrintObject( p_object, "" ); - if( !p_object->p_internals->i_vars ) + if( !vlc_internals( p_object )->i_vars ) printf( " `-o No variables\n" ); - for( i = 0; i < p_object->p_internals->i_vars; i++ ) + for( i = 0; i < vlc_internals( p_object )->i_vars; i++ ) { - variable_t *p_var = p_object->p_internals->p_vars + i; + variable_t *p_var = vlc_internals( p_object )->p_vars + i; const char *psz_type = "unknown"; switch( p_var->i_type & VLC_VAR_TYPE ) @@ -1204,7 +1172,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd, #undef MYCASE } printf( " %c-o \"%s\" (%s", - i + 1 == p_object->p_internals->i_vars ? '`' : '|', + i + 1 == vlc_internals( p_object )->i_vars ? '`' : '|', p_var->psz_name, psz_type ); if( p_var->psz_text ) printf( ", %s", p_var->psz_text ); @@ -1231,7 +1199,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd, printf( ": %f", p_var->val.f_float ); break; case VLC_VAR_TIME: - printf( ": " I64Fi, (int64_t)p_var->val.i_time ); + printf( ": %"PRIi64, (int64_t)p_var->val.i_time ); break; case VLC_VAR_ADDRESS: printf( ": %p", p_var->val.p_address ); @@ -1274,6 +1242,18 @@ void vlc_list_release( vlc_list_t *p_list ) free( p_list ); } +/***************************************************************************** + * dump an object. (Debug function) + *****************************************************************************/ +void __vlc_object_dump( vlc_object_t *p_this ) +{ + vlc_mutex_lock( &structure_lock ); + char psz_foo[2 * MAX_DUMPSTRUCTURE_DEPTH + 1]; + psz_foo[0] = '|'; + DumpStructure( p_this, 0, psz_foo ); + vlc_mutex_unlock( &structure_lock ); +} + /* Following functions are local */ /***************************************************************************** @@ -1328,7 +1308,7 @@ static vlc_object_t * FindObject( vlc_object_t *p_this, int i_type, int i_mode ) if( p_tmp ) { if( p_tmp->i_object_type == i_type - && p_tmp->p_internals->i_refcount > 0 ) + && vlc_internals( p_tmp )->i_refcount > 0 ) { vlc_object_yield_locked( p_tmp ); return p_tmp; @@ -1345,7 +1325,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->p_internals->i_refcount > 0 ) + && vlc_internals( p_tmp )->i_refcount > 0 ) { vlc_object_yield_locked( p_tmp ); return p_tmp; @@ -1384,7 +1364,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->p_internals->i_refcount > 0 ) + && vlc_internals( p_tmp )->i_refcount > 0 ) { vlc_object_yield_locked( p_tmp ); return p_tmp; @@ -1402,7 +1382,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this, p_tmp = p_this->pp_children[i]; if( p_tmp->psz_object_name && !strcmp( p_tmp->psz_object_name, psz_name ) - && p_tmp->p_internals->i_refcount > 0 ) + && vlc_internals( p_tmp )->i_refcount > 0 ) { vlc_object_yield_locked( p_tmp ); return p_tmp; @@ -1465,7 +1445,7 @@ static void DetachObject( vlc_object_t *p_this ) * This function is used by the attach and detach functions to propagate * the b_attached flag in a subtree. *****************************************************************************/ -static void SetAttachment( vlc_object_t *p_this, vlc_bool_t b_attached ) +static void SetAttachment( vlc_object_t *p_this, bool b_attached ) { int i_index; @@ -1474,7 +1454,7 @@ static void SetAttachment( vlc_object_t *p_this, vlc_bool_t b_attached ) SetAttachment( p_this->pp_children[i_index], b_attached ); } - p_this->p_internals->b_attached = b_attached; + vlc_internals( p_this )->b_attached = b_attached; } static void PrintObject( vlc_object_t *p_this, const char *psz_prefix ) @@ -1482,7 +1462,7 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix ) char psz_children[20], psz_refcount[20], psz_thread[30], psz_name[50], psz_parent[20]; - psz_name[0] = '\0'; + memset( &psz_name, 0, sizeof(psz_name) ); if( p_this->psz_object_name ) { snprintf( psz_name, 49, " \"%s\"", p_this->psz_object_name ); @@ -1504,17 +1484,17 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix ) } psz_refcount[0] = '\0'; - if( p_this->p_internals->i_refcount > 0 ) + if( vlc_internals( p_this )->i_refcount > 0 ) snprintf( psz_refcount, 19, ", refcount %u", - p_this->p_internals->i_refcount ); + vlc_internals( p_this )->i_refcount ); psz_thread[0] = '\0'; - if( p_this->p_internals->b_thread ) + if( vlc_internals( p_this )->b_thread ) snprintf( psz_thread, 29, " (thread %u)", #if defined(WIN32) || defined(UNDER_CE) - (unsigned)p_this->p_internals->thread_id.id ); + (unsigned)vlc_internals( p_this )->thread_id.id ); #else - (unsigned)p_this->p_internals->thread_id ); + (unsigned)vlc_internals( p_this )->thread_id ); #endif psz_parent[0] = '\0';