GSettings: make _sync() a no-op if uninitialised
authorRyan Lortie <desrt@desrt.ca>
Mon, 11 Apr 2011 07:37:47 +0000 (03:37 -0400)
committerRyan Lortie <desrt@desrt.ca>
Mon, 11 Apr 2011 07:39:27 +0000 (03:39 -0400)
If GSettings is uninitialised then g_settings_sync() should very
obviously just return right away (rather than attempting to initialise
GSettings first).

gio/gsettingsbackend.c

index 24a6f9a..553eda0 100644 (file)
@@ -45,6 +45,13 @@ struct _GSettingsBackendPrivate
   GStaticMutex lock;
 };
 
+/* For g_settings_backend_sync_default(), we only want to actually do
+ * the sync if the backend already exists.  This avoids us creating an
+ * entire GSettingsBackend in order to call a do-nothing sync()
+ * operation on it.  This variable lets us avoid that.
+ */
+static gboolean g_settings_has_backend;
+
 /**
  * SECTION:gsettingsbackend
  * @title: GSettingsBackend
@@ -982,6 +989,7 @@ g_settings_backend_get_default (void)
 
       extension_type = g_io_extension_get_type (extension);
       instance = g_object_new (extension_type, NULL);
+      g_settings_has_backend = TRUE;
 
       g_once_init_leave (&backend, (gsize) instance);
     }
@@ -1021,12 +1029,15 @@ g_settings_backend_get_permission (GSettingsBackend *backend,
 void
 g_settings_backend_sync_default (void)
 {
-  GSettingsBackendClass *class;
-  GSettingsBackend *backend;
+  if (g_settings_has_backend)
+    {
+      GSettingsBackendClass *class;
+      GSettingsBackend *backend;
 
-  backend = g_settings_backend_get_default ();
-  class = G_SETTINGS_BACKEND_GET_CLASS (backend);
+      backend = g_settings_backend_get_default ();
+      class = G_SETTINGS_BACKEND_GET_CLASS (backend);
 
-  if (class->sync)
-    class->sync (backend);
+      if (class->sync)
+        class->sync (backend);
+    }
 }