info: add destroy notify to gst_debug_add_log_function()
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 20 Jun 2012 11:28:08 +0000 (13:28 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 20 Jun 2012 11:28:08 +0000 (13:28 +0200)
gst/gstinfo.c
gst/gstinfo.h
tests/check/gst/gstinfo.c

index 9c0871f..f6ca818 100644 (file)
@@ -256,6 +256,7 @@ typedef struct
 {
   GstLogFunction func;
   gpointer user_data;
+  GDestroyNotify notify;
 }
 LogFuncEntry;
 static GMutex __log_func_mutex;
@@ -347,7 +348,7 @@ _priv_gst_debug_init (void)
   _GST_CAT_DEBUG = _gst_debug_category_new ("GST_DEBUG",
       GST_DEBUG_BOLD | GST_DEBUG_FG_YELLOW, "debugging subsystem");
 
-  gst_debug_add_log_function (gst_debug_log_default, NULL);
+  gst_debug_add_log_function (gst_debug_log_default, NULL, NULL);
 
   /* FIXME: add descriptions here */
   GST_CAT_GST_INIT = _gst_debug_category_new ("GST_INIT",
@@ -1063,13 +1064,15 @@ gst_debug_level_get_name (GstDebugLevel level)
 /**
  * gst_debug_add_log_function:
  * @func: the function to use
- * @data: (closure): user data
+ * @user_data: user data
+ * @notify: called when @user_data is not used anymore
  *
  * Adds the logging function to the list of logging functions.
  * Be sure to use #G_GNUC_NO_INSTRUMENT on that function, it is needed.
  */
 void
-gst_debug_add_log_function (GstLogFunction func, gpointer data)
+gst_debug_add_log_function (GstLogFunction func, gpointer user_data,
+    GDestroyNotify notify)
 {
   LogFuncEntry *entry;
   GSList *list;
@@ -1079,7 +1082,8 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data)
 
   entry = g_slice_new (LogFuncEntry);
   entry->func = func;
-  entry->user_data = data;
+  entry->user_data = user_data;
+  entry->notify = notify;
   /* FIXME: we leak the old list here - other threads might access it right now
    * in gst_debug_logv. Another solution is to lock the mutex in gst_debug_logv,
    * but that is waaay costly.
@@ -1092,7 +1096,7 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data)
   g_mutex_unlock (&__log_func_mutex);
 
   GST_DEBUG ("prepended log function %p (user data %p) to log functions",
-      func, data);
+      func, user_data);
 }
 
 static gint
@@ -1115,11 +1119,12 @@ static guint
 gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
 {
   GSList *found;
-  GSList *new;
+  GSList *new, *cleanup = NULL;
   guint removals = 0;
 
   g_mutex_lock (&__log_func_mutex);
   new = __log_functions;
+  cleanup = NULL;
   while ((found = g_slist_find_custom (new, data, func))) {
     if (new == __log_functions) {
       /* make a copy when we have the first hit, so that we modify the copy and
@@ -1127,7 +1132,7 @@ gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
       new = g_slist_copy (new);
       continue;
     }
-    g_slice_free (LogFuncEntry, found->data);
+    cleanup = g_slist_prepend (cleanup, found->data);
     new = g_slist_delete_link (new, found);
     removals++;
   }
@@ -1135,12 +1140,21 @@ gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
   __log_functions = new;
   g_mutex_unlock (&__log_func_mutex);
 
+  while (cleanup) {
+    LogFuncEntry *entry = cleanup->data;
+
+    if (entry->notify)
+      entry->notify (entry->user_data);
+
+    g_slice_free (LogFuncEntry, entry);
+    cleanup = g_slist_delete_link (cleanup, cleanup);
+  }
   return removals;
 }
 
 /**
  * gst_debug_remove_log_function:
- * @func: the log function to remove
+ * @func: (scope call): the log function to remove
  *
  * Removes all registered instances of the given logging functions.
  *
index 3c6f4ca..e325689 100644 (file)
@@ -330,7 +330,8 @@ void            gst_debug_log_default    (GstDebugCategory * category,
 const gchar *   gst_debug_level_get_name (GstDebugLevel level);
 
 void            gst_debug_add_log_function            (GstLogFunction func,
-                                                       gpointer       data);
+                                                       gpointer       user_data,
+                                                       GDestroyNotify notify);
 
 guint           gst_debug_remove_log_function         (GstLogFunction func);
 guint           gst_debug_remove_log_function_by_data (gpointer       data);
@@ -365,13 +366,13 @@ gint    gst_debug_construct_win_color  (guint colorinfo);
 
 #ifndef GST_DISABLE_GST_DEBUG
 
-#define gst_debug_add_log_function(func,data) \
-G_STMT_START{                                 \
-  if (func == gst_debug_log_default) {        \
-    gst_debug_add_log_function(NULL,data);    \
-  } else {                                    \
-    gst_debug_add_log_function(func,data);    \
-  }                                           \
+#define gst_debug_add_log_function(func,data,notify) \
+G_STMT_START{                                        \
+  if (func == gst_debug_log_default) {               \
+    gst_debug_add_log_function(NULL,data,notify);    \
+  } else {                                           \
+    gst_debug_add_log_function(func,data,notify);    \
+  }                                                  \
 }G_STMT_END
 
 #define gst_debug_remove_log_function(func)   \
@@ -1262,7 +1263,7 @@ GST_TRACE (const char *format, ...)
 
 #define gst_debug_level_get_name(level)                                ("NONE")
 #define gst_debug_message_get(message)                         ("")
-#define gst_debug_add_log_function(func,data)          G_STMT_START{ }G_STMT_END
+#define gst_debug_add_log_function(func,data,notify)    G_STMT_START{ }G_STMT_END
 #define gst_debug_set_active(active)                   G_STMT_START{ }G_STMT_END
 #define gst_debug_is_active()                          (FALSE)
 #define gst_debug_set_colored(colored)                 G_STMT_START{ }G_STMT_END
index e7757d8..bc786ee 100644 (file)
@@ -49,7 +49,7 @@ GST_START_TEST (info_ptr_format_printf_extension)
   /* set up our own log function to make sure the code in gstinfo is actually
    * executed without GST_DEBUG being set or it being output to stdout */
   gst_debug_remove_log_function (gst_debug_log_default);
-  gst_debug_add_log_function (printf_extension_log_func, NULL);
+  gst_debug_add_log_function (printf_extension_log_func, NULL, NULL);
 
   gst_debug_set_default_threshold (GST_LEVEL_LOG);
 
@@ -105,7 +105,7 @@ GST_START_TEST (info_ptr_format_printf_extension)
 
   /* clean up */
   gst_debug_set_default_threshold (GST_LEVEL_NONE);
-  gst_debug_add_log_function (gst_debug_log_default, NULL);
+  gst_debug_add_log_function (gst_debug_log_default, NULL, NULL);
   gst_debug_remove_log_function (printf_extension_log_func);
 }
 
@@ -117,7 +117,7 @@ GST_START_TEST (info_segment_format_printf_extension)
   /* set up our own log function to make sure the code in gstinfo is actually
    * executed without GST_DEBUG being set or it being output to stdout */
   gst_debug_remove_log_function (gst_debug_log_default);
-  gst_debug_add_log_function (printf_extension_log_func, NULL);
+  gst_debug_add_log_function (printf_extension_log_func, NULL, NULL);
 
   gst_debug_set_default_threshold (GST_LEVEL_LOG);
 
@@ -183,7 +183,7 @@ GST_START_TEST (info_segment_format_printf_extension)
 
   /* clean up */
   gst_debug_set_default_threshold (GST_LEVEL_NONE);
-  gst_debug_add_log_function (gst_debug_log_default, NULL);
+  gst_debug_add_log_function (gst_debug_log_default, NULL, NULL);
   gst_debug_remove_log_function (printf_extension_log_func);
 }