diff --git a/ChangeLog b/ChangeLog index 96845f9d24..eadda49691 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-02-01 Julien Moutte + + * docs/gst/gstreamer-sections.txt: Add GST_CHECK_VERSION to the docs + * gst/gstindex.c: (gst_index_class_init), (gst_index_free_writer), + (gst_index_finalize), (gst_index_entry_free), + (gst_index_add_association): Fix memory leaks. + * gst/gstversion.h.in: Add GST_CHECK_VERSION macro. + * plugins/indexers/gstmemindex.c: (gst_mem_index_class_init), + (gst_mem_index_free_format), (gst_mem_index_free_id), + (gst_mem_index_finalize): Fix memory leaks. + * win32/common/config.h: Updated to CVS HEAD. + 2008-02-01 Stefan Kost * docs/README: diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 3fe399b9bf..ec703eb73c 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -2318,6 +2318,7 @@ GST_VERSION_MAJOR GST_VERSION_MINOR GST_VERSION_MICRO GST_VERSION_NANO +GST_CHECK_VERSION diff --git a/gst/gstindex.c b/gst/gstindex.c index 7b2a73dad0..d5f1c57030 100644 --- a/gst/gstindex.c +++ b/gst/gstindex.c @@ -56,6 +56,7 @@ enum static void gst_index_class_init (GstIndexClass * klass); static void gst_index_init (GstIndex * index); +static void gst_index_finalize (GObject * object); static void gst_index_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -171,6 +172,7 @@ gst_index_class_init (GstIndexClass * klass) gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_index_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_index_get_property); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_index_finalize); g_object_class_install_property (gobject_class, ARG_RESOLVER, g_param_spec_enum ("resolver", "Resolver", @@ -198,6 +200,34 @@ gst_index_init (GstIndex * index) GST_DEBUG ("created new index"); } +static void +gst_index_free_writer (gpointer key, gpointer value, gpointer user_data) +{ + GstIndexEntry *entry = (GstIndexEntry *) value; + + if (entry) { + gst_index_entry_free (entry); + } +} + +static void +gst_index_finalize (GObject * object) +{ + GstIndex *index = GST_INDEX (object); + + if (index->groups) { + g_list_foreach (index->groups, (GFunc) g_free, NULL); + g_list_free (index->groups); + index->groups = NULL; + } + + if (index->writers) { + g_hash_table_foreach (index->writers, gst_index_free_writer, NULL); + g_hash_table_destroy (index->writers); + index->writers = NULL; + } +} + static void gst_index_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -470,6 +500,33 @@ gst_index_entry_copy (GstIndexEntry * entry) void gst_index_entry_free (GstIndexEntry * entry) { + switch (entry->type) { + case GST_INDEX_ENTRY_ID: + if (entry->data.id.description) { + g_free (entry->data.id.description); + entry->data.id.description = NULL; + } + break; + case GST_INDEX_ENTRY_ASSOCIATION: + if (entry->data.assoc.assocs) { + g_free (entry->data.assoc.assocs); + entry->data.assoc.assocs = NULL; + } + break; + case GST_INDEX_ENTRY_OBJECT: + if (entry->data.object.key) { + g_free (entry->data.object.key); + entry->data.object.key = NULL; + } + break; + case GST_INDEX_ENTRY_FORMAT: + if (entry->data.format.key) { + g_free (entry->data.format.key); + entry->data.format.key = NULL; + } + break; + } + g_free (entry); } diff --git a/gst/gstversion.h.in b/gst/gstversion.h.in index c6dd5d3ff1..ab0992e9a1 100644 --- a/gst/gstversion.h.in +++ b/gst/gstversion.h.in @@ -66,6 +66,23 @@ G_BEGIN_DECLS */ #define GST_VERSION_NANO (@PACKAGE_VERSION_NANO@) +/** + * GST_CHECK_VERSION: + * @major: a number indicating the major version + * @minor: a number indicating the minor version + * @micro: a number indicating the micro version + * + * Check whether a GStreamer version equal to or greater than + * major.minor.micro is present. + * + * Since: 0.10.18 + */ +#define GST_CHECK_VERSION(major,minor,micro) \ + (GST_VERSION_MAJOR > (major) || \ + (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR > (minor)) || \ + (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR == (minor) && \ + GST_VERSION_MICRO >= (micro))) + G_END_DECLS #endif /* __GST_VERSION_H__ */ diff --git a/plugins/indexers/gstmemindex.c b/plugins/indexers/gstmemindex.c index adc2162691..3bdc80d0fa 100644 --- a/plugins/indexers/gstmemindex.c +++ b/plugins/indexers/gstmemindex.c @@ -107,7 +107,7 @@ enum static void gst_mem_index_class_init (GstMemIndexClass * klass); static void gst_mem_index_init (GstMemIndex * index); -static void gst_mem_index_dispose (GObject * object); +static void gst_mem_index_finalize (GObject * object); static void gst_mem_index_add_entry (GstIndex * index, GstIndexEntry * entry); static GstIndexEntry *gst_mem_index_get_assoc_entry (GstIndex * index, gint id, @@ -157,10 +157,11 @@ gst_mem_index_class_init (GstMemIndexClass * klass) parent_class = g_type_class_peek_parent (klass); - gobject_class->dispose = gst_mem_index_dispose; + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_mem_index_finalize); - gstindex_class->add_entry = gst_mem_index_add_entry; - gstindex_class->get_assoc_entry = gst_mem_index_get_assoc_entry; + gstindex_class->add_entry = GST_DEBUG_FUNCPTR (gst_mem_index_add_entry); + gstindex_class->get_assoc_entry = + GST_DEBUG_FUNCPTR (gst_mem_index_get_assoc_entry); } static void @@ -173,11 +174,52 @@ gst_mem_index_init (GstMemIndex * index) } static void -gst_mem_index_dispose (GObject * object) +gst_mem_index_free_format (gpointer key, gpointer value, gpointer user_data) { - //GstMemIndex *memindex = GST_MEM_INDEX (object); + GstMemIndexFormatIndex *index = (GstMemIndexFormatIndex *) value; - G_OBJECT_CLASS (parent_class)->dispose (object); + if (index->tree) { + g_tree_destroy (index->tree); + } + + g_free (index); +} + +static void +gst_mem_index_free_id (gpointer key, gpointer value, gpointer user_data) +{ + GstMemIndexId *id_index = (GstMemIndexId *) value; + + if (id_index->format_index) { + g_hash_table_foreach (id_index->format_index, gst_mem_index_free_format, + NULL); + g_hash_table_destroy (id_index->format_index); + id_index->format_index = NULL; + } + + g_free (id_index); +} + +static void +gst_mem_index_finalize (GObject * object) +{ + GstMemIndex *memindex = GST_MEM_INDEX (object); + + /* Delete the trees referencing the associations first */ + if (memindex->id_index) { + g_hash_table_foreach (memindex->id_index, gst_mem_index_free_id, NULL); + g_hash_table_destroy (memindex->id_index); + memindex->id_index = NULL; + } + + /* Then delete the associations themselves */ + if (memindex->associations) { + g_list_foreach (memindex->associations, (GFunc) gst_index_entry_free, NULL); + g_list_free (memindex->associations); + memindex->associations = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); } static void diff --git a/win32/common/config.h b/win32/common/config.h index 527130761d..2035c2b584 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -24,7 +24,7 @@ /* #undef GST_GCOV_ENABLED */ /* Default errorlevel to use */ -#define GST_LEVEL_DEFAULT GST_LEVEL_NONE +#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR /* GStreamer license */ #define GST_LICENSE "LGPL" @@ -33,7 +33,7 @@ #define GST_MAJORMINOR "0.10" /* package name in plugins */ -#define GST_PACKAGE_NAME "GStreamer source release" +#define GST_PACKAGE_NAME "GStreamer CVS/prerelease" /* package origin */ #define GST_PACKAGE_ORIGIN "Unknown package origin" @@ -197,13 +197,13 @@ #define PACKAGE_NAME "GStreamer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer 0.10.17" +#define PACKAGE_STRING "GStreamer 0.10.17.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gstreamer" /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.10.17" +#define PACKAGE_VERSION "0.10.17.1" /* Define the plugin directory */ #ifdef _DEBUG @@ -219,7 +219,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.17" +#define VERSION "0.10.17.1" /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */