[pango] Use thread-safe qdata API for caching
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango] Use thread-safe qdata API for caching
- Date: Wed, 5 Sep 2012 01:21:22 +0000 (UTC)
commit 75c1f008fbc316e5ed3c7ff3e0d2d6d9d770d204
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Sep 1 10:32:21 2012 -0400
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 2a100e9..2a1e44f 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 54cef06..65223b6 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]