diff options
Diffstat (limited to 'app-text/evince/files/evince-3.12.2-memory-leak.patch')
-rw-r--r-- | app-text/evince/files/evince-3.12.2-memory-leak.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/app-text/evince/files/evince-3.12.2-memory-leak.patch b/app-text/evince/files/evince-3.12.2-memory-leak.patch new file mode 100644 index 0000000..37b1f6d --- /dev/null +++ b/app-text/evince/files/evince-3.12.2-memory-leak.patch @@ -0,0 +1,96 @@ +From 86cfddae23cacfbb24469f1926cb965522bec6ca Mon Sep 17 00:00:00 2001 +From: Giselle Reis <gisellemnr@src.gnome.org> +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. + +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); +-- +cgit v0.10.1 + |