[vlc-commits] variables: add var_GetAllNames

Thomas Guillem git at videolan.org
Wed May 31 17:44:58 CEST 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue May 30 11:02:41 2017 +0200| [e1597367c9d14428142be60a123822feb4cba6be] | committer: Thomas Guillem

variables: add var_GetAllNames

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e1597367c9d14428142be60a123822feb4cba6be
---

 src/misc/variables.c | 34 ++++++++++++++++++++++++++++++++++
 src/misc/variables.h | 11 +++++++++++
 2 files changed, 45 insertions(+)

diff --git a/src/misc/variables.c b/src/misc/variables.c
index 5e9ba678a8..f2e5478479 100644
--- a/src/misc/variables.c
+++ b/src/misc/variables.c
@@ -37,6 +37,7 @@
 #include <limits.h>
 
 #include <vlc_common.h>
+#include <vlc_arrays.h>
 #include <vlc_charset.h>
 #include "libvlc.h"
 #include "variables.h"
@@ -1376,3 +1377,36 @@ void DumpVariables(vlc_object_t *obj)
         twalk(vlc_internals(obj)->var_root, DumpVariable);
     vlc_mutex_unlock(&vlc_internals(obj)->var_lock);
 }
+
+static _Thread_local void *twalk_ctx;
+
+static void TwalkGetNames(const void *data, const VISIT which, const int depth)
+{
+    if (which != postorder && which != leaf)
+        return;
+    (void) depth;
+
+    const variable_t *var = *(const variable_t **)data;
+    DECL_ARRAY(char *) *names = twalk_ctx;
+    char *dup = strdup(var->psz_name);
+    if (dup != NULL)
+        ARRAY_APPEND(*names, dup);
+}
+
+char **var_GetAllNames(vlc_object_t *obj)
+{
+    vlc_object_internals_t *priv = vlc_internals(obj);
+
+    DECL_ARRAY(char *) names;
+    ARRAY_INIT(names);
+
+    vlc_mutex_lock(&priv->var_lock);
+    twalk_ctx = &names;
+    twalk(priv->var_root, TwalkGetNames);
+    vlc_mutex_unlock(&priv->var_lock);
+
+    if (names.i_size == 0)
+        return NULL;
+    ARRAY_APPEND(names, NULL);
+    return names.p_elems;
+}
diff --git a/src/misc/variables.h b/src/misc/variables.h
index 97fb2ba18d..e5853e449c 100644
--- a/src/misc/variables.h
+++ b/src/misc/variables.h
@@ -57,4 +57,15 @@ void DumpVariables(vlc_object_t *obj);
 
 extern void var_DestroyAll( vlc_object_t * );
 
+/**
+ * Return a list of all variable names
+ *
+ * There is no warranty that the returned variables will be still alive after
+ * the return of this function.
+ *
+ * @return a NULL terminated list of char *, each elements and the return value
+ * must be freed by the caller
+ */
+char **var_GetAllNames(vlc_object_t *);
+
 #endif



More information about the vlc-commits mailing list