Commit 7401be21 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vlc_object_get_name, vlc_object_set_name: accessors

parent df85fc8b
...@@ -140,6 +140,12 @@ __vlc_custom_create (vlc_object_t *p_this, size_t i_size, int i_type, ...@@ -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) \ #define vlc_custom_create(o, s, t, n) \
__vlc_custom_create(VLC_OBJECT(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: * To be cleaned-up module stuff:
*/ */
...@@ -158,8 +164,7 @@ module_t *module_find_by_shortcut (const char *psz_shortcut); ...@@ -158,8 +164,7 @@ module_t *module_find_by_shortcut (const char *psz_shortcut);
typedef struct vlc_object_internals_t typedef struct vlc_object_internals_t
{ {
int i_object_type; /* Object type, deprecated */ int i_object_type; /* Object type, deprecated */
char *psz_object_name; /* module name */ char *psz_name; /* given name */
/* ^^ can only used from the thread that called module_(un)need() */
/* Object variables */ /* Object variables */
variable_t * p_vars; variable_t * p_vars;
...@@ -193,6 +198,11 @@ typedef struct vlc_object_internals_t ...@@ -193,6 +198,11 @@ typedef struct vlc_object_internals_t
#define vlc_internals( obj ) (((vlc_object_internals_t*)(VLC_OBJECT(obj)))-1) #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; typedef struct sap_handler_t sap_handler_t;
/** /**
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
# include <errno.h> /* ENOSYS */ # include <errno.h> /* ENOSYS */
#endif #endif
#include <limits.h>
#include <assert.h> #include <assert.h>
#if defined (HAVE_SYS_EVENTFD_H) #if defined (HAVE_SYS_EVENTFD_H)
...@@ -122,7 +123,7 @@ void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size, ...@@ -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_priv->i_object_type = i_type;
p_new->psz_object_type = psz_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_die = false;
p_new->b_error = false; p_new->b_error = false;
...@@ -241,6 +242,20 @@ void __vlc_object_set_destructor( vlc_object_t *p_this, ...@@ -241,6 +242,20 @@ void __vlc_object_set_destructor( vlc_object_t *p_this,
vlc_spin_unlock( &p_priv->ref_spin ); 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) * Destroy a vlc object (Internal)
...@@ -281,7 +296,7 @@ static void vlc_object_destroy( vlc_object_t *p_this ) ...@@ -281,7 +296,7 @@ static void vlc_object_destroy( vlc_object_t *p_this )
free( p_this->psz_header ); free( p_this->psz_header );
free( p_priv->psz_object_name ); free( p_priv->psz_name );
vlc_spin_destroy( &p_priv->ref_spin ); vlc_spin_destroy( &p_priv->ref_spin );
if( p_priv->pipes[1] != -1 && p_priv->pipes[1] != p_priv->pipes[0] ) 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 ) ...@@ -453,6 +468,14 @@ void * __vlc_object_find( vlc_object_t *p_this, int i_type, int i_mode )
return p_found; 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 #undef vlc_object_find_name
/** /**
* Finds a named object and increment its reference count. * 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, ...@@ -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! */ * Use a libvlc address variable instead for that sort of things! */
msg_Warn( p_this, "%s(%s) is not safe!", __func__, psz_name ); msg_Warn( p_this, "%s(%s) is not safe!", __func__, psz_name );
/* If have the requested name ourselves, don't look further */ /* If have the requested name ourselves, don't look further */
if( !(i_mode & FIND_STRICT) if( !(i_mode & FIND_STRICT) && !objnamecmp(p_this, psz_name) )
&& vlc_internals(p_this)->psz_object_name
&& !strcmp( vlc_internals(p_this)->psz_object_name, psz_name ) )
{ {
vlc_object_hold( p_this ); vlc_object_hold( p_this );
return p_this; return p_this;
...@@ -581,7 +602,7 @@ void __vlc_object_release( vlc_object_t *p_this ) ...@@ -581,7 +602,7 @@ void __vlc_object_release( vlc_object_t *p_this )
fprintf( stderr, fprintf( stderr,
"ERROR: leaking object (%p, type:%s, name:%s)\n", "ERROR: leaking object (%p, type:%s, name:%s)\n",
leaked, leaked->psz_object_type, leaked, leaked->psz_object_type,
vlc_internals(leaked)->psz_object_name ); vlc_object_get_name(leaked) );
/* Dump object to ease debugging */ /* Dump object to ease debugging */
vlc_object_dump( leaked ); vlc_object_dump( leaked );
fflush(stderr); fflush(stderr);
...@@ -1014,8 +1035,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this, ...@@ -1014,8 +1035,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this,
p_tmp = p_this->p_parent; p_tmp = p_this->p_parent;
if( p_tmp ) if( p_tmp )
{ {
if( vlc_internals(p_tmp)->psz_object_name if( !objnamecmp(p_tmp, psz_name) )
&& !strcmp( vlc_internals(p_tmp)->psz_object_name, psz_name ) )
{ {
vlc_object_hold( p_tmp ); vlc_object_hold( p_tmp );
return p_tmp; return p_tmp;
...@@ -1031,8 +1051,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this, ...@@ -1031,8 +1051,7 @@ static vlc_object_t * FindObjectName( vlc_object_t *p_this,
for( i = vlc_internals( p_this )->i_children; i--; ) for( i = vlc_internals( p_this )->i_children; i--; )
{ {
p_tmp = vlc_internals( p_this )->pp_children[i]; p_tmp = vlc_internals( p_this )->pp_children[i];
if( vlc_internals(p_tmp)->psz_object_name if( !objnamecmp(p_tmp, psz_name ) )
&& !strcmp( vlc_internals(p_tmp)->psz_object_name, psz_name ) )
{ {
vlc_object_hold( p_tmp ); vlc_object_hold( p_tmp );
return p_tmp; return p_tmp;
...@@ -1064,10 +1083,10 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix ) ...@@ -1064,10 +1083,10 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
int canc = vlc_savecancel (); int canc = vlc_savecancel ();
memset( &psz_name, 0, sizeof(psz_name) ); 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\"", snprintf( psz_name, 49, " \"%s\"",
vlc_internals(p_this)->psz_object_name ); vlc_object_get_name(p_this) );
if( psz_name[48] ) if( psz_name[48] )
psz_name[48] = '\"'; psz_name[48] = '\"';
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment