diff options
author | Matthias Clasen <mclasen@redhat.com> | 2012-09-14 20:09:38 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2012-09-14 20:10:41 -0400 |
commit | 164c6eb4dc819eb0833d6851f9e16d4994e84e97 (patch) | |
tree | e1ae6c3226087a172fa1baf99e21dc594c2ad7eb /pango/pango-utils.c | |
parent | abd17535c26f9675a162dc26412cea0384cdeebd (diff) | |
download | pango-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.
Diffstat (limited to 'pango/pango-utils.c')
-rw-r--r-- | pango/pango-utils.c | 75 |
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)); } |