summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2012-10-15 21:25:15 -0500
committerBehdad Esfahbod <behdad@behdad.org>2012-11-07 10:59:04 -0800
commit1b705389d7c15f461ebf0460e2b08f982c482667 (patch)
treec3b41247c3a4cb7693371dd58e521d8f8161d8be
parent8fe4d29b944e7cfcc9d7a998be9fbadcbe0c3fb9 (diff)
downloadpango-1b705389d7c15f461ebf0460e2b08f982c482667.tar.gz
Make some pangofc hash caches really threadsafe
-rw-r--r--pango/pango-threadsafe.h14
-rw-r--r--pango/pangofc-fontmap.c17
2 files changed, 24 insertions, 7 deletions
diff --git a/pango/pango-threadsafe.h b/pango/pango-threadsafe.h
index bc180746..cf8b4258 100644
--- a/pango/pango-threadsafe.h
+++ b/pango/pango-threadsafe.h
@@ -117,6 +117,20 @@ gpointer p_hash_table_lookup (PHashTable *hash_table,
}
static inline
+gpointer p_hash_table_lookup_ref (PHashTable *hash_table,
+ gconstpointer key,
+ gpointer (*ref_func) (gpointer))
+{
+ gpointer ret;
+ g_mutex_lock (&hash_table->mx);
+ ret = g_hash_table_lookup (hash_table->ht, key);
+ if (ret)
+ ref_func (ret);
+ g_mutex_unlock (&hash_table->mx);
+ return ret;
+}
+
+static inline
void p_hash_table_foreach (PHashTable *hash_table,
GHFunc func,
gpointer user_data)
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 84f2b94f..2e031a82 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -689,9 +689,9 @@ pango_fc_patterns_new (FcPattern *pat, PangoFcFontMap *fontmap)
PangoFcPatterns *pats;
pat = uniquify_pattern (fontmap, pat);
- pats = p_hash_table_lookup (fontmap->priv->patterns_hash, pat);
+ pats = p_hash_table_lookup_ref (fontmap->priv->patterns_hash, pat, pango_fc_patterns_ref);
if (pats)
- return pango_fc_patterns_ref (pats);
+ return pats;
pats = g_slice_new0 (PangoFcPatterns);
@@ -1218,6 +1218,7 @@ pango_fc_font_map_add (PangoFcFontMap *fcfontmap,
key_copy = pango_fc_font_key_copy (key);
_pango_fc_font_set_font_key (fcfont, key_copy);
+ /* XXXXXXXXXXX racy here? */
p_hash_table_insert (priv->font_hash, key_copy, fcfont);
}
@@ -1508,6 +1509,7 @@ uniquify_pattern (PangoFcFontMap *fcfontmap,
PangoFcFontMapPrivate *priv = fcfontmap->priv;
FcPattern *old_pattern;
+ /* XXXXXX racy here? */
old_pattern = p_hash_table_lookup (priv->pattern_hash, pattern);
if (old_pattern)
{
@@ -1539,9 +1541,9 @@ pango_fc_font_map_new_font (PangoFcFontMap *fcfontmap,
pango_fc_font_key_init (&key, fcfontmap, fontset_key, match);
- fcfont = p_hash_table_lookup (priv->font_hash, &key);
+ fcfont = p_hash_table_lookup_ref (priv->font_hash, &key, g_object_ref);
if (fcfont)
- return g_object_ref (fcfont);
+ return fcfont;
class = PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap);
@@ -1754,7 +1756,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
pango_fc_fontset_key_init (&key, fcfontmap, context, desc, language);
- fontset = p_hash_table_lookup (priv->fontset_hash, &key);
+ fontset = p_hash_table_lookup_ref (priv->fontset_hash, &key, g_object_ref);
if (G_UNLIKELY (!fontset))
{
@@ -1764,7 +1766,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
return NULL;
fontset = pango_fc_fontset_new (&key, patterns);
- p_hash_table_insert (priv->fontset_hash, pango_fc_fontset_get_key (fontset), fontset);
+ p_hash_table_insert (priv->fontset_hash, pango_fc_fontset_get_key (fontset), g_object_ref (fontset));
pango_fc_patterns_unref (patterns);
}
@@ -1773,7 +1775,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
pango_font_description_free (key.desc);
- return g_object_ref (fontset);
+ return fontset;
}
/**
@@ -1812,6 +1814,7 @@ pango_fc_font_map_get_font_face_data (PangoFcFontMap *fcfontmap,
if (FcPatternGetInteger (font_pattern, FC_INDEX, 0, &key.id) != FcResultMatch)
return NULL;
+ /* XXXXXXXXXX racy here */
data = p_hash_table_lookup (priv->font_face_data_hash, &key);
if (G_LIKELY (data))
return data;