psppire-output-view: Fix memory leaks.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 30 Aug 2014 18:39:25 +0000 (11:39 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 30 Aug 2014 19:07:56 +0000 (12:07 -0700)
These memory leaks have been present for a long time, probably since
Cairo-based GUI output was introduced.

src/output/cairo.c
src/output/cairo.h
src/ui/gui/psppire-output-view.c

index e7fc7f931ecc2365e421abababad2361825dd249..1c03db84fb39b7f7db8271c8033a676b9bba3eed 100644 (file)
@@ -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)
 {
index 7ed828f515d61b24d7c5153cde9dc831dd7d44fe..cdd55369005364f1a69b303617b38727b713147f 100644 (file)
@@ -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);
index 77fa537dce3a9004d8d859f245e116ff51cd5532..3bf124469ea577cf712995163d4756ad064499aa 100644 (file)
@@ -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);
 }
 \f