From 8e4a0daa2b60e5ebf6fa4ff83ad98d78a8de0dff Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 30 Aug 2014 11:39:25 -0700 Subject: [PATCH] psppire-output-view: Fix memory leaks. These memory leaks have been present for a long time, probably since Cairo-based GUI output was introduced. --- src/output/cairo.c | 11 +++++++++++ src/output/cairo.h | 3 ++- src/ui/gui/psppire-output-view.c | 11 ++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/output/cairo.c b/src/output/cairo.c index e7fc7f931e..1c03db84fb 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -1297,6 +1297,17 @@ xr_rendering_create (struct xr_driver *xr, const struct output_item *item, return r; } +void +xr_rendering_destroy (struct xr_rendering *r) +{ + if (r) + { + output_item_unref (r->item); + render_page_unref (r->page); + free (r); + } +} + void xr_rendering_measure (struct xr_rendering *r, int *w, int *h) { diff --git a/src/output/cairo.h b/src/output/cairo.h index 7ed828f515..cdd5536900 100644 --- a/src/output/cairo.h +++ b/src/output/cairo.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2009, 2010, 2014 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,6 +38,7 @@ void xr_driver_destroy (struct xr_driver *); struct xr_rendering *xr_rendering_create (struct xr_driver *, const struct output_item *, cairo_t *); +void xr_rendering_destroy (struct xr_rendering *); void xr_rendering_apply_options (struct xr_rendering *, struct string_map *o); void xr_rendering_measure (struct xr_rendering *, int *w, int *h); diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index 77fa537dce..3bf124469e 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -117,6 +117,13 @@ expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) return TRUE; } +static void +free_rendering (gpointer rendering_) +{ + struct xr_rendering *rendering = rendering_; + xr_rendering_destroy (rendering); +} + void psppire_output_view_put (struct psppire_output_view *view, const struct output_item *item) @@ -209,7 +216,7 @@ psppire_output_view_put (struct psppire_output_view *view, drawing_area = gtk_drawing_area_new (); - g_object_set_data (G_OBJECT (drawing_area), "rendering", r); + g_object_set_data_full (G_OBJECT (drawing_area), "rendering", r, free_rendering); g_signal_connect (drawing_area, "realize", G_CALLBACK (on_dwgarea_realize), view); g_signal_connect (drawing_area, "expose_event", @@ -606,6 +613,8 @@ psppire_output_view_destroy (struct psppire_output_view *view) if (view->print_settings != NULL) g_object_unref (view->print_settings); + xr_driver_destroy (view->xr); + free (view); } -- 2.30.2