summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2012-10-15 21:07:59 -0500
committerBehdad Esfahbod <behdad@behdad.org>2012-11-07 10:59:04 -0800
commit8fe4d29b944e7cfcc9d7a998be9fbadcbe0c3fb9 (patch)
tree18169b2cf3e1d4ae32361b67022d5c52771a53ee
parent16169eec0dcb3d32ae456c5a16c82056e35dc28b (diff)
downloadpango-8fe4d29b944e7cfcc9d7a998be9fbadcbe0c3fb9.tar.gz
Make fontset cache threadsafe
I still see crashes in there though. Investigating.
-rw-r--r--pango/pangofc-fontmap.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 6e47d08e..84f2b94f 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -109,6 +109,7 @@ struct _PangoFcFontMapPrivate
{
PHashTable *fontset_hash; /* Maps PangoFcFontsetKey -> PangoFcFontset */
GQueue *fontset_cache; /* Recently used fontsets */
+ GMutex fontset_cache_lock;
PHashTable *font_hash; /* Maps PangoFcFontKey -> PangoFcFont */
@@ -1081,6 +1082,9 @@ pango_fc_font_map_fini (PangoFcFontMap *fcfontmap)
g_queue_free (priv->fontset_cache);
priv->fontset_cache = NULL;
+ if (priv->fontset_cache_lock.p) /* Work around bug 686192 */
+ g_mutex_clear (&priv->fontset_cache_lock);
+
p_hash_table_destroy (priv->fontset_hash);
priv->fontset_hash = NULL;
@@ -1702,10 +1706,12 @@ pango_fc_fontset_cache (PangoFcFontset *fontset,
PangoFcFontMapPrivate *priv = fcfontmap->priv;
GQueue *cache = priv->fontset_cache;
+ g_mutex_lock (&priv->fontset_cache_lock);
+
if (fontset->cache_link)
{
if (fontset->cache_link == cache->head)
- return;
+ goto done;
/* Already in cache, move to head
*/
@@ -1730,6 +1736,9 @@ pango_fc_fontset_cache (PangoFcFontset *fontset,
}
g_queue_push_head_link (cache, fontset->cache_link);
+
+done:
+ g_mutex_unlock (&priv->fontset_cache_lock);
}
static PangoFontset *