summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.patch96
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
+