[sound-juicer/gnome-2-26] Bug 581775 – Leak or crash, depending on the metadata getter
- From: Bastien Nocera <hadess src gnome org>
- To: svn-commits-list gnome org
- Subject: [sound-juicer/gnome-2-26] Bug 581775 – Leak or crash, depending on the metadata getter
- Date: Thu, 7 May 2009 17:59:28 -0400 (EDT)
commit ec0c74195b7ade2ff010a737268e6c3b098f1348
Author: Bastien Nocera <hadess hadess net>
Date: Thu May 7 22:48:29 2009 +0100
Bug 581775 â?? Leak or crash, depending on the metadata getter
Clarify ownership of the GLists of albums, and don't keep an
unused cache in the GVFS backend.
---
libjuicer/sj-metadata-getter.c | 4 ++--
libjuicer/sj-metadata-gvfs.c | 29 ++++++++++++-----------------
2 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/libjuicer/sj-metadata-getter.c b/libjuicer/sj-metadata-getter.c
index 4a55ecd..9e5e6c9 100644
--- a/libjuicer/sj-metadata-getter.c
+++ b/libjuicer/sj-metadata-getter.c
@@ -22,6 +22,7 @@
#include <glib-object.h>
#include <glib/gi18n.h>
+#include "sj-structures.h"
#include "sj-metadata-getter.h"
#include "sj-metadata-marshal.h"
#include "sj-metadata.h"
@@ -155,11 +156,10 @@ sj_metadata_getter_set_proxy_port (SjMetadataGetter *mdg, const int proxy_port)
static gboolean
fire_signal_idle (SjMetadataGetterSignal *signal)
{
+ /* The callback is the sucker, and now owns the albums list */
g_signal_emit_by_name (G_OBJECT (signal->mdg), "metadata",
signal->albums, signal->error);
- /* This will kill the albums, as
- * those belong to the metadata backend */
if (signal->metadata)
g_object_unref (signal->metadata);
if (signal->error != NULL)
diff --git a/libjuicer/sj-metadata-gvfs.c b/libjuicer/sj-metadata-gvfs.c
index 4e34470..fc41d51 100644
--- a/libjuicer/sj-metadata-gvfs.c
+++ b/libjuicer/sj-metadata-gvfs.c
@@ -35,7 +35,6 @@
struct SjMetadataGvfsPrivate {
char *cdrom;
char *uri;
- GList *albums;
};
#define GET_PRIVATE(o) \
@@ -71,9 +70,10 @@ static GList *
gvfs_list_albums (SjMetadata *metadata, char **url, GError **error)
{
SjMetadataGvfsPrivate *priv;
+ GList *albums = NULL;
AlbumDetails *album;
GError *my_error = NULL;
- GFile *file;
+ GFile *file = NULL;
GFileInfo *info;
GFileEnumerator *e;
guint i = 0;
@@ -84,8 +84,7 @@ gvfs_list_albums (SjMetadata *metadata, char **url, GError **error)
if (priv->uri == NULL) {
g_set_error (error, SJ_ERROR, SJ_ERROR_INTERNAL_ERROR, _("Cannot access CD"));
- priv->albums = NULL;
- return NULL;
+ goto bail;
}
file = g_file_new_for_uri (priv->uri);
@@ -139,22 +138,21 @@ gvfs_list_albums (SjMetadata *metadata, char **url, GError **error)
}
g_object_unref (e);
- priv->albums = g_list_append (NULL, album);
+ albums = g_list_append (albums, album);
- return priv->albums;
+ return albums;
bail:
- g_object_unref (file);
- g_set_error (error, SJ_ERROR, SJ_ERROR_INTERNAL_ERROR, _("Cannot access CD: %s"), my_error->message);
- g_error_free (my_error);
- g_list_foreach (priv->albums, (GFunc)album_details_free, NULL);
- g_list_free (priv->albums);
- priv->albums = NULL;
+ if (file)
+ g_object_unref (file);
+ if (my_error) {
+ g_set_error (error, SJ_ERROR, SJ_ERROR_INTERNAL_ERROR, _("Cannot access CD: %s"), my_error->message);
+ g_error_free (my_error);
+ }
return NULL;
}
-
/**
* GObject methods
*/
@@ -192,8 +190,7 @@ sj_metadata_gvfs_set_property (GObject *object, guint property_id,
switch (property_id) {
case PROP_DEVICE:
- if (priv->cdrom)
- g_free (priv->cdrom);
+ g_free (priv->cdrom);
priv->cdrom = g_value_dup_string (value);
priv->uri = device_to_cdda_uri (priv->cdrom);
break;
@@ -212,8 +209,6 @@ sj_metadata_gvfs_finalize (GObject *object)
SjMetadataGvfsPrivate *priv = SJ_METADATA_GVFS (object)->priv;
g_free (priv->cdrom);
g_free (priv->uri);
- g_list_foreach (priv->albums, (GFunc)album_details_free, NULL);
- g_list_free (priv->albums);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]