[gnumeric] Borders: new leak printer at leak.



commit 8a9b6d52572215c666d0446bcde4c4ae48d7ee30
Author: Morten Welinder <terra gnome org>
Date:   Sat Mar 15 14:48:50 2014 -0400

    Borders: new leak printer at leak.

 ChangeLog          |    5 +++++
 src/libgnumeric.c  |    2 ++
 src/style-border.c |   28 +++++++++++++++++++++++++---
 src/style-border.h |    1 +
 4 files changed, 33 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 59a33ae..de8e2fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-15  Morten Welinder  <terra gnome org>
+
+       * src/style-border.c (gnm_border_shutdown): New function to help
+       debug leaks.
+
 2014-03-15  Jean Brefort  <jean brefort normalesup org>
 
        * src/item-grid.c (item_grid_realize), (cb_cursor_come_to_rest): move
diff --git a/src/libgnumeric.c b/src/libgnumeric.c
index b346deb..3b3c703 100644
--- a/src/libgnumeric.c
+++ b/src/libgnumeric.c
@@ -40,6 +40,7 @@
 #include "print-info.h"
 #include "style-font.h"
 #include "mstyle.h"
+#include "style-border.h"
 #include "style-color.h"
 #include "print.h"
 #include "dependent.h"
@@ -320,6 +321,7 @@ gnm_shutdown (void)
        value_shutdown ();
 
        gnm_font_shutdown ();
+       gnm_border_shutdown ();
        gnm_color_shutdown ();
        gnm_conf_shutdown ();
        gnm_style_shutdown ();
diff --git a/src/style-border.c b/src/style-border.c
index cc141b1..1a5eb5b 100644
--- a/src/style-border.c
+++ b/src/style-border.c
@@ -29,6 +29,7 @@
 #include "sheet-style.h"
 #include "sheet.h"
 #include <gdk/gdk.h>
+#include <string.h>
 
 struct LineDotPattern {
        const gint elements;
@@ -211,6 +212,7 @@ gnm_style_border_fetch (GnmStyleBorderType           line_type,
        }
 
        g_return_val_if_fail (color != NULL, NULL);
+       memset (&key, 0, sizeof (key));
        key.line_type = line_type;
        key.color = color;
 
@@ -225,9 +227,7 @@ gnm_style_border_fetch (GnmStyleBorderType           line_type,
                border_hash = g_hash_table_new (style_border_hash,
                                                style_border_equal);
 
-       border = g_new0 (GnmBorder, 1);
-       *border = key;
-       g_hash_table_insert (border_hash, border, border);
+       border = g_memdup (&key, sizeof (key));
        border->ref_count = 1;
        border->width = gnm_style_border_get_width (line_type);
        if (border->line_type == GNM_STYLE_BORDER_DOUBLE) {
@@ -237,6 +237,7 @@ gnm_style_border_fetch (GnmStyleBorderType           line_type,
                border->begin_margin = (border->width) > 1 ? 1 : 0;
                border->end_margin = (border->width) > 2 ? 1 : 0;
        }
+       g_hash_table_insert (border_hash, border, border);
 
        return border;
 }
@@ -316,6 +317,27 @@ gnm_style_border_unref (GnmBorder *border)
        g_free (border);
 }
 
+static void
+cb_border_leak (gpointer key, gpointer value, gpointer user_data)
+{
+       GnmBorder *border = value;
+
+       g_printerr ("Leaking style-border at %p [color=%p  line=%d].\n",
+                   (void *)border,
+                   border->color,
+                   border->line_type);
+}
+
+void
+gnm_border_shutdown (void)
+{
+       if (border_hash) {
+               g_hash_table_foreach (border_hash, cb_border_leak, NULL);
+               g_hash_table_destroy (border_hash);
+               border_hash = NULL;
+       }
+}
+
 GType
 gnm_border_get_type (void)
 {
diff --git a/src/style-border.h b/src/style-border.h
index 303d2dd..367669e 100644
--- a/src/style-border.h
+++ b/src/style-border.h
@@ -64,6 +64,7 @@ struct _GnmBorder {
        gint            ref_count;
 };
 
+void        gnm_border_shutdown (void);
 GType       gnm_border_get_type    (void);
 void       gnm_style_border_unref (GnmBorder *border);
 GnmBorder  *gnm_style_border_ref   (GnmBorder *border);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]