static void DumpStructure (vlc_object_internals_t *priv, unsigned i_level, char *psz_foo) { char i_back = psz_foo[i_level]; psz_foo[i_level] = '\0'; PrintObject (priv, psz_foo); psz_foo[i_level] = i_back; if( i_level / 2 >= MAX_DUMPSTRUCTURE_DEPTH ) { msg_Warn( vlc_externals(priv), "structure tree is too deep" ); return; } for (priv = priv->first; priv != NULL; priv = priv->next) { if( i_level ) { psz_foo[i_level-1] = ' '; if( psz_foo[i_level-2] == '`' ) { psz_foo[i_level-2] = ' '; } } psz_foo[i_level] = priv->next ? '|' : '`'; psz_foo[i_level+1] = '-'; psz_foo[i_level+2] = '\0'; DumpStructure (priv, i_level + 2, psz_foo); } }
static vlc_object_t *FindChild (vlc_object_internals_t *priv, int i_type) { for (priv = priv->first; priv != NULL; priv = priv->next) { if (priv->i_object_type == i_type) return vlc_object_hold (vlc_externals (priv)); vlc_object_t *found = FindChild (priv, i_type); if (found != NULL) return found; } return NULL; }
static vlc_object_t *FindChildName (vlc_object_internals_t *priv, const char *name) { for (priv = priv->first; priv != NULL; priv = priv->next) { if (priv->psz_name && !strcmp (priv->psz_name, name)) return vlc_object_hold (vlc_externals (priv)); vlc_object_t *found = FindChildName (priv, name); if (found != NULL) return found; } return NULL; }
static void PrintObject( vlc_object_internals_t *priv, const char *psz_prefix ) { char psz_refcount[20], psz_thread[30], psz_name[50], psz_parent[20]; int canc = vlc_savecancel (); memset( &psz_name, 0, sizeof(psz_name) ); vlc_mutex_lock (&name_lock); if (priv->psz_name != NULL) { snprintf( psz_name, 49, " \"%s\"", priv->psz_name ); if( psz_name[48] ) psz_name[48] = '\"'; } vlc_mutex_unlock (&name_lock); psz_refcount[0] = '\0'; if( priv->i_refcount > 0 ) snprintf( psz_refcount, 19, ", %u refs", priv->i_refcount ); psz_thread[0] = '\0'; if( priv->b_thread ) snprintf( psz_thread, 29, " (thread %lu)", (unsigned long)priv->thread_id ); psz_parent[0] = '\0'; /* FIXME: need structure lock!!! */ if( vlc_externals(priv)->p_parent ) snprintf( psz_parent, 19, ", parent %p", vlc_externals(priv)->p_parent ); printf( " %so %p %s%s%s%s%s\n", psz_prefix, vlc_externals(priv), vlc_externals(priv)->psz_object_type, psz_name, psz_thread, psz_refcount, psz_parent ); vlc_restorecancel (canc); }
static vlc_object_t *ObjectExists (vlc_object_t *root, void *obj) { if (root == obj) return vlc_object_hold (root); vlc_object_internals_t *priv = vlc_internals(root); vlc_object_t *ret = NULL; /* NOTE: nested locking here (due to recursive call) */ vlc_mutex_lock (&vlc_internals(root)->tree_lock); for (priv = priv->first; priv != NULL && ret == NULL; priv = priv->next) ret = ObjectExists (vlc_externals (priv), obj); vlc_mutex_unlock (&vlc_internals(root)->tree_lock); return ret; }
/** * Gets the list of children of an objects, and increment their reference * count. * @return a list (possibly empty) or NULL in case of error. */ vlc_list_t *vlc_list_children( vlc_object_t *obj ) { vlc_list_t *l; vlc_object_internals_t *priv; unsigned count = 0; libvlc_lock (obj->p_libvlc); for (priv = vlc_internals (obj)->first; priv; priv = priv->next) count++; l = NewList (count); if (likely(l != NULL)) { unsigned i = 0; for (priv = vlc_internals (obj)->first; priv; priv = priv->next) l->p_values[i++].p_object = vlc_object_hold (vlc_externals (priv)); } libvlc_unlock (obj->p_libvlc); return l; }
static void DumpStructure (vlc_object_t *obj, unsigned level, char *psz_foo) { char back = psz_foo[level]; psz_foo[level] = '\0'; PrintObject (obj, psz_foo); psz_foo[level] = back; if (level / 2 >= MAX_DUMPSTRUCTURE_DEPTH) { msg_Warn (obj, "structure tree is too deep"); return; } vlc_object_internals_t *priv = vlc_internals(obj); /* NOTE: nested locking here (due to recursive call) */ vlc_mutex_lock (&vlc_internals(obj)->tree_lock); for (priv = priv->first; priv != NULL; priv = priv->next) { if (level > 0) { assert(level >= 2); psz_foo[level - 1] = ' '; if (psz_foo[level - 2] == '`') psz_foo[level - 2] = ' '; } psz_foo[level] = priv->next ? '|' : '`'; psz_foo[level + 1] = '-'; psz_foo[level + 2] = '\0'; DumpStructure (vlc_externals(priv), level + 2, psz_foo); } vlc_mutex_unlock (&vlc_internals(obj)->tree_lock); }