info: fix performance issue with registering categories after gst_init()
authorTim-Philipp Müller <tim@centricular.com>
Sat, 2 Dec 2017 12:22:47 +0000 (12:22 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 2 Dec 2017 12:51:17 +0000 (12:51 +0000)
When registering a new debug category after gst_init(), simply check
the existing patterns against that new category.

No need to iterate over all categories and recheck them all against
the existing patterns.

Also, no need to re-parse the existing pattern string set via GST_DEBUG
and add the same set of match patterns all over again to the existing
list of match patterns every time we register a new debug category.

Combined with iterating all debug categories on a change this would
make adding debug categories after gst_init() very very very slow.

gst/gstinfo.c

index 6500f22..79b43c1 100644 (file)
@@ -1692,6 +1692,18 @@ gst_debug_unset_threshold_for_name (const gchar * name)
   gst_debug_reset_all_thresholds ();
 }
 
+static void
+gst_debug_apply_patterns_to_category (GstDebugCategory * cat)
+{
+  GSList *l;
+
+  g_mutex_lock (&__level_name_mutex);
+  for (l = __level_name; l != NULL; l = l->next) {
+    for_each_threshold_by_entry (cat, (LevelNameEntry *) l->data);
+  }
+  g_mutex_unlock (&__level_name_mutex);
+}
+
 GstDebugCategory *
 _gst_debug_category_new (const gchar * name, guint color,
     const gchar * description)
@@ -1726,7 +1738,7 @@ _gst_debug_category_new (const gchar * name, guint color,
 
   /* ensure the filter is applied to categories registered after _debug_init */
   if (_gst_debug_filter) {
-    gst_debug_set_threshold_from_string (_gst_debug_filter, FALSE);
+    gst_debug_apply_patterns_to_category (cat);
   }
 
   return cat;