summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiselle Reis <[email protected]>2014-08-30 00:23:04 +0200
committerraveit65 <[email protected]>2019-12-08 19:13:58 +0100
commite24fa634dd558ad28ad611740d981dbe146481ba (patch)
tree1076d040a4a8c973f4bbf2045dbd039bd63844b4
parent28e0f6ae87ecb9400c0b2b026b708ed99202458c (diff)
downloadatril-e24fa634dd558ad28ad611740d981dbe146481ba.tar.bz2
atril-e24fa634dd558ad28ad611740d981dbe146481ba.tar.xz
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
-rw-r--r--libview/ev-pixbuf-cache.c43
1 files changed, 21 insertions, 22 deletions
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
@@ -162,20 +162,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;
@@ -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,