diff options
author | Giselle Reis <[email protected]> | 2014-08-30 00:23:04 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2019-12-08 19:13:58 +0100 |
commit | e24fa634dd558ad28ad611740d981dbe146481ba (patch) | |
tree | 1076d040a4a8c973f4bbf2045dbd039bd63844b4 /libview | |
parent | 28e0f6ae87ecb9400c0b2b026b708ed99202458c (diff) | |
download | atril-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
Diffstat (limited to 'libview')
-rw-r--r-- | 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 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, |