diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2012-10-15 21:07:59 -0500 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2012-11-07 10:59:04 -0800 |
commit | 8fe4d29b944e7cfcc9d7a998be9fbadcbe0c3fb9 (patch) | |
tree | 18169b2cf3e1d4ae32361b67022d5c52771a53ee | |
parent | 16169eec0dcb3d32ae456c5a16c82056e35dc28b (diff) | |
download | pango-8fe4d29b944e7cfcc9d7a998be9fbadcbe0c3fb9.tar.gz |
Make fontset cache threadsafe
I still see crashes in there though. Investigating.
-rw-r--r-- | pango/pangofc-fontmap.c | 11 |
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 * |