[librsvg] Plug a mem leak
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Plug a mem leak
- Date: Sat, 12 Nov 2011 01:03:04 +0000 (UTC)
commit 159331ba2e81a60ca8ed9080582b9d1ff210c012
Author: Christian Persch <chpe gnome org>
Date: Sat Nov 12 01:57:53 2011 +0100
Plug a mem leak
The entity hashtable was leaking the keys.
==10167== 6 bytes in 1 blocks are definitely lost in loss record 19 of 155
==10167== at 0x402AD89: malloc (vg_replace_malloc.c:236)
==10167== by 0x4566BDA: standard_malloc (gmem.c:85)
==10167== by 0x4566F80: g_malloc (gmem.c:159)
==10167== by 0x457C89A: g_strdup (gstrfuncs.c:351)
==10167== by 0x405774D: rsvg_entity_decl (rsvg-base.c:843)
rsvg-gobject.c | 42 +++++++++++++++++++++---------------------
1 files changed, 21 insertions(+), 21 deletions(-)
---
diff --git a/rsvg-gobject.c b/rsvg-gobject.c
index 16ecfdc..ba59d80 100644
--- a/rsvg-gobject.c
+++ b/rsvg-gobject.c
@@ -63,6 +63,23 @@ extern double rsvg_internal_dpi_y;
static GObjectClass *rsvg_parent_class = NULL;
static void
+rsvg_ctx_free_entity (xmlEntityPtr entval)
+{
+#if LIBXML_VERSION < 20700
+ /* key == entval->name, so it's implicitly freed below */
+
+ xmlFree ((xmlChar *) entval->name);
+ xmlFree ((xmlChar *) entval->ExternalID);
+ xmlFree ((xmlChar *) entval->SystemID);
+ xmlFree (entval->content);
+ xmlFree (entval->orig);
+ xmlFree (entval);
+#else
+ xmlFreeNode((xmlNode *) entval);
+#endif
+}
+
+static void
instance_init (RsvgHandle * self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, RSVG_TYPE_HANDLE, RsvgHandlePrivate);
@@ -70,7 +87,10 @@ instance_init (RsvgHandle * self)
self->priv->flags = RSVG_HANDLE_FLAGS_NONE;
self->priv->defs = rsvg_defs_new ();
self->priv->handler_nest = 0;
- self->priv->entities = g_hash_table_new (g_str_hash, g_str_equal);
+ self->priv->entities = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ g_free,
+ (GDestroyNotify) rsvg_ctx_free_entity);
self->priv->dpi_x = rsvg_internal_dpi_x;
self->priv->dpi_y = rsvg_internal_dpi_y;
@@ -92,25 +112,6 @@ instance_init (RsvgHandle * self)
}
static void
-rsvg_ctx_free_helper (gpointer key, gpointer value, gpointer user_data)
-{
- xmlEntityPtr entval = (xmlEntityPtr) value;
-
-#if LIBXML_VERSION < 20700
- /* key == entval->name, so it's implicitly freed below */
-
- xmlFree ((xmlChar *) entval->name);
- xmlFree ((xmlChar *) entval->ExternalID);
- xmlFree ((xmlChar *) entval->SystemID);
- xmlFree (entval->content);
- xmlFree (entval->orig);
- xmlFree (entval);
-#else
- xmlFreeNode((xmlNode *) entval);
-#endif
-}
-
-static void
instance_dispose (GObject * instance)
{
RsvgHandle *self = (RsvgHandle *) instance;
@@ -120,7 +121,6 @@ instance_dispose (GObject * instance)
self->priv->is_disposed = TRUE;
- g_hash_table_foreach (self->priv->entities, rsvg_ctx_free_helper, NULL);
g_hash_table_destroy (self->priv->entities);
rsvg_defs_free (self->priv->defs);
g_hash_table_destroy (self->priv->css_props);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]