From a872c41f791a62c99f0b2b59b34f303e270a7ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Sun, 10 Feb 2019 10:07:24 +0100 Subject: [PATCH] glglyphcache: Fix dropping caches unnecessarily The first set of glyphs is created with a timestamp of 1. Later we subtract the glyph timestamp from the cache timestamp, meaning we end up with numbers ending in 9, e.g. 59. Now unfortunately !(60 <= 59), so we do not end up incrasing the old_pixels count of the cache. Later we then call lookup() and DEcrease the old_pixels count, which makes the unsigned int wrap and cause a huge old_pixels value, which causes us to drop the cache. --- gsk/gl/gskglglyphcache.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index 655da906ab..44618a257c 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -288,7 +288,9 @@ gsk_gl_glyph_cache_lookup (GskGLGlyphCache *cache, if (value) { - if (cache->timestamp - value->timestamp >= MAX_AGE) + const guint age = cache->timestamp - value->timestamp; + + if (MAX_AGE <= age && age < MAX_AGE + CHECK_INTERVAL) { GskGLGlyphAtlas *atlas = value->atlas; @@ -363,16 +365,15 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) self->timestamp++; - if (self->timestamp % CHECK_INTERVAL != 0) + if ((self->timestamp - 1) % CHECK_INTERVAL != 0) return; /* look for glyphs that have grown old since last time */ g_hash_table_iter_init (&iter, self->hash_table); while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) { - guint age; + const guint age = self->timestamp - value->timestamp; - age = self->timestamp - value->timestamp; if (MAX_AGE <= age && age < MAX_AGE + CHECK_INTERVAL) { GskGLGlyphAtlas *atlas = value->atlas;