[Xfce4-commits] <ristretto:master> Fix memory leaks

Stephan Arts noreply at xfce.org
Thu Oct 15 23:20:02 CEST 2009


Updating branch refs/heads/master
         to a8b0d38c4754b693e3821acdb4f7a5e24233e9e3 (commit)
       from 4cb99fa5451db6c56b203e8d8c7aead44d084d39 (commit)

commit a8b0d38c4754b693e3821acdb4f7a5e24233e9e3
Author: Stephan Arts <stephan at xfce.org>
Date:   Thu Oct 15 23:18:44 2009 +0200

    Fix memory leaks

 ChangeLog            |    9 +++++++++
 src/image.c          |    8 ++++++--
 src/image.h          |    2 +-
 src/image_cache.c    |   21 +++++++++++++--------
 src/image_cache.h    |    1 +
 src/picture_viewer.c |    4 +++-
 src/settings.c       |    2 +-
 7 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2d7108b..8010648 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2009-10-08  Stephan Arts <stephan at xfce.org>
 
+	* src/image.c,
+	  src/image.h,
+	  src/image_cache.h,
+	  src/image_cache.c: Fixed memory leak in image-cache
+	* src/picture_viewer.c: Fixed memory leak in paint function
+	* src/settings.c: Fix default setting for slideshow timeout
+
+2009-10-08  Stephan Arts <stephan at xfce.org>
+
 	* src/thumbnail_bar.c,
 	  src/thumbnail_bar.h: Change looks of the thumbnailbar
 
diff --git a/src/image.c b/src/image.c
index a6a9bb5..a1a83af 100644
--- a/src/image.c
+++ b/src/image.c
@@ -177,6 +177,7 @@ static void
 rstto_image_dispose (GObject *object)
 {
     RsttoImage *image = RSTTO_IMAGE (object);
+    RsttoImageCache *cache;
 
     if(image->priv->cancellable)
     {
@@ -214,6 +215,8 @@ rstto_image_dispose (GObject *object)
     {
         g_object_unref (image->priv->pixbuf);
         image->priv->pixbuf = NULL;
+        cache = rstto_image_cache_new ();
+        rstto_image_cache_pop_image (cache, image);
     }
 
     if (image->priv->buffer)
@@ -705,7 +708,7 @@ cb_rstto_image_update(RsttoImage *image)
     return TRUE;
 }
 
-guint
+guint64
 rstto_image_get_size (RsttoImage *image)
 {
     GdkPixbuf *pixbuf = rstto_image_get_pixbuf (image);
@@ -717,7 +720,8 @@ rstto_image_get_size (RsttoImage *image)
         /* multiplied by 2 since it is unclear why the nr of bytes
          * in memory is twice what is calculated here, based on the dimensions
          */
-        return rowstride * height * 2;
+        //return rowstride * height * 2;
+        return (guint64)rowstride * (guint64)height;
     }
     return 0;
 }
diff --git a/src/image.h b/src/image.h
index 50e91d0..2a996bd 100644
--- a/src/image.h
+++ b/src/image.h
@@ -83,7 +83,7 @@ GFile *rstto_image_get_file (RsttoImage *image);
 void rstto_image_unload (RsttoImage *image);
 gboolean rstto_image_load (RsttoImage *image, gboolean empty_cache, guint max_size, gboolean preload, GError **error);
 
-guint rstto_image_get_size (RsttoImage *image);
+guint64 rstto_image_get_size (RsttoImage *image);
 
 void
 rstto_image_set_orientation (RsttoImage *image, RsttoImageOrientation orientation);
diff --git a/src/image_cache.c b/src/image_cache.c
index a37cda0..f8b61f0 100644
--- a/src/image_cache.c
+++ b/src/image_cache.c
@@ -87,12 +87,22 @@ rstto_image_cache_class_init (GObjectClass *object_class)
 }
 
 gboolean
+rstto_image_cache_pop_image (RsttoImageCache *cache, RsttoImage *image)
+{
+    if (cache->cache_list)
+    {
+        rstto_image_unload (image);
+        cache->cache_list = g_list_remove_all (cache->cache_list, image);
+    }
+}
+
+gboolean
 rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolean last)
 {
     gboolean retval = FALSE;
     RsttoSettings *settings = rstto_settings_new();
     gboolean cache_enabled;
-    guint size = 0;
+    guint64 size = 0;
     guint cache_size = 0;
     RsttoImage *c_image;
     GList *iter = NULL;
@@ -107,8 +117,6 @@ rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolea
         cache->cache_list = g_list_remove_all (cache->cache_list, image);
     }
 
-    g_object_ref (image);
-
     if (last)
     {
         cache->cache_list = g_list_append (cache->cache_list, image);
@@ -128,7 +136,6 @@ rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolea
             c_image = g_list_last (cache->cache_list)->data;
             rstto_image_unload (c_image);
             cache->cache_list = g_list_remove (cache->cache_list, c_image);
-            g_object_unref (c_image);
             retval = TRUE;
         }
     }
@@ -140,22 +147,20 @@ rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolea
         for (iter = cache->cache_list->next; iter != NULL; iter = g_list_next (iter))
         {
             c_image = iter->data;
-            size += rstto_image_get_size (c_image);
-            if (size > (cache_size*1000000))
+            if (size > (guint64)(cache_size*1000000))
             {
                 rstto_image_unload (c_image);
                 cache->cache_list = g_list_remove (cache->cache_list, c_image);
-                g_object_unref (c_image);
                 iter = g_list_previous(iter);
                 retval = TRUE;
             } 
             else
             {
+                size = size + rstto_image_get_size (c_image);
                 if (rstto_image_get_size (c_image) == 0)
                 {
                     rstto_image_unload (c_image);
                     cache->cache_list = g_list_remove (cache->cache_list, c_image);
-                    g_object_unref (c_image);
                     iter = g_list_previous(iter);
                 }
             }
diff --git a/src/image_cache.h b/src/image_cache.h
index 01e1adc..15ef87d 100644
--- a/src/image_cache.h
+++ b/src/image_cache.h
@@ -49,6 +49,7 @@ GType rstto_image_cache_get_type (void);
 RsttoImageCache *rstto_image_cache_new ();
 
 gboolean rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolean last);
+gboolean rstto_image_cache_pop_image (RsttoImageCache *cache, RsttoImage *image);
 
 void rstto_image_cache_clear (RsttoImageCache *cache);
 
diff --git a/src/picture_viewer.c b/src/picture_viewer.c
index 6bbcafc..0eb1897 100644
--- a/src/picture_viewer.c
+++ b/src/picture_viewer.c
@@ -613,7 +613,9 @@ rstto_picture_viewer_paint (GtkWidget *widget)
             if (pixbuf)
             {
                 gdk_pixbuf_saturate_and_pixelate (pixbuf, pixbuf, 0, TRUE);
-                pixbuf = gdk_pixbuf_composite_color_simple (pixbuf, (size*0.8), (size*0.8), GDK_INTERP_BILINEAR, 40, 40, bg_color->pixel, bg_color->pixel);
+                GdkPixbuf *n_pixbuf = gdk_pixbuf_composite_color_simple (pixbuf, (size*0.8), (size*0.8), GDK_INTERP_BILINEAR, 40, 40, bg_color->pixel, bg_color->pixel);
+                g_object_unref (pixbuf);
+                pixbuf = n_pixbuf;
 
                 x1 = (widget->allocation.width-gdk_pixbuf_get_width(pixbuf))<0?0:(widget->allocation.width-gdk_pixbuf_get_width(pixbuf))/2;
                 y1 = (widget->allocation.height-gdk_pixbuf_get_height(pixbuf))<0?0:(widget->allocation.height-gdk_pixbuf_get_height(pixbuf))/2;
diff --git a/src/settings.c b/src/settings.c
index 1346732..f994c95 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -147,7 +147,7 @@ rstto_settings_init (GObject *object)
         accelmap_path = NULL;
     }
     
-    settings->priv->slideshow_timeout = 5000;
+    settings->priv->slideshow_timeout = 5;
     settings->priv->bgcolor = g_new0 (GdkColor, 1);
     settings->priv->bgcolor_fullscreen = g_new0 (GdkColor, 1);
     settings->priv->image_quality = 2000000;



More information about the Xfce4-commits mailing list