info: add destroy notify to gst_debug_add_log_function()

This commit is contained in:
Wim Taymans 2012-06-20 13:28:08 +02:00
parent d2c632fcda
commit 7da1d23a9b
3 changed files with 36 additions and 21 deletions

View file

@ -256,6 +256,7 @@ typedef struct
{ {
GstLogFunction func; GstLogFunction func;
gpointer user_data; gpointer user_data;
GDestroyNotify notify;
} }
LogFuncEntry; LogFuncEntry;
static GMutex __log_func_mutex; static GMutex __log_func_mutex;
@ -347,7 +348,7 @@ _priv_gst_debug_init (void)
_GST_CAT_DEBUG = _gst_debug_category_new ("GST_DEBUG", _GST_CAT_DEBUG = _gst_debug_category_new ("GST_DEBUG",
GST_DEBUG_BOLD | GST_DEBUG_FG_YELLOW, "debugging subsystem"); 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 */ /* FIXME: add descriptions here */
GST_CAT_GST_INIT = _gst_debug_category_new ("GST_INIT", 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: * gst_debug_add_log_function:
* @func: the function to use * @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. * Adds the logging function to the list of logging functions.
* Be sure to use #G_GNUC_NO_INSTRUMENT on that function, it is needed. * Be sure to use #G_GNUC_NO_INSTRUMENT on that function, it is needed.
*/ */
void void
gst_debug_add_log_function (GstLogFunction func, gpointer data) gst_debug_add_log_function (GstLogFunction func, gpointer user_data,
GDestroyNotify notify)
{ {
LogFuncEntry *entry; LogFuncEntry *entry;
GSList *list; GSList *list;
@ -1079,7 +1082,8 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data)
entry = g_slice_new (LogFuncEntry); entry = g_slice_new (LogFuncEntry);
entry->func = func; 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 /* 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, * in gst_debug_logv. Another solution is to lock the mutex in gst_debug_logv,
* but that is waaay costly. * but that is waaay costly.
@ -1092,7 +1096,7 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data)
g_mutex_unlock (&__log_func_mutex); g_mutex_unlock (&__log_func_mutex);
GST_DEBUG ("prepended log function %p (user data %p) to log functions", GST_DEBUG ("prepended log function %p (user data %p) to log functions",
func, data); func, user_data);
} }
static gint static gint
@ -1115,11 +1119,12 @@ static guint
gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data) gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
{ {
GSList *found; GSList *found;
GSList *new; GSList *new, *cleanup = NULL;
guint removals = 0; guint removals = 0;
g_mutex_lock (&__log_func_mutex); g_mutex_lock (&__log_func_mutex);
new = __log_functions; new = __log_functions;
cleanup = NULL;
while ((found = g_slist_find_custom (new, data, func))) { while ((found = g_slist_find_custom (new, data, func))) {
if (new == __log_functions) { if (new == __log_functions) {
/* make a copy when we have the first hit, so that we modify the copy and /* 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); new = g_slist_copy (new);
continue; continue;
} }
g_slice_free (LogFuncEntry, found->data); cleanup = g_slist_prepend (cleanup, found->data);
new = g_slist_delete_link (new, found); new = g_slist_delete_link (new, found);
removals++; removals++;
} }
@ -1135,12 +1140,21 @@ gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
__log_functions = new; __log_functions = new;
g_mutex_unlock (&__log_func_mutex); 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; return removals;
} }
/** /**
* gst_debug_remove_log_function: * 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. * Removes all registered instances of the given logging functions.
* *

View file

@ -330,7 +330,8 @@ void gst_debug_log_default (GstDebugCategory * category,
const gchar * gst_debug_level_get_name (GstDebugLevel level); const gchar * gst_debug_level_get_name (GstDebugLevel level);
void gst_debug_add_log_function (GstLogFunction func, 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 (GstLogFunction func);
guint gst_debug_remove_log_function_by_data (gpointer data); 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 #ifndef GST_DISABLE_GST_DEBUG
#define gst_debug_add_log_function(func,data) \ #define gst_debug_add_log_function(func,data,notify) \
G_STMT_START{ \ G_STMT_START{ \
if (func == gst_debug_log_default) { \ if (func == gst_debug_log_default) { \
gst_debug_add_log_function(NULL,data); \ gst_debug_add_log_function(NULL,data,notify); \
} else { \ } else { \
gst_debug_add_log_function(func,data); \ gst_debug_add_log_function(func,data,notify); \
} \ } \
}G_STMT_END }G_STMT_END
#define gst_debug_remove_log_function(func) \ #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_level_get_name(level) ("NONE")
#define gst_debug_message_get(message) ("") #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_set_active(active) G_STMT_START{ }G_STMT_END
#define gst_debug_is_active() (FALSE) #define gst_debug_is_active() (FALSE)
#define gst_debug_set_colored(colored) G_STMT_START{ }G_STMT_END #define gst_debug_set_colored(colored) G_STMT_START{ }G_STMT_END

View 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 /* 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 */ * executed without GST_DEBUG being set or it being output to stdout */
gst_debug_remove_log_function (gst_debug_log_default); 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); gst_debug_set_default_threshold (GST_LEVEL_LOG);
@ -105,7 +105,7 @@ GST_START_TEST (info_ptr_format_printf_extension)
/* clean up */ /* clean up */
gst_debug_set_default_threshold (GST_LEVEL_NONE); 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); 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 /* 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 */ * executed without GST_DEBUG being set or it being output to stdout */
gst_debug_remove_log_function (gst_debug_log_default); 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); gst_debug_set_default_threshold (GST_LEVEL_LOG);
@ -183,7 +183,7 @@ GST_START_TEST (info_segment_format_printf_extension)
/* clean up */ /* clean up */
gst_debug_set_default_threshold (GST_LEVEL_NONE); 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); gst_debug_remove_log_function (printf_extension_log_func);
} }