#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:
*/
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;
#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;
/**
# include <errno.h> /* ENOSYS */
#endif
+#include <limits.h>
#include <assert.h>
#if defined (HAVE_SYS_EVENTFD_H)
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;
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)
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] )
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.
* 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;
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);
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;
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;
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] = '\"';
}