[cairo] [PATCH] Fix a 'memory leak' in the image compositor

Bryce Harrington bryce at osg.samsung.com
Thu Jan 18 23:54:31 UTC 2018


On Sat, Jan 13, 2018 at 02:49:52PM +0100, Uli Schlachter wrote:
> There is a global pixman_glyph_cache_t instance that is initialized on
> first use and shows up in valgrind output as a relatively large leak (I
> think it was about 200 KiB). The reason for this is that this cache is
> not freed by cairo_debug_reset_static_data().
> 
> This commit wires up freeing the cache to
> cairo_debug_reset_static_data().
> 
> This cache was introduced in commit 615205cf0729 from 2012.
> 
> Signed-off-by: Uli Schlachter <psychon at znc.in>

Offhand looks good to me.  Have you run this against the test suite?

Acked-by: Bryce Harrington <bryce at osg.samsung.com>

> ---
>  src/cairo-debug.c            |  2 ++
>  src/cairo-image-compositor.c | 17 +++++++++++++++++
>  src/cairoint.h               |  3 +++
>  3 files changed, 22 insertions(+)
> 
> diff --git a/src/cairo-debug.c b/src/cairo-debug.c
> index 10933a673..6005060d4 100644
> --- a/src/cairo-debug.c
> +++ b/src/cairo-debug.c
> @@ -86,6 +86,8 @@ cairo_debug_reset_static_data (void)
>  
>      _cairo_image_reset_static_data ();
>  
> +    _cairo_image_compositor_reset_static_data ();
> +
>  #if CAIRO_HAS_DRM_SURFACE
>      _cairo_drm_device_reset_static_data ();
>  #endif
> diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c
> index 9f4e0adad..122a8ca42 100644
> --- a/src/cairo-image-compositor.c
> +++ b/src/cairo-image-compositor.c
> @@ -820,6 +820,18 @@ get_glyph_cache (void)
>      return global_glyph_cache;
>  }
>  
> +void
> +_cairo_image_compositor_reset_static_data (void)
> +{
> +    CAIRO_MUTEX_LOCK (_cairo_glyph_cache_mutex);
> +
> +    if (global_glyph_cache)
> +	pixman_glyph_cache_destroy (global_glyph_cache);
> +    global_glyph_cache = NULL;
> +
> +    CAIRO_MUTEX_UNLOCK (_cairo_glyph_cache_mutex);
> +}
> +
>  void
>  _cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font,
>  				cairo_scaled_glyph_t *scaled_glyph)
> @@ -945,6 +957,11 @@ out_unlock:
>      return status;
>  }
>  #else
> +void
> +_cairo_image_compositor_reset_static_data (void)
> +{
> +}
> +
>  void
>  _cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font,
>  				cairo_scaled_glyph_t *scaled_glyph)
> diff --git a/src/cairoint.h b/src/cairoint.h
> index 051e4f805..11f2c1eaf 100644
> --- a/src/cairoint.h
> +++ b/src/cairoint.h
> @@ -1586,6 +1586,9 @@ _cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font,
>  cairo_private void
>  _cairo_image_reset_static_data (void);
>  
> +cairo_private void
> +_cairo_image_compositor_reset_static_data (void);
> +
>  cairo_private cairo_surface_t *
>  _cairo_image_surface_create_with_pixman_format (unsigned char		*data,
>  						pixman_format_code_t	 pixman_format,
> -- 
> 2.15.1
> 
> -- 
> cairo mailing list
> cairo at cairographics.org
> https://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list