From 75c1f008fbc316e5ed3c7ff3e0d2d6d9d770d204 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 1 Sep 2012 10:32:21 -0400 Subject: Use thread-safe qdata API for caching GLib gained a new API that allows to set qdata in a thread-safe way. Use it here. --- pango/pango-context.c | 13 +++++++++---- pango/pangocairo-context.c | 10 ++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pango/pango-context.c b/pango/pango-context.c index 2a100e94..2a1e44f3 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -594,15 +594,20 @@ get_shaper_font_cache (PangoFontset *fontset) if (G_UNLIKELY (!cache_quark)) cache_quark = g_quark_from_static_string ("pango-shaper-font-cache"); +retry: cache = g_object_get_qdata (G_OBJECT (fontset), cache_quark); - if (!cache) + if (G_UNLIKELY (!cache)) { cache = g_slice_new (ShaperFontCache); cache->hash = g_hash_table_new_full (g_direct_hash, NULL, NULL, (GDestroyNotify)shaper_font_element_destroy); - - g_object_set_qdata_full (G_OBJECT (fontset), cache_quark, - cache, (GDestroyNotify)shaper_font_cache_destroy); + if (!g_object_replace_qdata (G_OBJECT (fontset), cache_quark, NULL, + cache, (GDestroyNotify)shaper_font_cache_destroy, + NULL)) + { + shaper_font_cache_destroy (cache); + goto retry; + } } return cache; diff --git a/pango/pangocairo-context.c b/pango/pangocairo-context.c index 54cef064..65223b66 100644 --- a/pango/pangocairo-context.c +++ b/pango/pangocairo-context.c @@ -68,6 +68,7 @@ get_context_info (PangoContext *context, if (G_UNLIKELY (!context_info_quark)) context_info_quark = g_quark_from_static_string ("pango-cairo-context-info"); +retry: info = g_object_get_qdata (G_OBJECT (context), context_info_quark); if (G_UNLIKELY (!info) && create) @@ -75,8 +76,13 @@ get_context_info (PangoContext *context, info = g_slice_new0 (PangoCairoContextInfo); info->dpi = -1.0; - g_object_set_qdata_full (G_OBJECT (context), context_info_quark, - info, (GDestroyNotify)free_context_info); + if (!g_object_replace_qdata (G_OBJECT (context), context_info_quark, NULL, + info, (GDestroyNotify)free_context_info, + NULL)) + { + free_context_info (info); + goto retry; + } } return info; -- cgit v1.2.1