[vlc-devel] [PATCH 3/7] objects: add vlc_object_desc_create

Thomas Guillem thomas at gllm.fr
Mon May 27 16:45:12 CEST 2019


Return a tree of object/module description.

Refs #21997
---
 include/vlc_objects.h | 32 +++++++++++++++++++++++
 src/libvlccore.sym    |  2 ++
 src/misc/objects.c    | 61 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+)

diff --git a/include/vlc_objects.h b/include/vlc_objects.h
index b83c0e06b7..33c6dffdbd 100644
--- a/include/vlc_objects.h
+++ b/include/vlc_objects.h
@@ -20,6 +20,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+#include "vlc_vector.h"
+
 /**
  * \defgroup vlc_object VLC objects
  * \ingroup vlc
@@ -57,6 +59,19 @@ struct vlc_object_t
     bool force;
 };
 
+/**
+ * VLC object description
+ */
+typedef struct vlc_object_desc_t
+{
+    /** Object type name (can't be NULL) */
+    char *type_name;
+    /** Attached module name (can be NULL) */
+    char *module_name;
+    /** Vector of children */
+    struct VLC_VECTOR(struct vlc_object_desc_t *) children;
+} vlc_object_desc_t;
+
 /**
  * Type-safe vlc_object_t cast
  *
@@ -136,6 +151,23 @@ VLC_API void vlc_object_delete(vlc_object_t *obj);
 
 VLC_API size_t vlc_list_children(vlc_object_t *, vlc_object_t **, size_t) VLC_USED;
 
+/**
+ * Return a tree of object descriptions
+ *
+ * @param root root object whose children are to be described
+ *
+ * @return a valid tree description or NULL in case of error, need to be freed
+ * with vlc_object_desc_release()
+ */
+VLC_API vlc_object_desc_t *vlc_object_get_desc_tree(vlc_object_t *root) VLC_USED;
+
+/**
+ * Release a tree of object descriptions
+ *
+ * @param node node returned by vlc_object_get_desc_tree()
+ */
+VLC_API void vlc_object_desc_release(vlc_object_desc_t *node);
+
 /**
  * Returns the object type name.
  *
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 3e6a4428b2..d7a39f4427 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -636,6 +636,8 @@ vlc_object_typename
 vlc_object_parent
 vlc_object_Log
 vlc_object_vaLog
+vlc_object_get_desc_tree
+vlc_object_desc_release
 vlc_once
 vlc_rand_bytes
 vlc_drand48
diff --git a/src/misc/objects.c b/src/misc/objects.c
index 7ed35ea608..185f3a7a17 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -235,3 +235,64 @@ void vlc_object_set_module(vlc_object_t *obj, const module_t *module)
         priv->module = module;
     vlc_mutex_unlock(&tree_lock);
 }
+
+static vlc_object_desc_t *vlc_object_desc_create(vlc_object_internals_t *priv)
+{
+    vlc_object_desc_t *node = malloc(sizeof(vlc_object_desc_t));
+    if (!node)
+        return NULL;
+
+    vlc_vector_init(&node->children);
+
+    size_t count = 0;
+    vlc_object_internals_t *it;
+    vlc_children_foreach(it, priv)
+        count++;
+
+    node->type_name = strdup(priv->typename);
+    node->module_name =
+        priv->module ? strdup(module_get_name(priv->module, false)) : NULL;
+
+    if (!node->type_name || !vlc_vector_reserve(&node->children, count))
+    {
+        free(node->type_name);
+        free(node->module_name);
+        free(node);
+        return NULL;
+    }
+
+    vlc_children_foreach(it, priv)
+    {
+        vlc_object_desc_t *child = vlc_object_desc_create(it);
+        if (!child)
+        {
+            vlc_object_desc_release(node);
+            return NULL;
+        }
+        bool success = vlc_vector_push(&node->children, child);
+        assert(success); (void) success; /* already reserved */
+
+    }
+    return node;
+}
+
+void
+vlc_object_desc_release(vlc_object_desc_t *node)
+{
+    vlc_object_desc_t *child;
+    vlc_vector_foreach(child, &node->children)
+        vlc_object_desc_release(child);
+
+    free(node->type_name);
+    free(node->module_name);
+    vlc_vector_destroy(&node->children);
+    free(node);
+}
+
+vlc_object_desc_t *vlc_object_get_desc_tree(vlc_object_t *obj)
+{
+    vlc_mutex_lock(&tree_lock);
+    vlc_object_desc_t *node = vlc_object_desc_create(vlc_internals(obj));
+    vlc_mutex_unlock(&tree_lock);
+    return node;
+}
-- 
2.20.1



More information about the vlc-devel mailing list