From 7401be218f92721f09ab76e459c33e4a617df9a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 23 Aug 2009 22:26:56 +0300 Subject: [PATCH] vlc_object_get_name, vlc_object_set_name: accessors --- src/libvlc.h | 14 ++++++++++++-- src/misc/objects.c | 43 +++++++++++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/libvlc.h b/src/libvlc.h index b6560e7990..08890833aa 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -140,6 +140,12 @@ __vlc_custom_create (vlc_object_t *p_this, size_t i_size, int i_type, #define vlc_custom_create(o, s, t, n) \ __vlc_custom_create(VLC_OBJECT(o), s, t, n) +/** + * Assign a name to an object for vlc_object_find_name(). + */ +extern int vlc_object_set_name(vlc_object_t *, const char *); +#define vlc_object_set_name(o, n) vlc_object_set_name(VLC_OBJECT(o), n) + /* * To be cleaned-up module stuff: */ @@ -158,8 +164,7 @@ module_t *module_find_by_shortcut (const char *psz_shortcut); typedef struct vlc_object_internals_t { int i_object_type; /* Object type, deprecated */ - char *psz_object_name; /* module name */ - /* ^^ can only used from the thread that called module_(un)need() */ + char *psz_name; /* given name */ /* Object variables */ variable_t * p_vars; @@ -193,6 +198,11 @@ typedef struct vlc_object_internals_t #define vlc_internals( obj ) (((vlc_object_internals_t*)(VLC_OBJECT(obj)))-1) +static inline const char *vlc_object_get_name(const vlc_object_t *o) +{ + return vlc_internals(o)->psz_name; +} + typedef struct sap_handler_t sap_handler_t; /** diff --git a/src/misc/objects.c b/src/misc/objects.c index cf5640880b..b97f5235f8 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -54,6 +54,7 @@ # include /* ENOSYS */ #endif +#include #include #if defined (HAVE_SYS_EVENTFD_H) @@ -122,7 +123,7 @@ void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size, p_priv->i_object_type = i_type; p_new->psz_object_type = psz_type; - p_priv->psz_object_name = NULL; + p_priv->psz_name = NULL; p_new->b_die = false; p_new->b_error = false; @@ -241,6 +242,20 @@ void __vlc_object_set_destructor( vlc_object_t *p_this, vlc_spin_unlock( &p_priv->ref_spin ); } +#undef vlc_object_set_name +int vlc_object_set_name(vlc_object_t *obj, const char *name) +{ + vlc_object_internals_t *priv = vlc_internals(obj); + + /* Object must be named before it is attached (or never) */ + assert(obj->p_parent == NULL); + assert(priv->i_children == 0); + + free(priv->psz_name); + priv->psz_name = name ? strdup(name) : NULL; + return (priv->psz_name || !name) ? VLC_SUCCESS : VLC_ENOMEM; +} + /** **************************************************************************** * Destroy a vlc object (Internal) @@ -281,7 +296,7 @@ static void vlc_object_destroy( vlc_object_t *p_this ) free( p_this->psz_header ); - free( p_priv->psz_object_name ); + free( p_priv->psz_name ); vlc_spin_destroy( &p_priv->ref_spin ); if( p_priv->pipes[1] != -1 && p_priv->pipes[1] != p_priv->pipes[0] ) @@ -453,6 +468,14 @@ void * __vlc_object_find( vlc_object_t *p_this, int i_type, int i_mode ) return p_found; } + +static int objnamecmp(const vlc_object_t *obj, const char *name) +{ + if (!vlc_object_get_name(obj)) + return INT_MIN; + return strcmp( vlc_object_get_name(obj), name ); +} + #undef vlc_object_find_name /** * Finds a named object and increment its reference count. @@ -479,9 +502,7 @@ vlc_object_t *vlc_object_find_name( vlc_object_t *p_this, * Use a libvlc address variable instead for that sort of things! */ msg_Warn( p_this, "%s(%s) is not safe!", __func__, psz_name ); /* If have the requested name ourselves, don't look further */ - if( !(i_mode & FIND_STRICT) - && vlc_internals(p_this)->psz_object_name - && !strcmp( vlc_internals(p_this)->psz_object_name, psz_name ) ) + if( !(i_mode & FIND_STRICT) && !objnamecmp(p_this, psz_name) ) { vlc_object_hold( p_this ); return p_this; @@ -581,7 +602,7 @@ void __vlc_object_release( vlc_object_t *p_this ) fprintf( stderr, "ERROR: leaking object (%p, type:%s, name:%s)\n", leaked, leaked->psz_object_type, - vlc_internals(leaked)->psz_object_name ); + vlc_object_get_name(leaked) ); /* Dump object to ease debugging */ vlc_object_dump( leaked ); fflush(stderr); @@ -1014,8 +1035,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this, p_tmp = p_this->p_parent; if( p_tmp ) { - if( vlc_internals(p_tmp)->psz_object_name - && !strcmp( vlc_internals(p_tmp)->psz_object_name, psz_name ) ) + if( !objnamecmp(p_tmp, psz_name) ) { vlc_object_hold( p_tmp ); return p_tmp; @@ -1031,8 +1051,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this, for( i = vlc_internals( p_this )->i_children; i--; ) { p_tmp = vlc_internals( p_this )->pp_children[i]; - if( vlc_internals(p_tmp)->psz_object_name - && !strcmp( vlc_internals(p_tmp)->psz_object_name, psz_name ) ) + if( !objnamecmp(p_tmp, psz_name ) ) { vlc_object_hold( p_tmp ); return p_tmp; @@ -1064,10 +1083,10 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix ) int canc = vlc_savecancel (); memset( &psz_name, 0, sizeof(psz_name) ); - if( vlc_internals(p_this)->psz_object_name ) + if( vlc_object_get_name(p_this) ) { snprintf( psz_name, 49, " \"%s\"", - vlc_internals(p_this)->psz_object_name ); + vlc_object_get_name(p_this) ); if( psz_name[48] ) psz_name[48] = '\"'; } -- 2.39.2