[cairo] glyph caching bug

Keith Packard keithp at keithp.com
Tue Dec 28 12:11:15 PST 2004


Around 4 o'clock on Dec 29, TOKUNAGA Hiroyuki wrote:

> Attached patch is a tentative implementation of cache locking. While a
> cache is locked, lookup function doesn't call destroy_entry function. I
> could confirm that the bug doesn't occur if this patch was applied. But
> cache will consume much memory than restricted by cache->max_memory
> untill unlock function is called. It may be a problem.

Ah, that makes tremendous sense.  Xft has locking of this sort to prevent 
precisely this problem.

> +void
> +_cairo_cache_lock (cairo_cache_t *cache)
> +{
> +    cache->locked = 1;
> +}

Should this be a counting lock instead?  iow, should it read:

  _cairo_cache_lock (cairo_cache_t *cache) { ++cache->locked; }

This way multiple agents (possibly multiple threads) could request that 
the cache be locked.  Alternatively, should we lock individual cache 
elements?  That might be more complicated, but would avoid having the 
cache explode.  You would fetch a cache element, and then at some future 
point you would release it so that it could be destroyed.

Hmm.  Now I'm a bit confused -- it seems like the cache entries should be 
regenerated as needed; if destroyed, they should be recreated at each step 
in the process.  Is there some place in the system which assumes the cache 
entries are still valid across multiple cache fetches?

-keith


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/cairo/attachments/20041228/e7d0d7a0/attachment.pgp


More information about the cairo mailing list