From e24fa634dd558ad28ad611740d981dbe146481ba Mon Sep 17 00:00:00 2001 From: Giselle Reis Date: Sat, 30 Aug 2014 00:23:04 +0200 Subject: 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. origin commit: https://gitlab.gnome.org/GNOME/evince/commit/939c434 --- libview/ev-pixbuf-cache.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) (limited to 'libview') diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 1b158265..b98e4560 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -161,6 +161,18 @@ ev_pixbuf_cache_finalize (GObject *object) G_OBJECT_CLASS (ev_pixbuf_cache_parent_class)->finalize (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) @@ -168,14 +180,9 @@ dispose_cache_job_info (CacheJobInfo *job_info, 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; @@ -298,14 +305,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; } @@ -358,12 +359,7 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache, 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 @@ -673,6 +669,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 * job_info->device_scale, -- cgit v1.2.1