From 25779da81f66bfb7118395757cf1a031af09b068 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 14 Sep 2012 22:12:30 -0400 Subject: Make modules.c thread-safe The maps list is protected with a mutex. registered_engines, dlloaded_engines and dlloaded_modules are read-only after init_modules, which is protected with g_once_init. Finally, engine creation is protected with another mutex. --- pango/modules.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'pango') diff --git a/pango/modules.c b/pango/modules.c index 1fbd58de..644cc9cb 100644 --- a/pango/modules.c +++ b/pango/modules.c @@ -88,7 +88,9 @@ struct _PangoModuleClass GTypeModuleClass parent_class; }; +G_LOCK_DEFINE_STATIC (maps); static GList *maps = NULL; +/* the following are readonly after init_modules */ static GSList *registered_engines = NULL; static GSList *dlloaded_engines = NULL; static GHashTable *dlloaded_modules; @@ -131,10 +133,13 @@ pango_find_map (PangoLanguage *language, guint engine_type_id, guint render_type_id) { - GList *tmp_list = maps; + GList *tmp_list; PangoMapInfo *map_info = NULL; gboolean found_earlier = FALSE; + G_LOCK (maps); + + tmp_list = maps; while (tmp_list) { map_info = tmp_list->data; @@ -173,6 +178,8 @@ pango_find_map (PangoLanguage *language, g_list_free_1(tmp_list); } + G_UNLOCK (maps); + return map_info->map; } @@ -278,10 +285,13 @@ pango_module_class_init (PangoModuleClass *class) gobject_class->finalize = pango_module_finalize; } +G_LOCK_DEFINE_STATIC (engine); static PangoEngine * pango_engine_pair_get_engine (PangoEnginePair *pair) { + G_LOCK (engine); + if (!pair->engine) { if (g_type_module_use (G_TYPE_MODULE (pair->module))) @@ -303,6 +313,8 @@ pango_engine_pair_get_engine (PangoEnginePair *pair) } } + G_UNLOCK (engine); + return pair->engine; } @@ -573,20 +585,20 @@ read_modules (void) static void init_modules (void) { - static gboolean init = FALSE; + static gsize init = 0; int i; - if (init) - return; - else - init = TRUE; + if (g_once_init_enter (&init)) + { + /* Make sure that the type system is initialized */ + g_type_init (); - /* Make sure that the type system is initialized */ - g_type_init (); + for (i = 0; _pango_included_lang_modules[i].list; i++) + pango_module_register (&_pango_included_lang_modules[i]); + read_modules (); - for (i = 0; _pango_included_lang_modules[i].list; i++) - pango_module_register (&_pango_included_lang_modules[i]); - read_modules (); + g_once_init_leave (&init, 1); + } } static void -- cgit v1.2.1