[evince/gnome-3-12] libview: fixing memory leak



commit 86cfddae23cacfbb24469f1926cb965522bec6ca
Author: Giselle Reis <gisellemnr src gnome org>
Date:   Sat Aug 30 00:23:04 2014 +0200

    libview: fixing memory leak
    
    The memory leak was caused by a g_signal_connect
    which was never disconnected. This patch makes
    sure the signal is disconnected and the job is
    cancelled before creating another rendering job.
    It additionally introduces a helper function to
    cleanly finalize the job.

 libview/ev-pixbuf-cache.c |   43 +++++++++++++++++++++----------------------
 1 files changed, 21 insertions(+), 22 deletions(-)
---
diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c
index 897d3de..22170f9 100644
--- a/libview/ev-pixbuf-cache.c
+++ b/libview/ev-pixbuf-cache.c
@@ -161,20 +161,27 @@ ev_pixbuf_cache_finalize (GObject *object)
 }
 
 static void
+end_job (CacheJobInfo *job_info,
+        gpointer      data)
+{
+       g_signal_handlers_disconnect_by_func (job_info->job,
+                                             G_CALLBACK (job_finished_cb),
+                                             data);
+       ev_job_cancel (job_info->job);
+       g_object_unref (job_info->job);
+       job_info->job = NULL;
+}
+
+static void
 dispose_cache_job_info (CacheJobInfo *job_info,
                        gpointer      data)
 {
        if (job_info == NULL)
                return;
 
-       if (job_info->job) {
-               g_signal_handlers_disconnect_by_func (job_info->job,
-                                                     G_CALLBACK (job_finished_cb),
-                                                     data);
-               ev_job_cancel (job_info->job);
-               g_object_unref (job_info->job);
-               job_info->job = NULL;
-       }
+       if (job_info->job)
+               end_job (job_info, data);
+
        if (job_info->surface) {
                cairo_surface_destroy (job_info->surface);
                job_info->surface = NULL;
@@ -281,14 +288,8 @@ copy_job_to_job_info (EvJobRender   *job_render,
                job_info->points_set = TRUE;
        }
 
-       if (job_info->job) {
-               g_signal_handlers_disconnect_by_func (job_info->job,
-                                                     G_CALLBACK (job_finished_cb),
-                                                     pixbuf_cache);
-               ev_job_cancel (job_info->job);
-               g_object_unref (job_info->job);
-               job_info->job = NULL;
-       }
+       if (job_info->job)
+               end_job (job_info, pixbuf_cache);
 
        job_info->page_ready = TRUE;
 }
@@ -337,12 +338,7 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache,
            height == EV_JOB_RENDER (job_info->job)->target_height)
                return;
 
-       g_signal_handlers_disconnect_by_func (job_info->job,
-                                             G_CALLBACK (job_finished_cb),
-                                             pixbuf_cache);
-       ev_job_cancel (job_info->job);
-       g_object_unref (job_info->job);
-       job_info->job = NULL;
+       end_job (job_info, pixbuf_cache);
 }
 
 /* Do all function that copies a job from an older cache to it's position in the
@@ -651,6 +647,9 @@ add_job (EvPixbufCache  *pixbuf_cache,
                cairo_region_destroy (job_info->region);
        job_info->region = region ? cairo_region_reference (region) : NULL;
 
+       if (job_info->job)
+               end_job (job_info, pixbuf_cache);
+
        job_info->job = ev_job_render_new (pixbuf_cache->document,
                                           page, rotation, scale,
                                           width, height);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]