Merge branch 'introduce-g_log_set_debug_domains' into 'main'

gmessages: introduce g_log_set_debug_domains()

See merge request GNOME/glib!3710
This commit is contained in:
Philip Withnall 2023-11-22 10:45:01 +00:00
commit c7a02280f5
4 changed files with 326 additions and 69 deletions

View File

@ -310,7 +310,8 @@
*
* Such messages are suppressed by the g_log_default_handler() and
* g_log_writer_default() unless the `G_MESSAGES_DEBUG` environment variable is
* set appropriately.
* set appropriately. If you need to set the allowed domains at runtime, use
* g_log_writer_default_set_debug_domains().
*
* If structured logging is enabled, this will use g_log_structured();
* otherwise it will use g_log(). See
@ -333,7 +334,8 @@
*
* Such messages are suppressed by the g_log_default_handler() and
* g_log_writer_default() unless the `G_MESSAGES_DEBUG` environment variable is
* set appropriately.
* set appropriately. If you need to set the allowed domains at runtime, use
* g_log_writer_default_set_debug_domains().
*
* If structured logging is enabled, this will use g_log_structured();
* otherwise it will use g_log(). See
@ -2485,6 +2487,36 @@ domain_found (const gchar *domains,
return FALSE;
}
static struct {
GRWLock lock;
gchar *domains;
gboolean domains_set;
} g_log_global;
/**
* g_log_writer_default_set_debug_domains:
* @domains: (nullable) (transfer none): `NULL`-terminated array with domains to be printed.
* `NULL` or an array with no values means none. Array with a single value `"all"` means all.
* Reset the list of domains to be logged, that might be initially set by the
* `G_MESSAGES_DEBUG` environment variable. This function is thread-safe.
*
* Since: 2.80
*/
void
g_log_writer_default_set_debug_domains (const gchar * const *domains)
{
g_rw_lock_writer_lock (&g_log_global.lock);
g_free (g_log_global.domains);
g_log_global.domains = domains ?
g_strjoinv (" ", (gchar **)domains) : NULL;
g_log_global.domains_set = TRUE;
g_rw_lock_writer_unlock (&g_log_global.lock);
}
/*
* Internal version of g_log_writer_default_would_drop(), which can
* read from either a log_domain or an array of fields. This avoids
@ -2502,14 +2534,22 @@ should_drop_message (GLogLevelFlags log_level,
!(log_level >> G_LOG_LEVEL_USER_SHIFT) &&
!g_log_get_debug_enabled ())
{
const gchar *domains;
gsize i;
domains = g_getenv ("G_MESSAGES_DEBUG");
g_rw_lock_reader_lock (&g_log_global.lock);
if (G_UNLIKELY (!g_log_global.domains_set))
{
g_log_global.domains = g_strdup (g_getenv ("G_MESSAGES_DEBUG"));
g_log_global.domains_set = TRUE;
}
if ((log_level & INFO_LEVELS) == 0 ||
domains == NULL)
return TRUE;
g_log_global.domains == NULL)
{
g_rw_lock_reader_unlock (&g_log_global.lock);
return TRUE;
}
if (log_domain == NULL)
{
@ -2523,9 +2563,14 @@ should_drop_message (GLogLevelFlags log_level,
}
}
if (strcmp (domains, "all") != 0 &&
(log_domain == NULL || !domain_found (domains, log_domain)))
return TRUE;
if (strcmp (g_log_global.domains, "all") != 0 &&
(log_domain == NULL || !domain_found (g_log_global.domains, log_domain)))
{
g_rw_lock_reader_unlock (&g_log_global.lock);
return TRUE;
}
g_rw_lock_reader_unlock (&g_log_global.lock);
}
return FALSE;
@ -2542,7 +2587,7 @@ should_drop_message (GLogLevelFlags log_level,
*
* As with g_log_default_handler(), this function drops debug and informational
* messages unless their log domain (or `all`) is listed in the space-separated
* `G_MESSAGES_DEBUG` environment variable.
* `G_MESSAGES_DEBUG` environment variable, or by g_log_writer_default_set_debug_domains().
*
* This can be used when implementing log writers with the same filtering
* behaviour as the default, but a different destination or output format:
@ -2599,7 +2644,7 @@ g_log_writer_default_would_drop (GLogLevelFlags log_level,
*
* As with g_log_default_handler(), this function drops debug and informational
* messages unless their log domain (or `all`) is listed in the space-separated
* `G_MESSAGES_DEBUG` environment variable.
* `G_MESSAGES_DEBUG` environment variable, or set at runtime by g_log_writer_default_set_debug_domains().
*
* g_log_writer_default() uses the mask set by g_log_set_always_fatal() to
* determine which messages are fatal. When using a custom writer func instead it is
@ -2740,8 +2785,8 @@ _g_log_writer_fallback (GLogLevelFlags log_level,
* other logging functions; it should only be used from %GLogWriterFunc
* implementations.
*
* Note also that the value of this does not depend on `G_MESSAGES_DEBUG`; see
* the docs for g_log_set_debug_enabled().
* Note also that the value of this does not depend on `G_MESSAGES_DEBUG`, nor
* g_log_writer_default_set_debug_domains(); see the docs for g_log_set_debug_enabled().
*
* Returns: %TRUE if debug output is enabled, %FALSE otherwise
*
@ -2758,8 +2803,9 @@ g_log_get_debug_enabled (void)
* @enabled: %TRUE to enable debug output, %FALSE otherwise
*
* Enable or disable debug output from the GLib logging system for all domains.
* This value interacts disjunctively with `G_MESSAGES_DEBUG` if either of
* them would allow a debug message to be outputted, it will be.
* This value interacts disjunctively with `G_MESSAGES_DEBUG` and
* g_log_writer_default_set_debug_domains() if any of them would allow
* a debug message to be outputted, it will be.
*
* Note that this should not be used from within library code to enable debug
* output it is intended for external use.
@ -3086,7 +3132,8 @@ escape_string (GString *string)
*
* - `G_MESSAGES_DEBUG`: A space-separated list of log domains for
* which debug and informational messages are printed. By default
* these messages are not printed.
* these messages are not printed. If you need to set the allowed
* domains at runtime, use g_log_writer_default_set_debug_domains().
*
* stderr is used for levels %G_LOG_LEVEL_ERROR, %G_LOG_LEVEL_CRITICAL,
* %G_LOG_LEVEL_WARNING and %G_LOG_LEVEL_MESSAGE. stdout is used for

View File

@ -250,6 +250,9 @@ void g_log_writer_default_set_use_stderr (gboolean use_stderr);
GLIB_AVAILABLE_IN_2_68
gboolean g_log_writer_default_would_drop (GLogLevelFlags log_level,
const char *log_domain);
GLIB_AVAILABLE_IN_2_80
void g_log_writer_default_set_debug_domains (const gchar * const *domains);
/* G_MESSAGES_DEBUG enablement */
GLIB_AVAILABLE_IN_2_72

View File

@ -201,6 +201,71 @@ test_default_handler_debug_stderr (void)
exit (0);
}
static void
test_default_handler_would_drop_env5 (void)
{
g_setenv ("G_MESSAGES_DEBUG", "foobar", TRUE);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
static void
test_default_handler_would_drop_env4 (void)
{
g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
}
static void
test_default_handler_would_drop_env3 (void)
{
g_setenv ("G_MESSAGES_DEBUG", "foo bar", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
}
static void
test_default_handler_would_drop_env2 (void)
{
g_setenv ("G_MESSAGES_DEBUG", " bar baz ", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
}
static void
test_default_handler_would_drop_env1 (void)
{
g_unsetenv ("G_MESSAGES_DEBUG");
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
}
static void
test_default_handler_would_drop (void)
{
@ -214,7 +279,8 @@ test_default_handler_would_drop (void)
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
g_setenv ("G_MESSAGES_DEBUG", "bar baz", TRUE);
/* Expected to have no effect */
g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
@ -224,69 +290,142 @@ test_default_handler_would_drop (void)
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
g_setenv ("G_MESSAGES_DEBUG", "foo bar", TRUE);
{
const gchar *domains[] = { "all", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
}
g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
{
const gchar *domains[] = { "foobar", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (1<<G_LOG_LEVEL_USER_SHIFT, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
g_setenv ("G_MESSAGES_DEBUG", "foobar", TRUE);
{
const gchar *domains[] = { "foobar", "bar", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
{
const gchar *domains[] = { "foobar", "bar", "barfoo", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
{
const gchar *domains[] = { "", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
{
const gchar *domains[] = { "foobar", "bar", "foo", "barfoo", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "baz"));
}
{
const gchar *domains[] = { "foo", "bar", "baz", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "baz"));
}
{
const gchar *domains[] = { "foo", NULL };
g_log_writer_default_set_debug_domains (domains);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foobarbaz"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "barfoobaz"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "barbazfoo"));
}
{
const gchar *domains[] = {NULL};
g_log_writer_default_set_debug_domains (domains);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
}
g_log_writer_default_set_debug_domains (NULL);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_setenv ("G_MESSAGES_DEBUG", "foobar bar", TRUE);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_setenv ("G_MESSAGES_DEBUG", "foobar bar barfoo", TRUE);
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_setenv ("G_MESSAGES_DEBUG", "foobar bar foo barfoo", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "baz"));
g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "baz"));
g_setenv ("G_MESSAGES_DEBUG", "foo", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foobarbaz"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "barfoobaz"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "barbazfoo"));
g_setenv ("G_MESSAGES_DEBUG", " foo bar foobaz ", TRUE);
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo"));
g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar"));
g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "baz"));
exit (0);
}
static const gchar *
test_would_drop_robustness_random_domain (void)
{
static const gchar *domains[] = { "foo", "bar", "baz", NULL };
return domains[g_random_int_range (0, G_N_ELEMENTS (domains))];
}
static gboolean test_would_drop_robustness_stopping;
static gpointer
test_would_drop_robustness_thread (gpointer data)
{
while (!g_atomic_int_get (&test_would_drop_robustness_stopping))
{
gsize i;
const gchar *domains[4] = { 0 };
for (i = 0; i < G_N_ELEMENTS (domains) - 1; i++)
domains[i] = test_would_drop_robustness_random_domain ();
domains[G_N_ELEMENTS (domains) - 1] = 0;
g_log_writer_default_set_debug_domains (domains);
}
return NULL;
}
static void
test_default_handler_would_drop_robustness (void)
{
GThread *threads[2];
gsize i;
guint counter = 1024 * 128;
g_log_writer_default_set_debug_domains (NULL);
for (i = 0; i < G_N_ELEMENTS (threads); i++)
threads[i] = g_thread_new (NULL, test_would_drop_robustness_thread, NULL);
while (counter-- > 0)
g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, test_would_drop_robustness_random_domain ());
g_atomic_int_set (&test_would_drop_robustness_stopping, TRUE);
for (i = 0; i < G_N_ELEMENTS (threads); i++)
g_thread_join (threads[i]);
}
static void
test_default_handler_0x400 (void)
{
@ -378,6 +517,24 @@ test_default_handler (void)
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env1", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env2", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env3", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env4", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env5", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-robustness", 0,
G_TEST_SUBPROCESS_DEFAULT);
g_test_trap_assert_passed ();
}
static void
@ -911,6 +1068,12 @@ main (int argc, char *argv[])
g_test_add_func ("/logging/default-handler/subprocess/debug-stderr", test_default_handler_debug_stderr);
g_test_add_func ("/logging/default-handler/subprocess/0x400", test_default_handler_0x400);
g_test_add_func ("/logging/default-handler/subprocess/would-drop", test_default_handler_would_drop);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-env1", test_default_handler_would_drop_env1);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-env2", test_default_handler_would_drop_env2);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-env3", test_default_handler_would_drop_env3);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-env4", test_default_handler_would_drop_env4);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-env5", test_default_handler_would_drop_env5);
g_test_add_func ("/logging/default-handler/subprocess/would-drop-robustness", test_default_handler_would_drop_robustness);
g_test_add_func ("/logging/warnings", test_warnings);
g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask);
g_test_add_func ("/logging/set-handler", test_set_handler);

View File

@ -1278,3 +1278,47 @@
...
fun:xdg_mime_init
}
# One-time allocations for default log writer lock and domains
{
should_drop_message_rw_lock
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:g_rw_lock_impl_new
fun:g_rw_lock_get_impl
fun:g_rw_lock_reader_lock
fun:should_drop_message
}
{
should_drop_message_strdup
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:g_malloc
fun:g_strdup
fun:g_strdup_inline
fun:should_drop_message
}
{
g_log_writer_default_set_debug_strdup
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:g_malloc
fun:g_strdup_inline
fun:g_log_writer_default_set_debug_domains
}
{
g_log_writer_default_set_debug_rw_lock
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:g_rw_lock_impl_new
fun:g_rw_lock_get_impl
fun:g_rw_lock_writer_lock
fun:g_log_writer_default_set_debug_domains
}