[libgda] GdaDataHandler: fix memory leak at create default for type
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] GdaDataHandler: fix memory leak at create default for type
- Date: Tue, 23 Apr 2019 15:16:49 +0000 (UTC)
commit 7386defea969dccd7ea071847127d4ae35295edb
Author: Daniel Espinosa <esodan gmail com>
Date: Tue Apr 23 08:26:44 2019 -0500
GdaDataHandler: fix memory leak at create default for type
libgda/gda-data-handler.c | 92 +++++++++++++++++++++++------------------------
libgda/gda-holder.c | 4 ++-
2 files changed, 49 insertions(+), 47 deletions(-)
---
diff --git a/libgda/gda-data-handler.c b/libgda/gda-data-handler.c
index 3fb265140..1caae4006 100644
--- a/libgda/gda-data-handler.c
+++ b/libgda/gda-data-handler.c
@@ -241,18 +241,6 @@ gda_data_handler_get_descr (GdaDataHandler *dh)
return NULL;
}
-static guint
-gtype_hash (gconstpointer key)
-{
- return GPOINTER_TO_UINT (key);
-}
-
-static gboolean
-gtype_equal (gconstpointer a, gconstpointer b)
-{
- return (GType) a == (GType) b ? TRUE : FALSE;
-}
-
/**
* gda_data_handler_get_default:
* @for_type: a #GType type
@@ -263,47 +251,59 @@ gtype_equal (gconstpointer a, gconstpointer b)
*
* The returned pointer is %NULL if there is no default data handler available for the @for_type data type
*
- * Returns: (transfer none): a #GdaDataHandler which must not be modified or destroyed.
+ * Returns: (transfer full): a #GdaDataHandler which must not be modified or destroyed.
*
* Since: 4.2.3
*/
GdaDataHandler *
gda_data_handler_get_default (GType for_type)
{
- static GMutex mutex;
- static GHashTable *hash = NULL;
GdaDataHandler *dh;
- g_mutex_lock (&mutex);
- if (!hash) {
- hash = g_hash_table_new_full (gtype_hash, gtype_equal,
- NULL, (GDestroyNotify) g_object_unref);
-
- g_hash_table_insert (hash, (gpointer) G_TYPE_INT64, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_UINT64, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_BINARY, gda_handler_bin_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_BLOB, gda_handler_bin_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_BOOLEAN, gda_handler_boolean_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_DATE, gda_handler_time_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_DOUBLE, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_INT, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_NUMERIC, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_FLOAT, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_SHORT, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_USHORT, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_STRING, gda_handler_string_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_TEXT, gda_handler_text_new ());
- g_hash_table_insert (hash, (gpointer) GDA_TYPE_TIME, gda_handler_time_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_DATE_TIME, gda_handler_time_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_CHAR, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_UCHAR, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_ULONG, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_LONG, gda_handler_numerical_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_GTYPE, gda_handler_type_new ());
- g_hash_table_insert (hash, (gpointer) G_TYPE_UINT, gda_handler_numerical_new ());
- }
- g_mutex_unlock (&mutex);
-
- dh = g_hash_table_lookup (hash, (gpointer) for_type);
+ if (for_type == G_TYPE_INT64) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_UINT64) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == GDA_TYPE_BINARY) {
+ dh = gda_handler_bin_new ();
+ } else if (for_type == GDA_TYPE_BLOB) {
+ dh = gda_handler_bin_new ();
+ } else if (for_type == G_TYPE_BOOLEAN) {
+ dh = gda_handler_boolean_new ();
+ } else if (for_type == G_TYPE_DATE) {
+ dh = gda_handler_time_new ();
+ } else if (for_type == G_TYPE_DOUBLE) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_INT) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == GDA_TYPE_NUMERIC) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_FLOAT) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == GDA_TYPE_SHORT) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == GDA_TYPE_USHORT) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_STRING) {
+ dh = gda_handler_string_new ();
+ } else if (for_type == GDA_TYPE_TEXT) {
+ dh = gda_handler_text_new ();
+ } else if (for_type == GDA_TYPE_TIME) {
+ dh = gda_handler_time_new ();
+ } else if (for_type == G_TYPE_DATE_TIME) {
+ dh = gda_handler_time_new ();
+ } else if (for_type == G_TYPE_CHAR) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_UCHAR) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_ULONG) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_LONG) {
+ dh = gda_handler_numerical_new ();
+ } else if (for_type == G_TYPE_GTYPE) {
+ dh = gda_handler_type_new ();
+ } else if (for_type == G_TYPE_UINT) {
+ dh = gda_handler_numerical_new ();
+ }
return dh;
}
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index 7a11ea05c..0a694246a 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -923,8 +923,10 @@ gda_holder_set_value_str (GdaHolder *holder, GdaDataHandler *dh, const gchar *va
gda_holder_lock ((GdaLockable*) holder);
if (!dh)
dh = gda_data_handler_get_default (priv->g_type);
- if (dh)
+ if (dh) {
gdaval = gda_data_handler_get_value_from_str (dh, value, priv->g_type);
+ g_object_unref (dh);
+ }
if (gdaval)
retval = real_gda_holder_set_value (holder, gdaval, FALSE, error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]