[dconf] engine: issue warnings once per source
- From: Ryan Lortie <desrt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dconf] engine: issue warnings once per source
- Date: Mon, 25 Nov 2013 18:01:45 +0000 (UTC)
commit 048e2e5e9c89eb08ef954194f2a5505e3d4ace3a
Author: Ryan Lortie <desrt desrt ca>
Date: Mon Nov 25 11:37:24 2013 -0500
engine: issue warnings once per source
On failure to open a gvdb file in /etc/dconf/db we would issue a warning
once per process -- even if multiple files were missing.
This was enforced using a static variable.
An unfortunate side effect of this global state is that the testcases
couldn't reliably know if to expect the error or not. This issue was
side-stepped by running any cases that may emit the warning under a
fork, but that made it difficult to debug some of the cases.
Rework the backends not to use global state for the flag and instead
store it per-source.
Remove a use of g_test_trap_fork().
engine/dconf-engine-source-service.c | 5 +--
engine/dconf-engine-source-system.c | 5 +--
engine/dconf-engine-source.h | 1 +
tests/engine.c | 47 +++++++++++++++++++++++++++------
4 files changed, 43 insertions(+), 15 deletions(-)
---
diff --git a/engine/dconf-engine-source-service.c b/engine/dconf-engine-source-service.c
index 0bd0c05..b4da653 100644
--- a/engine/dconf-engine-source-service.c
+++ b/engine/dconf-engine-source-service.c
@@ -48,7 +48,6 @@ dconf_engine_source_service_needs_reopen (DConfEngineSource *source)
static GvdbTable *
dconf_engine_source_service_reopen (DConfEngineSource *source)
{
- static gboolean did_warn;
GError *error = NULL;
GvdbTable *table;
gchar *filename;
@@ -68,10 +67,10 @@ dconf_engine_source_service_reopen (DConfEngineSource *source)
if (table == NULL)
{
- if (!did_warn)
+ if (!source->did_warn)
{
g_warning ("unable to open file '%s': %s; expect degraded performance", filename,
error->message);
- did_warn = TRUE;
+ source->did_warn = TRUE;
}
g_error_free (error);
diff --git a/engine/dconf-engine-source-system.c b/engine/dconf-engine-source-system.c
index 5d48e7f..30e67eb 100644
--- a/engine/dconf-engine-source-system.c
+++ b/engine/dconf-engine-source-system.c
@@ -45,7 +45,6 @@ dconf_engine_source_system_needs_reopen (DConfEngineSource *source)
static GvdbTable *
dconf_engine_source_system_reopen (DConfEngineSource *source)
{
- static gboolean did_warn;
GError *error = NULL;
GvdbTable *table;
gchar *filename;
@@ -55,10 +54,10 @@ dconf_engine_source_system_reopen (DConfEngineSource *source)
if (table == NULL)
{
- if (!did_warn)
+ if (!source->did_warn)
{
g_warning ("unable to open file '%s': %s; expect degraded performance", filename, error->message);
- did_warn = TRUE;
+ source->did_warn = TRUE;
}
g_error_free (error);
diff --git a/engine/dconf-engine-source.h b/engine/dconf-engine-source.h
index 3828dba..8aefc41 100644
--- a/engine/dconf-engine-source.h
+++ b/engine/dconf-engine-source.h
@@ -47,6 +47,7 @@ struct _DConfEngineSource
GvdbTable *locks;
GBusType bus_type;
gboolean writable;
+ gboolean did_warn;
gchar *bus_name;
gchar *object_path;
gchar *name;
diff --git a/tests/engine.c b/tests/engine.c
index 578c928..156e2bc 100644
--- a/tests/engine.c
+++ b/tests/engine.c
@@ -858,6 +858,35 @@ check_read (DConfEngine *engine,
}
}
+static gboolean
+is_expected (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message)
+{
+ return g_str_equal (log_domain, "dconf") &&
+ log_level == (G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL) &&
+ strstr (message, "unable to open file '/etc/dconf/db");
+}
+
+static gboolean
+fatal_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+ return !is_expected (log_domain, log_level, message);
+}
+
+static void
+normal_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+ if (!is_expected (log_domain, log_level, message))
+ g_error ("unexpected error: %s\n", message);
+}
+
static void
test_read (void)
{
@@ -868,15 +897,13 @@ test_read (void)
DConfEngine *engine;
guint i, j, k;
guint n;
+ guint handler_id;
- /* Hack to silence warning */
- if (!g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
- {
- g_test_trap_assert_passed ();
- g_test_trap_assert_stderr ("*this gvdb does not exist; expect degraded performance*");
- return;
- }
- g_log_set_always_fatal (G_LOG_LEVEL_ERROR);
+ /* This test throws a lot of messages about missing databases.
+ * Capture and ignore them.
+ */
+ g_test_log_set_fatal_handler (fatal_handler, NULL);
+ handler_id = g_log_set_handler ("dconf", G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL, normal_handler, NULL);
/* Our test strategy is as follows:
*
@@ -1050,7 +1077,9 @@ test_read (void)
g_unsetenv ("DCONF_PROFILE");
g_unlink (profile_filename);
g_free (profile_filename);
- exit (0);
+ dconf_mock_shm_reset ();
+
+ g_log_remove_handler ("dconf", handler_id);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]