summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2012-09-14 20:09:38 -0400
committerMatthias Clasen <mclasen@redhat.com>2012-09-14 20:10:41 -0400
commit164c6eb4dc819eb0833d6851f9e16d4994e84e97 (patch)
treee1ae6c3226087a172fa1baf99e21dc594c2ad7eb
parentabd17535c26f9675a162dc26412cea0384cdeebd (diff)
downloadpango-164c6eb4dc819eb0833d6851f9e16d4994e84e97.tar.gz
Rework config file reading
The code was loading and parsing the system config file every single time, and has not correctly handling mixed requests for user and system config entries. This commit reworks the code so that the configuration is loaded only once, in threadsafe fashion. pango_config_key_get_system is no longer using the same hash table, but reloads its data every time - this is not a really problem, since this function is only used in pango-querymodules.
-rw-r--r--pango/pango-utils.c75
1 files changed, 39 insertions, 36 deletions
diff --git a/pango/pango-utils.c b/pango/pango-utils.c
index 2595e341..112bc388 100644
--- a/pango/pango-utils.c
+++ b/pango/pango-utils.c
@@ -521,9 +521,6 @@ pango_scan_int (const char **pos, int *out)
return TRUE;
}
-static GHashTable *config_hash = NULL;
-static gboolean did_read_system_config = FALSE;
-static gboolean did_read_user_config = FALSE;
static void
read_config_file (const char *filename, gboolean enoent_error, GHashTable *ht)
@@ -595,54 +592,53 @@ read_config_file (const char *filename, gboolean enoent_error, GHashTable *ht)
g_key_file_free(key_file);
}
-static void
-ensure_config_hash (void)
-{
- if (!config_hash)
- config_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify)g_free,
- (GDestroyNotify)g_free);
-}
-
-static void
+static GHashTable *
read_config_system (void)
{
char *filename;
+ GHashTable *config_hash;
- if (!did_read_system_config)
- {
- did_read_system_config = TRUE;
+ config_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify)g_free,
+ (GDestroyNotify)g_free);
- ensure_config_hash ();
+ filename = g_build_filename (pango_get_sysconf_subdirectory (),
+ "pangorc",
+ NULL);
+ read_config_file (filename, FALSE, config_hash);
+ g_free (filename);
- filename = g_build_filename (pango_get_sysconf_subdirectory (),
- "pangorc",
- NULL);
- read_config_file (filename, FALSE, config_hash);
- g_free (filename);
- }
+ return config_hash;
}
-static void
+static GHashTable *
read_config (void)
{
- char *filename;
- const char *envvar;
-
- read_config_system ();
+ static GHashTable *config_hash = NULL;
- if (!did_read_user_config)
+ if (g_once_init_enter ((gsize*)&config_hash))
{
- did_read_user_config = TRUE;
+ GHashTable *tmp_hash;
+ char *filename;
+ const char *envvar;
+
+ tmp_hash = read_config_system ();
- filename = g_build_filename (g_get_user_config_dir (), "pango", "pangorc", NULL);
- read_config_file (filename, FALSE, config_hash);
+ filename = g_build_filename (g_get_user_config_dir (),
+ "pango",
+ "pangorc",
+ NULL);
+ read_config_file (filename, FALSE, tmp_hash);
g_free (filename);
envvar = g_getenv ("PANGO_RC_FILE");
if (envvar)
- read_config_file (envvar, TRUE, config_hash);
+ read_config_file (envvar, TRUE, tmp_hash);
+
+ g_once_init_leave ((gsize*)&config_hash, (gsize)tmp_hash);
}
+
+ return config_hash;
}
/**
@@ -658,11 +654,16 @@ read_config (void)
char *
pango_config_key_get_system (const char *key)
{
+ GHashTable *config_hash;
+ gchar *ret;
+
g_return_val_if_fail (key != NULL, NULL);
- read_config_system ();
+ config_hash = read_config_system ();
+ ret = g_strdup (g_hash_table_lookup (config_hash, key));
+ g_hash_table_unref (config_hash);
- return g_strdup (g_hash_table_lookup (config_hash, key));
+ return ret;
}
/**
@@ -679,9 +680,11 @@ pango_config_key_get_system (const char *key)
char *
pango_config_key_get (const char *key)
{
+ GHashTable *config_hash;
+
g_return_val_if_fail (key != NULL, NULL);
- read_config ();
+ config_hash = read_config ();
return g_strdup (g_hash_table_lookup (config_hash, key));
}