[libgda] Removed GdaMutex, replaced by GRecMutex



commit 24232161b9f7b4571d44a9afc09df447b0b534da
Author: Vivien Malerba <malerba gnome-db org>
Date:   Tue May 20 21:15:15 2014 +0200

    Removed GdaMutex, replaced by GRecMutex

 doc/C/libgda-6.0-docs.sgml                 |    1 -
 doc/C/libgda-sections.txt                  |   11 --
 doc/C/migration4.xml                       |   14 ++-
 libgda/Makefile.am                         |    2 -
 libgda/gda-attributes-manager.c            |   57 ++++----
 libgda/gda-connection.c                    |    1 -
 libgda/gda-data-proxy.c                    |  186 +++++++++++++-------------
 libgda/gda-holder.c                        |   15 +-
 libgda/gda-lockable.h                      |    2 +-
 libgda/gda-meta-store.c                    |  147 ++++++++++----------
 libgda/gda-mutex.c                         |  126 -----------------
 libgda/gda-mutex.h                         |   63 ---------
 libgda/libgda.h.in                         |    2 -
 libgda/libgda.symbols                      |    5 -
 libgda/sql-parser/gda-sql-parser-private.h |    9 +-
 libgda/sql-parser/gda-sql-parser.c         |   24 ++--
 providers/web/gda-web-provider.c           |   12 +-
 providers/web/gda-web-util.c               |   71 +++++-----
 providers/web/gda-web.h                    |    3 +-
 tests/multi-threading/Makefile.am          |    9 +-
 tests/multi-threading/check_mutex.c        |  205 ----------------------------
 tests/multi-threading/check_parser.c       |   16 +-
 22 files changed, 278 insertions(+), 703 deletions(-)
---
diff --git a/doc/C/libgda-6.0-docs.sgml b/doc/C/libgda-6.0-docs.sgml
index 49c2bb2..e4fba7a 100644
--- a/doc/C/libgda-6.0-docs.sgml
+++ b/doc/C/libgda-6.0-docs.sgml
@@ -1114,7 +1114,6 @@ g_object_unref (store);
 
     <chapter id="multi-threading">
       <title>Multi threading</title>
-      <xi:include href="xml/gda-mutex.xml"/>
       <xi:include href="xml/gda-lockable.xml"/>
       <xi:include href="xml/gda-worker.xml"/>
     </chapter>
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index 8f287b5..0bebbe8 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -760,17 +760,6 @@ gda_vconnection_hub_get_type
 </SECTION>
 
 <SECTION>
-<FILE>gda-mutex</FILE>
-<TITLE>GdaMutex</TITLE>
-GdaMutex
-gda_mutex_new
-gda_mutex_lock
-gda_mutex_trylock
-gda_mutex_unlock
-gda_mutex_free
-</SECTION>
-
-<SECTION>
 <FILE>gda-xa-transaction</FILE>
 <TITLE>GdaXaTransaction</TITLE>
 GdaXaTransaction
diff --git a/doc/C/migration4.xml b/doc/C/migration4.xml
index 8581221..f0a98dc 100644
--- a/doc/C/migration4.xml
+++ b/doc/C/migration4.xml
@@ -72,7 +72,7 @@
     </para>
     </sect2>
 
-    <sect2><title>API changes</title>
+    <sect2 id="migration-4-cnc-api-changes"><title>API changes</title>
     <para>
       This section documents most of the API changes for the <link 
linkend="GdaConnection">GdaConnection</link> object.
       <itemizedlist>
@@ -86,15 +86,19 @@
         <listitem><para>The gda_connection_internal_get_provider_data() has been replaced by
        <link 
linkend="gda-connection-internal-get-provider-data-error">gda_connection_internal_get_provider_data_error</link>()</para></listitem>
         <listitem><para>The <link 
linkend="gda-server-operation-get-sql-identifier-at">gda_server_operation_get_sql_identifier_at()</link> and 
<link 
linkend="gda-server-operation-get-sql-identifier-at-path">gda_server_operation_get_sql_identifier_at_path()</link>
 now have an extra argument for errors</para></listitem>
-        <listitem><para>The </para></listitem>
-        <listitem><para>The </para></listitem>
-        <listitem><para>The </para></listitem>
-        <listitem><para>The </para></listitem>
       </itemizedlist>
     </para>
     </sect2>
   </sect1>
 
+  <sect1><title>API changes</title>
+    <para>Version 6.0 introduced some API changes which are listed below and in the section about
+    <link linkend="migration-4-cnc-api-changes">GdaConnection's API changes</link>.
+    <itemizedlist>
+      <listitem><para>GdaMutex has been removed, being redundant with GRecMutex</para></listitem>
+    </itemizedlist>
+    </para>
+  </sect1>
 
   <sect1><title>Multi threading and asynchronicity</title>
   <para>
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index 26ca0c4..06264dc 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -84,7 +84,6 @@ gda_headers = \
        gda-log.h \
        gda-meta-store.h \
        gda-meta-struct.h \
-       gda-mutex.h \
        gda-quark-list.h \
        gda-repetitive-statement.h \
        gda-row.h \
@@ -186,7 +185,6 @@ libgda_sources =  \
        gda-meta-store-extra.h \
        gda-meta-struct-private.h \
        gda-marshal.c \
-       gda-mutex.c \
        gda-server-operation-private.h \
        gda-types.c \
        gda-types.h \
diff --git a/libgda/gda-attributes-manager.c b/libgda/gda-attributes-manager.c
index 0a8d8c3..a129932 100644
--- a/libgda/gda-attributes-manager.c
+++ b/libgda/gda-attributes-manager.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
  * Copyright (C) 2010 Jonh Wendell <jwendell gnome org>
  * Copyright (C) 2012 Daniel Espinosa <despinosa src gnome org>
@@ -23,7 +23,6 @@
 #include <string.h>
 #include <gda-attributes-manager.h>
 #include <gda-value.h>
-#include <gda-mutex.h>
 
 /*
  * Structure for the attribute names
@@ -49,7 +48,7 @@ static void objattrs_unref (ObjAttrs *attrs);
 
 
 struct _GdaAttributesManager {
-       GdaMutex                   *mutex;
+       GRecMutex                   mutex;
        gboolean                    for_objects; /* TRUE if key->data are GObjects */
        GdaAttributesManagerSignal  signal_func;
        gpointer                    signal_data;
@@ -107,7 +106,7 @@ gda_attributes_manager_new (gboolean for_objects, GdaAttributesManagerSignal sig
        GdaAttributesManager *mgr;
 
        mgr = g_new0 (GdaAttributesManager, 1);
-       mgr->mutex = gda_mutex_new  ();
+       g_rec_mutex_init (& (mgr->mutex));
        mgr->obj_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL,
                                               (GDestroyNotify) objattrs_unref);
        mgr->for_objects = for_objects;
@@ -120,16 +119,16 @@ gda_attributes_manager_new (gboolean for_objects, GdaAttributesManagerSignal sig
 static void
 obj_destroyed_cb (ObjAttrs *attrs, GObject *where_the_object_was)
 {
-       GdaMutex *mutex;
+       GRecMutex *mutex;
 
        /* rem: we need to keep a pointer to mutex because attrs may be destroyed
         * in g_hash_table_remove */
-       mutex = attrs->mgr->mutex;
+       mutex = & (attrs->mgr->mutex);
 
-       gda_mutex_lock (mutex);
+       g_rec_mutex_lock (mutex);
        attrs->objects = g_slist_remove (attrs->objects, where_the_object_was);
        g_hash_table_remove (attrs->mgr->obj_hash, where_the_object_was);
-       gda_mutex_unlock (mutex);
+       g_rec_mutex_unlock (mutex);
 }
 
 static void
@@ -150,14 +149,14 @@ foreach_destroy_func (gpointer ptr, ObjAttrs *attrs, GdaAttributesManager *mgr)
 void
 gda_attributes_manager_free (GdaAttributesManager *mgr)
 {
-       GdaMutex *mutex;
-       mutex = mgr->mutex;
-       gda_mutex_lock (mutex);
+       GRecMutex *mutex;
+       mutex = &(mgr->mutex);
+       g_rec_mutex_lock (mutex);
        g_hash_table_foreach (mgr->obj_hash, (GHFunc) foreach_destroy_func, mgr);
        g_hash_table_destroy (mgr->obj_hash);
        g_free (mgr);
-       gda_mutex_unlock (mutex);
-       gda_mutex_free (mutex);
+       g_rec_mutex_unlock (mutex);
+       g_rec_mutex_clear (mutex);
 }
 
 typedef struct {
@@ -178,7 +177,7 @@ manager_real_set (GdaAttributesManager *mgr, gpointer ptr,
        if (mgr->for_objects) 
                g_return_if_fail (G_IS_OBJECT (ptr));
        
-       gda_mutex_lock (mgr->mutex);
+       g_rec_mutex_lock (& (mgr->mutex));
 
        /* pick up the correct ObjAttrs */
        objattrs = g_hash_table_lookup (mgr->obj_hash, ptr);
@@ -242,7 +241,7 @@ manager_real_set (GdaAttributesManager *mgr, gpointer ptr,
        if (mgr->signal_func && mgr->for_objects)
                mgr->signal_func ((GObject*) ptr, att_name, value, mgr->signal_data);
 
-       gda_mutex_unlock (mgr->mutex);
+       g_rec_mutex_unlock (& (mgr->mutex));
 }
 
 /**
@@ -302,7 +301,7 @@ gda_attributes_manager_get (GdaAttributesManager *mgr, gpointer ptr, const gchar
        ObjAttrs *objattrs;
        const GValue *cvalue = NULL;
 
-       gda_mutex_lock (mgr->mutex);
+       g_rec_mutex_lock (& (mgr->mutex));
 
        objattrs = g_hash_table_lookup (mgr->obj_hash, ptr);
        if (objattrs) {
@@ -311,7 +310,7 @@ gda_attributes_manager_get (GdaAttributesManager *mgr, gpointer ptr, const gchar
                cvalue = g_hash_table_lookup (objattrs->values_hash, &attname);
        }
 
-       gda_mutex_unlock (mgr->mutex);
+       g_rec_mutex_unlock (& (mgr->mutex));
        return cvalue;
 }
 
@@ -331,13 +330,13 @@ gda_attributes_manager_copy (GdaAttributesManager *from_mgr, gpointer *from,
 {
        ObjAttrs *from_objattrs, *to_objattrs;
 
-       gda_mutex_lock (from_mgr->mutex);
-       gda_mutex_lock (to_mgr->mutex);
+       g_rec_mutex_lock (& (from_mgr->mutex));
+       g_rec_mutex_lock (& (to_mgr->mutex));
 
        from_objattrs = g_hash_table_lookup (from_mgr->obj_hash, from);
        if (!from_objattrs) {
-               gda_mutex_unlock (from_mgr->mutex);
-               gda_mutex_unlock (to_mgr->mutex);
+               g_rec_mutex_unlock (& (to_mgr->mutex));
+               g_rec_mutex_unlock (& (from_mgr->mutex));
                return;
        }
 
@@ -350,8 +349,8 @@ gda_attributes_manager_copy (GdaAttributesManager *from_mgr, gpointer *from,
                if (from_mgr->for_objects) 
                        g_object_weak_ref (G_OBJECT (to), (GWeakNotify) obj_destroyed_cb, from_objattrs);
 
-               gda_mutex_unlock (from_mgr->mutex);
-               gda_mutex_unlock (to_mgr->mutex);
+               g_rec_mutex_unlock (& (to_mgr->mutex));
+               g_rec_mutex_unlock (& (from_mgr->mutex));
                return;
        }
 
@@ -361,8 +360,8 @@ gda_attributes_manager_copy (GdaAttributesManager *from_mgr, gpointer *from,
        cdata.ptr = to;
        g_hash_table_foreach (from_objattrs->values_hash, (GHFunc) foreach_copy_func, &cdata);
 
-       gda_mutex_unlock (from_mgr->mutex);
-       gda_mutex_unlock (to_mgr->mutex);
+       g_rec_mutex_unlock (& (to_mgr->mutex));
+       g_rec_mutex_unlock (& (from_mgr->mutex));
 }
 
 static void
@@ -386,7 +385,7 @@ gda_attributes_manager_clear (GdaAttributesManager *mgr, gpointer ptr)
 {
        ObjAttrs *objattrs;
 
-       gda_mutex_lock (mgr->mutex);
+       g_rec_mutex_lock (& (mgr->mutex));
 
        objattrs = g_hash_table_lookup (mgr->obj_hash, ptr);
        if (objattrs) {
@@ -394,7 +393,7 @@ gda_attributes_manager_clear (GdaAttributesManager *mgr, gpointer ptr)
                g_hash_table_remove (mgr->obj_hash, ptr);
        }
 
-       gda_mutex_unlock (mgr->mutex);
+       g_rec_mutex_unlock (& (mgr->mutex));
 }
 
 typedef struct {
@@ -421,7 +420,7 @@ gda_attributes_manager_foreach (GdaAttributesManager *mgr, gpointer ptr,
        g_return_if_fail (func);
        g_return_if_fail (ptr);
 
-       gda_mutex_lock (mgr->mutex);
+       g_rec_mutex_lock (& (mgr->mutex));
 
        objattrs = g_hash_table_lookup (mgr->obj_hash, ptr);
        if (objattrs) {
@@ -432,7 +431,7 @@ gda_attributes_manager_foreach (GdaAttributesManager *mgr, gpointer ptr,
                g_hash_table_foreach (objattrs->values_hash, (GHFunc) foreach_foreach_func, &fdata);
        }
 
-       gda_mutex_unlock (mgr->mutex);
+       g_rec_mutex_unlock (& (mgr->mutex));
 }
 
 static void
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index c0cedee..ad80c42 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -62,7 +62,6 @@
 #include <sql-parser/gda-statement-struct-trans.h>
 #include <libgda/gda-meta-store-extra.h>
 #include <libgda/gda-util.h>
-#include <libgda/gda-mutex.h>
 #include <libgda/gda-lockable.h>
 #include <libgda/gda-repetitive-statement.h>
 #include <gda-statement-priv.h>
diff --git a/libgda/gda-data-proxy.c b/libgda/gda-data-proxy.c
index a29ecec..66453bc 100644
--- a/libgda/gda-data-proxy.c
+++ b/libgda/gda-data-proxy.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 - 2011 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2006 - 2012 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2006 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2007 Armin Burgmeier <arminb src gnome org>
  * Copyright (C) 2007 Leonardo Boshell <lb kmc com co>
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
@@ -46,7 +46,6 @@
 #include <sql-parser/gda-statement-struct-util.h>
 #include <libgda/gda-custom-marshal.h>
 #include <libgda/gda-types.h>
-#include <gda-mutex.h>
 
 /*
  * Main static functions
@@ -202,7 +201,7 @@ static void          display_chunk_free (DisplayChunk *chunk);
  */
 struct _GdaDataProxyPrivate
 {
-       GdaMutex          *mutex;
+       GRecMutex          mutex;
 
        GdaDataModel      *model; /* Gda model which is proxied */
 
@@ -765,8 +764,9 @@ gda_data_proxy_data_model_init (GdaDataModelIface *iface)
 static void
 do_init (GdaDataProxy *proxy)
 {
-       if (!proxy->priv->mutex)
-               proxy->priv->mutex = gda_mutex_new ();
+       g_rec_mutex_init (& (proxy->priv->mutex)); /* REM: make sure clean_proxy() is called first because
+                                                   * we must not call g_rec_mutex_init() on an already 
initialized
+                                                   * GRecMutex, see doc. */
 
        proxy->priv->modify_rows = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, NULL);
        proxy->priv->notify_changes = TRUE;
@@ -925,6 +925,8 @@ clean_proxy (GdaDataProxy *proxy)
                g_free (proxy->priv->columns_attrs);
                proxy->priv->columns_attrs = NULL;
        }
+
+       g_rec_mutex_clear (& (proxy->priv->mutex));
 }
 
 static void
@@ -937,10 +939,6 @@ gda_data_proxy_dispose (GObject *object)
        proxy = GDA_DATA_PROXY (object);
        if (proxy->priv) {
                clean_proxy (proxy);
-               if (proxy->priv->mutex) {
-                       gda_mutex_free (proxy->priv->mutex);
-                       proxy->priv->mutex = NULL;
-               }
 
                clean_cached_changes (proxy);
        }
@@ -977,7 +975,7 @@ gda_data_proxy_set_property (GObject *object,
 
        proxy = GDA_DATA_PROXY (object);
        if (proxy->priv) {
-               gda_mutex_lock (proxy->priv->mutex);
+               g_rec_mutex_lock (& (proxy->priv->mutex));
                switch (param_id) {
                case PROP_MODEL: {
                        GdaDataModel *model;
@@ -1004,7 +1002,7 @@ gda_data_proxy_set_property (GObject *object,
 
                        if (! (gda_data_model_get_access_flags (model) & GDA_DATA_MODEL_ACCESS_RANDOM)) {
                                g_warning (_("GdaDataProxy can't handle non random access data models"));
-                               gda_mutex_unlock (proxy->priv->mutex);
+                               g_rec_mutex_unlock (& (proxy->priv->mutex));
                                return;
                        }
                        proxy->priv->model = g_object_ref (model);
@@ -1090,7 +1088,7 @@ gda_data_proxy_set_property (GObject *object,
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
                }
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
        }
 }
 
@@ -1104,7 +1102,7 @@ gda_data_proxy_get_property (GObject *object,
 
        proxy = GDA_DATA_PROXY (object);
        if (proxy->priv) {
-               gda_mutex_lock (proxy->priv->mutex);
+               g_rec_mutex_lock (& (proxy->priv->mutex));
                switch (param_id) {
                case PROP_ADD_NULL_ENTRY:
                        g_value_set_boolean (value, proxy->priv->add_null_entry);
@@ -1122,7 +1120,7 @@ gda_data_proxy_get_property (GObject *object,
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
                }
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
        }
 }
 
@@ -1466,18 +1464,18 @@ gda_data_proxy_get_values (GdaDataProxy *proxy, gint proxy_row, gint *cols_index
        g_return_val_if_fail (proxy->priv, NULL);
        g_return_val_if_fail (proxy_row >= 0, NULL);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        for (i = 0; i < n_cols; i++) {
                value = gda_data_proxy_get_value_at ((GdaDataModel *) proxy, cols_index[i], proxy_row, NULL);
                if (value)
                        retval = g_slist_prepend (retval, (GValue *) value);
                else {
                        g_slist_free (retval);
-                       gda_mutex_unlock (proxy->priv->mutex);
+                       g_rec_mutex_unlock (& (proxy->priv->mutex));
                        return NULL;
                }
        }
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        return g_slist_reverse (retval);
 }
@@ -1506,7 +1504,7 @@ gda_data_proxy_get_value_attributes (GdaDataProxy *proxy, gint proxy_row, gint c
        g_return_val_if_fail (proxy->priv, 0);
        g_return_val_if_fail (proxy_row >= 0, 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        model_column = col % proxy->priv->model_nb_cols;
        model_row = proxy_row_to_model_row (proxy, proxy_row);
        flags = gda_data_model_get_attributes_at (proxy->priv->model, model_column, model_row);
@@ -1546,7 +1544,7 @@ gda_data_proxy_get_value_attributes (GdaDataProxy *proxy, gint proxy_row, gint c
                        flags |= GDA_VALUE_ATTR_DATA_NON_VALID;
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        /*g_print ("%s (%p, %d, %d) => %d\n", __FUNCTION__, proxy, col, proxy_row, flags);*/
        return flags;
@@ -1572,7 +1570,7 @@ gda_data_proxy_alter_value_attributes (GdaDataProxy *proxy, gint proxy_row, gint
        g_return_if_fail (proxy->priv);
        g_return_if_fail (proxy_row >= 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        model_col = col % proxy->priv->model_nb_cols;
        if (alter_flags & GDA_VALUE_ATTR_IS_NULL)
@@ -1628,7 +1626,7 @@ gda_data_proxy_alter_value_attributes (GdaDataProxy *proxy, gint proxy_row, gint
                }
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -1668,19 +1666,19 @@ gda_data_proxy_delete (GdaDataProxy *proxy, gint proxy_row)
        g_return_if_fail (proxy->priv);
        g_return_if_fail (proxy_row >= 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
 
        if (proxy->priv->add_null_entry && proxy_row == 0) {
                g_warning (_("The first row is an empty row artificially prepended and cannot be removed"));
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return;
        }
 
        if (! (gda_data_model_get_access_flags ((GdaDataModel*) proxy) & GDA_DATA_MODEL_ACCESS_DELETE)) {
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return;
        }
 
@@ -1737,7 +1735,7 @@ gda_data_proxy_delete (GdaDataProxy *proxy, gint proxy_row)
                                0, proxy_row, TRUE);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -1758,7 +1756,7 @@ gda_data_proxy_undelete (GdaDataProxy *proxy, gint proxy_row)
        g_return_if_fail (proxy->priv);
        g_return_if_fail (proxy_row >= 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -1788,7 +1786,7 @@ gda_data_proxy_undelete (GdaDataProxy *proxy, gint proxy_row)
                                0, proxy_row, FALSE);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -1949,7 +1947,7 @@ gda_data_proxy_cancel_row_changes (GdaDataProxy *proxy, gint proxy_row, gint col
        g_return_if_fail (proxy->priv);
        g_return_if_fail (proxy_row >= 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -2024,7 +2022,7 @@ gda_data_proxy_cancel_row_changes (GdaDataProxy *proxy, gint proxy_row, gint col
        else
                g_warning ("GdaDataProxy column %d is not a modifiable data column", col);
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 static gboolean commit_row_modif (GdaDataProxy *proxy, RowModif *rm, gboolean adjust_display, GError 
**error);
@@ -2064,7 +2062,7 @@ commit_row_modif (GdaDataProxy *proxy, RowModif *rm, gboolean adjust_display, GE
        if (!rm)
                return TRUE;
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        model_row = rm->model_row;
 
@@ -2088,7 +2086,7 @@ commit_row_modif (GdaDataProxy *proxy, RowModif *rm, gboolean adjust_display, GE
                        0, proxy_row, rm->model_row, &lerror);
        if (lerror) {
                g_propagate_error (error, lerror);
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE;
        }
 
@@ -2240,7 +2238,7 @@ commit_row_modif (GdaDataProxy *proxy, RowModif *rm, gboolean adjust_display, GE
        if (adjust_display)
                adjust_displayed_chunk (proxy);
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        return !err;
 }
@@ -2344,7 +2342,7 @@ gda_data_proxy_set_sample_size (GdaDataProxy *proxy, gint sample_size)
        g_return_if_fail (GDA_IS_DATA_PROXY (proxy));
        g_return_if_fail (proxy->priv);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -2358,7 +2356,7 @@ gda_data_proxy_set_sample_size (GdaDataProxy *proxy, gint sample_size)
                                0, sample_size);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -2392,7 +2390,7 @@ gda_data_proxy_set_sample_start (GdaDataProxy *proxy, gint sample_start)
        g_return_if_fail (proxy->priv);
        g_return_if_fail (sample_start >= 0);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -2402,7 +2400,7 @@ gda_data_proxy_set_sample_start (GdaDataProxy *proxy, gint sample_start)
                adjust_displayed_chunk (proxy);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -2505,7 +2503,7 @@ display_chunks_dump (G_GNUC_UNUSED GdaDataProxy *proxy)
 static void
 ensure_chunk_sync (GdaDataProxy *proxy)
 {
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        if (proxy->priv->chunk_sync_idle_id) {
                gboolean defer_sync = proxy->priv->defer_sync;
                proxy->priv->defer_sync = FALSE;
@@ -2513,7 +2511,7 @@ ensure_chunk_sync (GdaDataProxy *proxy)
                chunk_sync_idle (proxy);
                proxy->priv->defer_sync = defer_sync;
        }
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /*
@@ -2524,7 +2522,7 @@ static gboolean
 chunk_sync_idle (GdaDataProxy *proxy)
 {
 #define IDLE_STEP 50
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        gboolean finished = FALSE;
        guint index, max_steps, step;
@@ -2540,7 +2538,7 @@ chunk_sync_idle (GdaDataProxy *proxy)
        }
 
        if (!proxy->priv->chunk_to) {
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE; /* nothing to do */
        }
 
@@ -2677,7 +2675,7 @@ chunk_sync_idle (GdaDataProxy *proxy)
        else
                g_print ("Sync. is NOT finished yet\n");
 #endif
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return !finished;
 }
 
@@ -2686,7 +2684,7 @@ compute_display_chunk (GdaDataProxy *proxy)
 {
        DisplayChunk *ret_chunk = NULL;
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        if (proxy->priv->filtered_rows) {
                /* REM: when there is a filter applied, the new rows are mixed with the
                 * existing ones => no need to treat them appart
@@ -2792,7 +2790,7 @@ compute_display_chunk (GdaDataProxy *proxy)
                }
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return ret_chunk;
 }
 
@@ -2807,7 +2805,7 @@ adjust_displayed_chunk (GdaDataProxy *proxy)
 {
        g_return_if_fail (proxy->priv->model);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /*
         * Stop idle adding of rows if necessary
@@ -2824,7 +2822,7 @@ adjust_displayed_chunk (GdaDataProxy *proxy)
        }
        proxy->priv->chunk_to = compute_display_chunk (proxy);
        if (!proxy->priv->chunk_to) {
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return; /* nothing to do */
        }
 
@@ -2874,7 +2872,7 @@ adjust_displayed_chunk (GdaDataProxy *proxy)
                }
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 /**
@@ -2896,7 +2894,7 @@ gda_data_proxy_apply_all_changes (GdaDataProxy *proxy, GError **error)
        g_return_val_if_fail (GDA_IS_DATA_PROXY (proxy), FALSE);
        g_return_val_if_fail (proxy->priv, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -2909,7 +2907,7 @@ gda_data_proxy_apply_all_changes (GdaDataProxy *proxy, GError **error)
        gda_data_model_send_hint (proxy->priv->model, GDA_DATA_MODEL_HINT_END_BATCH_UPDATE, NULL);
        adjust_displayed_chunk (proxy);
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        return allok;
 }
@@ -2931,7 +2929,7 @@ gda_data_proxy_cancel_all_changes (GdaDataProxy *proxy)
        g_return_val_if_fail (GDA_IS_DATA_PROXY (proxy), FALSE);
        g_return_val_if_fail (proxy->priv, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -2999,7 +2997,7 @@ gda_data_proxy_cancel_all_changes (GdaDataProxy *proxy)
                        gda_data_model_row_updated ((GdaDataModel *) proxy, proxy_row);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        return TRUE;
 }
@@ -3211,13 +3209,13 @@ gda_data_proxy_set_filter_expr (GdaDataProxy *proxy, const gchar *filter_expr, G
        g_return_val_if_fail (GDA_IS_DATA_PROXY (proxy), FALSE);
        g_return_val_if_fail (proxy->priv, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        if (!filter_expr) {
                if (proxy->priv->filter_stmt)
                        g_object_unref (proxy->priv->filter_stmt);
                proxy->priv->filter_stmt = NULL;
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
 
                gboolean retval = apply_filter_statement (proxy, error);
                return retval;
@@ -3254,7 +3252,7 @@ gda_data_proxy_set_filter_expr (GdaDataProxy *proxy, const gchar *filter_expr, G
                        g_object_unref (stmt);
                proxy->priv->force_direct_mapping = FALSE;
 
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE;
        }
 
@@ -3262,7 +3260,7 @@ gda_data_proxy_set_filter_expr (GdaDataProxy *proxy, const gchar *filter_expr, G
                g_object_unref (proxy->priv->filter_stmt);
        proxy->priv->filter_stmt = stmt;
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        gboolean retval = apply_filter_statement (proxy, error);
        return retval;
 }
@@ -3286,7 +3284,7 @@ gda_data_proxy_set_ordering_column (GdaDataProxy *proxy, gint col, GError **erro
        g_return_val_if_fail (col >= 0, FALSE);
        g_return_val_if_fail (col < gda_data_model_get_n_columns ((GdaDataModel*) proxy), FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        if (proxy->priv->filter_stmt) {
                GdaSqlStatement *sqlst;
@@ -3357,7 +3355,7 @@ gda_data_proxy_set_ordering_column (GdaDataProxy *proxy, gint col, GError **erro
                g_free (str);
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return retval;
 }
 
@@ -3395,14 +3393,14 @@ gda_data_proxy_get_filtered_n_rows (GdaDataProxy *proxy)
        g_return_val_if_fail (GDA_IS_DATA_PROXY (proxy), -1);
        g_return_val_if_fail (proxy->priv, -1);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        if (! proxy->priv->filtered_rows) {
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return -1;
        }
        else {
                gint n = gda_data_model_get_n_rows (proxy->priv->filtered_rows);
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return n;
        }
 }
@@ -3419,7 +3417,7 @@ gda_data_proxy_get_n_rows (GdaDataModel *model)
        proxy = GDA_DATA_PROXY (model);
        g_return_val_if_fail (proxy->priv, -1);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        if (proxy->priv->chunk && !proxy->priv->force_direct_mapping)
                nbrows = proxy->priv->chunk->mapping->len;
@@ -3438,7 +3436,7 @@ gda_data_proxy_get_n_rows (GdaDataModel *model)
        if (!proxy->priv->force_direct_mapping && proxy->priv->add_null_entry)
                nbrows += 1;
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 
        return nbrows;
 }
@@ -3553,10 +3551,10 @@ gda_data_proxy_describe_column (GdaDataModel *model, gint col)
        proxy = GDA_DATA_PROXY (model);
        g_return_val_if_fail (proxy->priv, NULL);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        if (!proxy->priv->columns)
                create_columns (proxy);
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        if ((col < 0) || (col >= 2 * proxy->priv->model_nb_cols)) {
                g_warning (_("Column %d out of range (0-%d)"), col,
                           gda_data_model_get_n_columns (model) - 1);
@@ -3579,12 +3577,12 @@ gda_data_proxy_get_value_at (GdaDataModel *model, gint column, gint proxy_row, G
        g_return_val_if_fail (proxy->priv, NULL);
        g_return_val_if_fail (proxy_row >= 0, NULL);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        if ((proxy_row == 0) && proxy->priv->add_null_entry) {
                if (!null_value)
                        null_value = gda_value_new_null ();
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return null_value;
        }
 
@@ -3639,7 +3637,7 @@ gda_data_proxy_get_value_at (GdaDataModel *model, gint column, gint proxy_row, G
                        }
                }
 
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return retval;
        }
 
@@ -3677,14 +3675,14 @@ gda_data_proxy_get_value_at (GdaDataModel *model, gint column, gint proxy_row, G
                        }
                }
 
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return retval;
        }
 
        g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_COLUMN_OUT_OF_RANGE_ERROR,
                     _("Column %d out of range (0-%d)"), column, 2 *proxy->priv->model_nb_cols - 1);
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return NULL;
 }
 
@@ -3698,9 +3696,9 @@ gda_data_proxy_get_attributes_at (GdaDataModel *model, gint col, gint row)
        proxy = (GdaDataProxy*) model;
        g_return_val_if_fail (proxy->priv, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        attrs = gda_data_proxy_get_value_attributes ((GdaDataProxy *) model, row, col);
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return attrs;
 }
 
@@ -3717,7 +3715,7 @@ gda_data_proxy_find_row_from_values (GdaDataModel *model, GSList *values, gint *
        g_return_val_if_fail (proxy->priv, FALSE);
        g_return_val_if_fail (values, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -3764,7 +3762,7 @@ gda_data_proxy_find_row_from_values (GdaDataModel *model, GSList *values, gint *
                }
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return found ? proxy_row : -1;
 }
 
@@ -3778,9 +3776,9 @@ gda_data_proxy_get_access_flags (GdaDataModel *model)
 
        if (proxy->priv->model) {
                GdaDataModelAccessFlags flags;
-               gda_mutex_lock (proxy->priv->mutex);
+               g_rec_mutex_lock (& (proxy->priv->mutex));
                flags = gda_data_model_get_access_flags (proxy->priv->model) | GDA_DATA_MODEL_ACCESS_RANDOM;
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return flags;
        }
        else
@@ -3799,7 +3797,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
        g_return_val_if_fail (proxy_row >= 0, FALSE);
        g_return_val_if_fail (value, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -3807,7 +3805,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
        if ((proxy_row == 0) && proxy->priv->add_null_entry) {
                g_set_error (error, GDA_DATA_PROXY_ERROR, GDA_DATA_PROXY_READ_ONLY_ROW,
                              "%s", _("The first row is an empty row artificially prepended and cannot be 
altered"));
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE;
        }
 
@@ -3824,7 +3822,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
                        GdaValueAttribute attrs;
                        attrs = gda_data_proxy_get_value_attributes (proxy, proxy_row, col);
                        if (attrs & GDA_VALUE_ATTR_NO_MODIF) {
-                               gda_mutex_unlock (proxy->priv->mutex);
+                               g_rec_mutex_unlock (& (proxy->priv->mutex));
                                return FALSE;
                        }
                        else {
@@ -3834,7 +3832,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
                                if ((G_VALUE_TYPE (value) != GDA_TYPE_NULL) &&
                                    (exptype != GDA_TYPE_NULL) &&
                                    (exptype != G_VALUE_TYPE (value))) {
-                                       gda_mutex_unlock (proxy->priv->mutex);
+                                       g_rec_mutex_unlock (& (proxy->priv->mutex));
                                        g_warning (_("Wrong value type: expected '%s' and got '%s'"),
                                                   g_type_name (exptype),
                                                   g_type_name (G_VALUE_TYPE (value)));
@@ -3845,7 +3843,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
                else if ((G_VALUE_TYPE (cmp_value) != GDA_TYPE_NULL) &&
                         (G_VALUE_TYPE (value) != GDA_TYPE_NULL) &&
                         (G_VALUE_TYPE (value) != G_VALUE_TYPE (cmp_value))) {
-                       gda_mutex_unlock (proxy->priv->mutex);
+                       g_rec_mutex_unlock (& (proxy->priv->mutex));
                        g_warning (_("Wrong value type: expected '%s' and got '%s'"),
                                   g_type_name (G_VALUE_TYPE (cmp_value)),
                                   g_type_name (G_VALUE_TYPE (value)));
@@ -3853,7 +3851,7 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
                }
                else if (! gda_value_compare ((GValue *) value, (GValue *) cmp_value)) {
                        /* nothing to do: values are equal */
-                       gda_mutex_unlock (proxy->priv->mutex);
+                       g_rec_mutex_unlock (& (proxy->priv->mutex));
                        return TRUE;
                }
 
@@ -3935,11 +3933,11 @@ gda_data_proxy_set_value_at (GdaDataModel *model, gint col, gint proxy_row, cons
        else {
                g_set_error (error, GDA_DATA_PROXY_ERROR, GDA_DATA_PROXY_READ_ONLY_VALUE,
                             _("Trying to change read-only column: %d"), col);
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE;
        }
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return TRUE;
 }
 
@@ -3985,7 +3983,7 @@ gda_data_proxy_set_values (GdaDataModel *model, gint row, GList *values, GError
        if (err)
                return FALSE;
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* temporary disable changes notification */
        notify_changes = proxy->priv->notify_changes;
@@ -4004,7 +4002,7 @@ gda_data_proxy_set_values (GdaDataModel *model, gint row, GList *values, GError
                /* at least one successful value change occurred */
                gda_data_model_row_updated (model, row);
 
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return !err;
 }
 
@@ -4019,7 +4017,7 @@ gda_data_proxy_append_values (GdaDataModel *model, const GList *values, GError *
        proxy = GDA_DATA_PROXY (model);
        g_return_val_if_fail (proxy->priv, -1);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        /* ensure that there is no sync to be done */
        ensure_chunk_sync (proxy);
@@ -4032,14 +4030,14 @@ gda_data_proxy_append_values (GdaDataModel *model, const GList *values, GError *
        if (! gda_data_proxy_set_values (model, newrow, (GList *) values, error)) {
                gda_data_proxy_remove_row (model, newrow, NULL);
                proxy->priv->notify_changes = notify_changes;
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return -1;
        }
        else {
                proxy->priv->notify_changes = notify_changes;
                if (proxy->priv->notify_changes)
                        gda_data_model_row_inserted (model, newrow);
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return newrow;
        }
 }
@@ -4053,9 +4051,9 @@ gda_data_proxy_append_row (GdaDataModel *model, G_GNUC_UNUSED GError **error)
        proxy = GDA_DATA_PROXY (model);
        g_return_val_if_fail (proxy->priv, -1);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        i = gda_data_proxy_append (proxy);
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return i;
 }
 
@@ -4067,17 +4065,17 @@ gda_data_proxy_remove_row (GdaDataModel *model, gint row, GError **error)
        proxy = GDA_DATA_PROXY (model);
        g_return_val_if_fail (proxy->priv, FALSE);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
 
        if (proxy->priv->add_null_entry && row == 0) {
                g_set_error (error, GDA_DATA_PROXY_ERROR, GDA_DATA_PROXY_READ_ONLY_ROW,
                              "%s", _("The first row is an empty row artificially prepended and cannot be 
removed"));
-               gda_mutex_unlock (proxy->priv->mutex);
+               g_rec_mutex_unlock (& (proxy->priv->mutex));
                return FALSE;
        }
 
        gda_data_proxy_delete (proxy, row);
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
        return TRUE;
 }
 
@@ -4089,9 +4087,9 @@ gda_data_proxy_set_notify (GdaDataModel *model, gboolean do_notify_changes)
        proxy = GDA_DATA_PROXY (model);
        g_return_if_fail (proxy->priv);
 
-       gda_mutex_lock (proxy->priv->mutex);
+       g_rec_mutex_lock (& (proxy->priv->mutex));
        proxy->priv->notify_changes = do_notify_changes;
-       gda_mutex_unlock (proxy->priv->mutex);
+       g_rec_mutex_unlock (& (proxy->priv->mutex));
 }
 
 static gboolean
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index 0778322..3ce50a1 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008 Massimo Cora <maxcvs email it>
  * Copyright (C) 2008 - 2011 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2008 - 2013 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2010 Jonh Wendell <jwendell gnome org>
@@ -121,7 +121,7 @@ struct _GdaHolderPrivate
        GdaDataModel    *source_model;
        gint             source_col;
 
-       GdaMutex        *mutex;
+       GRecMutex        mutex;
 
        gboolean         validate_changes;
 };
@@ -365,7 +365,7 @@ gda_holder_init (GdaHolder *holder)
        holder->priv->source_model = NULL;
        holder->priv->source_col = 0;
 
-       holder->priv->mutex = gda_mutex_new ();
+       g_rec_mutex_init (& (holder->priv->mutex));
 
        holder->priv->validate_changes = TRUE;
 }
@@ -603,8 +603,7 @@ gda_holder_finalize (GObject   * object)
        holder = GDA_HOLDER (object);
        if (holder->priv) {
                g_free (holder->priv->id);
-
-               gda_mutex_free (holder->priv->mutex);
+               g_rec_mutex_clear (& (holder->priv->mutex));
 
                g_free (holder->priv);
                holder->priv = NULL;
@@ -2063,19 +2062,19 @@ static void
 gda_holder_lock (GdaLockable *lockable)
 {
        GdaHolder *holder = (GdaHolder *) lockable;
-       gda_mutex_lock (holder->priv->mutex);
+       g_rec_mutex_lock (& (holder->priv->mutex));
 }
 
 static gboolean
 gda_holder_trylock (GdaLockable *lockable)
 {
        GdaHolder *holder = (GdaHolder *) lockable;
-       return gda_mutex_trylock (holder->priv->mutex);
+       return g_rec_mutex_trylock (& (holder->priv->mutex));
 }
 
 static void
 gda_holder_unlock (GdaLockable *lockable)
 {
        GdaHolder *holder = (GdaHolder *) lockable;
-       gda_mutex_unlock (holder->priv->mutex);
+       g_rec_mutex_unlock (& (holder->priv->mutex));
 }
diff --git a/libgda/gda-lockable.h b/libgda/gda-lockable.h
index 2792cb8..60474c6 100644
--- a/libgda/gda-lockable.h
+++ b/libgda/gda-lockable.h
@@ -47,7 +47,7 @@ struct _GdaLockableIface {
  * @short_description: Interface for locking objects in a multi threaded environment
  * @title: GdaLockable
  * @stability: Stable
- * @see_also: #GdaMutex and #GMutex
+ * @see_also: #GRecMutex and #GMutex
  *
  * This interface is implemented by objects which are thread safe (ie. can be used by several threads at
  * the same time). Before using an object from a thread, one has to call gda_lockable_lock() or
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index 2f36201..a3aefbd 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -60,7 +60,6 @@
 #include <libgda/gda-connection.h>
 #include <libgda/gda-connection-internal.h>
 #include <libgda/gda-lockable.h>
-#include <libgda/gda-mutex.h>
 #include <libgda/gda-connection-sqlite.h>
 #include "gda-types.h"
 #include "gda-data-meta-wrapper.h"
@@ -468,7 +467,7 @@ struct _GdaMetaStorePrivate {
        gint           current_extract_stmt;
        GHashTable    *extract_stmt_hash; /* key = a SQL string, value = a #GdaStatement */
 
-       GdaMutex      *mutex;
+       GRecMutex      mutex;
 };
 
 static void db_object_free    (DbObject *dbobj);
@@ -766,7 +765,7 @@ gda_meta_store_init (GdaMetaStore *store)
        store->priv->current_extract_stmt = 0;
        store->priv->extract_stmt_hash = NULL;
 
-       store->priv->mutex = gda_mutex_new ();
+       g_rec_mutex_init (& (store->priv->mutex));
 }
 
 static GObject *
@@ -942,7 +941,7 @@ gda_meta_store_dispose (GObject *object)
                        store->priv->cnc = NULL;
                }
 
-               gda_mutex_free (store->priv->mutex);
+               g_rec_mutex_clear (& (store->priv->mutex));
        }
 
        /* parent class */
@@ -2749,7 +2748,7 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
                return NULL;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        if ((store->priv->max_extract_stmt > 0) && !store->priv->extract_stmt_hash)
                store->priv->extract_stmt_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, 
g_object_unref);
@@ -2766,14 +2765,14 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
                klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
                stmt = gda_sql_parser_parse_string (klass->cpriv->parser, select_sql, &remain, error);
                if (!stmt) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
                if (remain) {
                        g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_EXTRACT_SQL_ERROR,
                                     "%s", _("More than one SQL statement"));
                        g_object_unref (stmt);
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
 
@@ -2786,7 +2785,7 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
        /* parameters */
        if (!gda_statement_get_parameters (stmt, &params, error)) {
                g_object_unref (stmt);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
        if (params) {
@@ -2807,7 +2806,7 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
                                        g_object_unref (params);
                                        va_end (ap);
                                        g_slist_free (params_set);
-                                       gda_mutex_unlock (store->priv->mutex);
+                                       g_rec_mutex_unlock (& (store->priv->mutex));
                                        return NULL;
                                }
                                params_set = g_slist_prepend (params_set, h);
@@ -2829,7 +2828,7 @@ gda_meta_store_extract (GdaMetaStore *store, const gchar *select_sql, GError **e
        if (params)
                g_object_unref (params);
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return model;
 }
 
@@ -2871,7 +2870,7 @@ gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTab
                return NULL;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        if ((store->priv->max_extract_stmt > 0) && !store->priv->extract_stmt_hash)
                store->priv->extract_stmt_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, 
g_object_unref);
@@ -2888,14 +2887,14 @@ gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTab
                klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
                stmt = gda_sql_parser_parse_string (klass->cpriv->parser, select_sql, &remain, error);
                if (!stmt) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
                if (remain) {
                        g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_EXTRACT_SQL_ERROR,
                                     "%s", _("More than one SQL statement"));
                        g_object_unref (stmt);
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
 
@@ -2908,7 +2907,7 @@ gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTab
        /* parameters */
        if (!gda_statement_get_parameters (stmt, &params, error)) {
                g_object_unref (stmt);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
        if (params) {
@@ -2926,7 +2925,7 @@ gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTab
                                if (!gda_holder_set_value (h, value, error)) {
                                        g_object_unref (stmt);
                                        g_object_unref (params);
-                                       gda_mutex_unlock (store->priv->mutex);
+                                       g_rec_mutex_unlock (& (store->priv->mutex));
                                        return NULL;
                                }
                                params_set = g_slist_prepend (params_set, h);
@@ -2947,7 +2946,7 @@ gda_meta_store_extract_v (GdaMetaStore *store, const gchar *select_sql, GHashTab
        if (params)
                g_object_unref (params);
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return model;
 }
 
@@ -3114,13 +3113,13 @@ gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
        g_return_val_if_fail (gda_connection_is_opened (store->priv->cnc), FALSE);
        g_return_val_if_fail (!new_data || GDA_IS_DATA_MODEL (new_data), FALSE);
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        /* get the correct TableInfo */
        prep = prepare_tables_infos (store, &schema_set, &custom_set, &with_cond, table_name,
                                     condition, error, nvalues, value_names, values);
        if (!prep) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return FALSE;
        }
 
@@ -3138,7 +3137,7 @@ gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
                                                                        GDA_STATEMENT_MODEL_RANDOM_ACCESS,
                                                                        schema_set->type_cols_array, error);
                if (!current) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return FALSE;
                }
                current_n_rows = gda_data_model_get_n_rows (current);
@@ -3165,7 +3164,7 @@ gda_meta_store_modify_v (GdaMetaStore *store, const gchar *table_name,
                if (gda_connection_statement_execute_non_select (store->priv->cnc,
                                                                 schema_set->delete_all, NULL,
                                                                 NULL, error) == -1) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return FALSE;
                }
        }
@@ -3488,7 +3487,7 @@ out:
 #endif
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return retval;
 }
 
@@ -3687,23 +3686,23 @@ _gda_meta_store_begin_data_reset (GdaMetaStore *store, GError **error)
        if (store->priv->override_mode)
                return TRUE;
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
        if (! gda_connection_get_transaction_status (store->priv->cnc)) {
                if (!gda_connection_begin_transaction (store->priv->cnc, NULL,
                                                       GDA_TRANSACTION_ISOLATION_UNKNOWN, error)) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return FALSE;
                }
        }
        else {
                g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_TRANSACTION_ALREADY_STARTED_ERROR,
                             "%s", _("A transaction has already been started"));
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return FALSE;
 
        }
        store->priv->override_mode = TRUE;
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return TRUE;
 }
 
@@ -3727,15 +3726,15 @@ _gda_meta_store_cancel_data_reset (GdaMetaStore *store, GError **error)
                return FALSE;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
        if (!store->priv->override_mode) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return TRUE;
        }
 
        store->priv->override_mode = FALSE;
        retval = gda_connection_rollback_transaction (store->priv->cnc, NULL, error);
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return retval;
 }
 
@@ -3758,20 +3757,20 @@ _gda_meta_store_finish_data_reset (GdaMetaStore *store, GError **error)
                return FALSE;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
        if (!store->priv->override_mode) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return TRUE;
        }
 
        store->priv->override_mode = FALSE;
        if (!gda_connection_commit_transaction (store->priv->cnc, NULL, error)) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return FALSE;
        }
        else {
                g_signal_emit (store, gda_meta_store_signals[META_RESET], 0);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return TRUE;
        }
 }
@@ -3817,17 +3816,17 @@ gda_meta_store_create_modify_data_model (GdaMetaStore *store, const gchar *table
        g_return_val_if_fail (GDA_IS_META_STORE (store), FALSE);
        g_return_val_if_fail (table_name && *table_name, FALSE);
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        dbobj = g_hash_table_lookup (store->priv->p_db_objects_hash, table_name);
        if (!dbobj) {
                g_warning ("Table '%s' is not known by the GdaMetaStore", table_name);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
        if (dbobj->obj_type != GDA_SERVER_OPERATION_CREATE_TABLE) {
                g_warning ("Table '%s' is not a database table in the GdaMetaStore", table_name);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -3842,7 +3841,7 @@ gda_meta_store_create_modify_data_model (GdaMetaStore *store, const gchar *table
                gda_column_set_name (col, tcol->column_name);
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return model;
 }
 
@@ -3864,7 +3863,7 @@ gda_meta_store_schema_get_all_tables (GdaMetaStore *store)
 
        g_return_val_if_fail (GDA_IS_META_STORE (store), NULL);
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
        for (ret = NULL, list = klass->cpriv->db_objects; list; list = list->next) {
@@ -3878,7 +3877,7 @@ gda_meta_store_schema_get_all_tables (GdaMetaStore *store)
                        ret = g_slist_prepend (ret, dbobj->obj_name);
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
 
        return g_slist_reverse (ret);
 }
@@ -3905,10 +3904,10 @@ gda_meta_store_schema_get_depend_tables (GdaMetaStore *store, const gchar *table
        g_return_val_if_fail (GDA_IS_META_STORE (store), NULL);
        g_return_val_if_fail (table_name && *table_name, NULL);
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
        dbo = g_hash_table_lookup (store->priv->p_db_objects_hash, table_name);
        if (!dbo) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -3918,7 +3917,7 @@ gda_meta_store_schema_get_depend_tables (GdaMetaStore *store, const gchar *table
                        ret = g_slist_prepend (ret, dbobj->obj_name);
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
 
        return g_slist_reverse (ret);
 }
@@ -3947,11 +3946,11 @@ gda_meta_store_schema_get_structure (GdaMetaStore *store, GError **error)
                return NULL;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        /* make sure the private connection's meta store is up to date */
        if (! gda_connection_update_meta_store (store->priv->cnc, NULL, error)) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -3961,7 +3960,7 @@ gda_meta_store_schema_get_structure (GdaMetaStore *store, GError **error)
                                        "SELECT table_catalog, table_schema, table_name FROM _tables",
                                        error, NULL);
        if (!model) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -3972,23 +3971,23 @@ gda_meta_store_schema_get_structure (GdaMetaStore *store, GError **error)
                const GValue *cv0, *cv1, *cv2;
                cv0 = gda_data_model_get_value_at (model, 0, i, error);
                if (!cv0) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
                cv1 = gda_data_model_get_value_at (model, 1, i, error);
                if (!cv1) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
                cv2 = gda_data_model_get_value_at (model, 2, i, error);
                if (!cv2) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
                if (!gda_meta_struct_complement (mstruct, GDA_META_DB_UNKNOWN, cv0, cv1, cv2, error)) {
                        g_object_unref (mstruct);
                        g_object_unref (model);
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return NULL;
                }
        }
@@ -4031,7 +4030,7 @@ gda_meta_store_schema_get_structure (GdaMetaStore *store, GError **error)
        }
        g_slist_free (all_db_obj_list);
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
 
        return mstruct;
 }
@@ -4070,7 +4069,7 @@ gda_meta_store_get_attribute_value (GdaMetaStore *store, const gchar *att_name,
                return FALSE;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        *att_value = NULL;
        g_value_set_string ((value = gda_value_new (G_TYPE_STRING)), att_name);
@@ -4078,7 +4077,7 @@ gda_meta_store_get_attribute_value (GdaMetaStore *store, const gchar *att_name,
                                        "n", value, NULL);
        gda_value_free (value);
        if (!model) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return FALSE;
        }
        nrows = gda_data_model_get_n_rows (model);
@@ -4092,7 +4091,7 @@ gda_meta_store_get_attribute_value (GdaMetaStore *store, const gchar *att_name,
        else {
                value = (GValue*) gda_data_model_get_value_at (model, 0, 0, error);
                if (!value) {
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return FALSE;
                }
                if (G_VALUE_TYPE (value) == G_TYPE_STRING) {
@@ -4101,10 +4100,10 @@ gda_meta_store_get_attribute_value (GdaMetaStore *store, const gchar *att_name,
                        if (val)
                                *att_value = g_strdup (val);
                }
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return TRUE;
        }
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return FALSE;
 }
 
@@ -4138,21 +4137,21 @@ gda_meta_store_set_attribute_value (GdaMetaStore *store, const gchar *att_name,
                return FALSE;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
        g_mutex_lock (&set_mutex);
        if (!set) {
                if (!gda_statement_get_parameters (klass->cpriv->prep_stmts [STMT_SET_ATT_VALUE], &set, 
error)) {
                        g_mutex_unlock (&set_mutex);
-                       gda_mutex_unlock (store->priv->mutex);
+                       g_rec_mutex_unlock (& (store->priv->mutex));
                        return FALSE;
                }
        }
        g_mutex_unlock (&set_mutex);
 
        if (!gda_set_set_holder_value (set, error, "name", att_name)) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return FALSE;
        }
 
@@ -4183,13 +4182,13 @@ gda_meta_store_set_attribute_value (GdaMetaStore *store, const gchar *att_name,
        }
        if (started_transaction)
                gda_connection_commit_transaction (store->priv->cnc, NULL, NULL);
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return TRUE;
 
  onerror:
        if (started_transaction)
                gda_connection_rollback_transaction (store->priv->cnc, NULL, NULL);
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return FALSE;
 }
 
@@ -4282,7 +4281,7 @@ gda_meta_store_schema_add_custom_object (GdaMetaStore *store, const gchar *xml_d
        }
        node = xmlDocGetRootElement (doc);
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        klass = (GdaMetaStoreClass *) G_OBJECT_GET_CLASS (store);
 
@@ -4419,7 +4418,7 @@ gda_meta_store_schema_add_custom_object (GdaMetaStore *store, const gchar *xml_d
                }
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return TRUE;
 
  onerror:
@@ -4439,7 +4438,7 @@ gda_meta_store_schema_add_custom_object (GdaMetaStore *store, const gchar *xml_d
                }
                g_slist_free (current_objects);
        }
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        g_slist_free (pre_p_db_objects);
        if (pstore)
                g_object_unref (pstore);
@@ -4470,9 +4469,9 @@ gda_meta_store_schema_remove_custom_object (GdaMetaStore *store, const gchar *ob
                return FALSE;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
        TO_IMPLEMENT;
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
 
        return FALSE;
 }
@@ -4628,25 +4627,25 @@ _gda_meta_store_schema_get_upstream_contexts (GdaMetaStore *store, GdaMetaContex
                return NULL;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        /* find the associated DbObject */
        dbo = g_hash_table_lookup (store->priv->p_db_objects_hash, context->table_name);
        if (!dbo) {
                g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_SCHEMA_OBJECT_NOT_FOUND_ERROR,
                             _("Unknown database object '%s'"), context->table_name);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
        if (dbo->obj_type != GDA_SERVER_OPERATION_CREATE_TABLE) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
        tinfo = TABLE_INFO (dbo);
        if (!tinfo->fk_list) {
                /* this is not an error, just that there are no dependency */
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -4707,7 +4706,7 @@ _gda_meta_store_schema_get_upstream_contexts (GdaMetaStore *store, GdaMetaContex
                }
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return g_slist_reverse (retlist);
 }
 
@@ -4731,25 +4730,25 @@ _gda_meta_store_schema_get_downstream_contexts (GdaMetaStore *store, GdaMetaCont
                return NULL;
        }
 
-       gda_mutex_lock (store->priv->mutex);
+       g_rec_mutex_lock (& (store->priv->mutex));
 
        /* find the associated DbObject */
        dbo = g_hash_table_lookup (store->priv->p_db_objects_hash, context->table_name);
        if (!dbo) {
                g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_SCHEMA_OBJECT_NOT_FOUND_ERROR,
                             _("Unknown database object '%s'"), context->table_name);
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
        if (dbo->obj_type != GDA_SERVER_OPERATION_CREATE_TABLE) {
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
        tinfo = TABLE_INFO (dbo);
        if (!tinfo->reverse_fk_list) {
                /* this is not an error, just that there are no dependency */
-               gda_mutex_unlock (store->priv->mutex);
+               g_rec_mutex_unlock (& (store->priv->mutex));
                return NULL;
        }
 
@@ -4765,7 +4764,7 @@ _gda_meta_store_schema_get_downstream_contexts (GdaMetaStore *store, GdaMetaCont
                retlist = g_slist_prepend (retlist, ct);
        }
 
-       gda_mutex_unlock (store->priv->mutex);
+       g_rec_mutex_unlock (& (store->priv->mutex));
        return g_slist_reverse (retlist);
 }
 
diff --git a/libgda/libgda.h.in b/libgda/libgda.h.in
index 980a08b..6b860ed 100644
--- a/libgda/libgda.h.in
+++ b/libgda/libgda.h.in
@@ -88,8 +88,6 @@
 
 #include <libgda/gda-meta-store.h>
 
-#include <libgda/gda-mutex.h>
-
 G_BEGIN_DECLS
 
 /**
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index 1d70da2..aef05d4 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -487,11 +487,6 @@
        gda_meta_table_column_foreach_attribute
        gda_meta_table_column_get_attribute
        gda_meta_table_column_set_attribute
-       gda_mutex_free
-       gda_mutex_lock
-       gda_mutex_new
-       gda_mutex_trylock
-       gda_mutex_unlock
        gda_null_get_type
        gda_numeric_copy
        gda_numeric_free
diff --git a/libgda/sql-parser/gda-sql-parser-private.h b/libgda/sql-parser/gda-sql-parser-private.h
index 5b9ad48..a391dae 100644
--- a/libgda/sql-parser/gda-sql-parser-private.h
+++ b/libgda/sql-parser/gda-sql-parser-private.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
 #include <glib-object.h>
 #include "gda-sql-parser.h"
 #include "gda-statement-struct-pspec.h"
-#include <libgda/gda-mutex.h>
 
 G_BEGIN_DECLS
 
@@ -43,9 +42,9 @@ typedef struct {
 } TokenizerContext;
 
 struct _GdaSqlParserPrivate {
-       GdaMutex *mutex;
-       gchar    *sql;
-       GSList   *parsed_statements;
+       GRecMutex  mutex;
+       gchar     *sql;
+       GSList    *parsed_statements;
 
        /* parser */
        void     *lemon_delimiter;
diff --git a/libgda/sql-parser/gda-sql-parser.c b/libgda/sql-parser/gda-sql-parser.c
index 37af1fa..6245414 100644
--- a/libgda/sql-parser/gda-sql-parser.c
+++ b/libgda/sql-parser/gda-sql-parser.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 - 2011 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2010 Jonh Wendell <jwendell gnome org>
@@ -235,7 +235,7 @@ gda_sql_parser_init (GdaSqlParser *parser)
        klass = (GdaSqlParserClass*) G_OBJECT_GET_CLASS (parser);
 
        parser->priv = g_new0 (GdaSqlParserPrivate, 1);
-       parser->priv->mutex = gda_mutex_new ();
+       g_rec_mutex_init (& (parser->priv->mutex));
        parser->priv->flavour = GDA_SQL_PARSER_FLAVOUR_STANDARD;
        if (klass->delim_alloc)
                parser->priv->lemon_delimiter = klass->delim_alloc ((void*(*)(size_t)) g_malloc);
@@ -327,7 +327,7 @@ gda_sql_parser_finalize (GObject *object)
 
                g_array_free (parser->priv->passed_tokens, TRUE);
 
-               gda_mutex_free (parser->priv->mutex);
+               g_rec_mutex_clear (& (parser->priv->mutex));
                g_free (parser->priv);
                parser->priv = NULL;
        }
@@ -347,7 +347,7 @@ gda_sql_parser_set_property (GObject *object,
 
        parser = GDA_SQL_PARSER (object);
        if (parser->priv) {
-               gda_mutex_lock (parser->priv->mutex);
+               g_rec_mutex_lock (& (parser->priv->mutex));
                switch (param_id) {
                case PROP_FLAVOUR:
                        parser->priv->flavour = g_value_get_int (value);
@@ -384,7 +384,7 @@ gda_sql_parser_set_property (GObject *object,
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
                }
-               gda_mutex_unlock (parser->priv->mutex);
+               g_rec_mutex_unlock (& (parser->priv->mutex));
        }
 }
 
@@ -454,7 +454,7 @@ gda_sql_parser_parse_string (GdaSqlParser *parser, const gchar *sql, const gchar
        if (!sql)
                return NULL;
 
-       gda_mutex_lock (parser->priv->mutex);
+       g_rec_mutex_lock (& (parser->priv->mutex));
 
        if (remain)
                *remain = NULL;
@@ -652,7 +652,7 @@ gda_sql_parser_parse_string (GdaSqlParser *parser, const gchar *sql, const gchar
 
        parser->priv->mode = parse_mode;
 
-       gda_mutex_unlock (parser->priv->mutex);
+       g_rec_mutex_unlock (& (parser->priv->mutex));
 
        return stmt;
 }
@@ -699,7 +699,7 @@ gda_sql_parser_parse_string_as_batch (GdaSqlParser *parser, const gchar *sql, co
        if (!sql)
                return batch;
 
-       gda_mutex_lock (parser->priv->mutex);
+       g_rec_mutex_lock (& (parser->priv->mutex));
 
        int_sql = sql;
        while (int_sql && allok) {
@@ -743,7 +743,7 @@ gda_sql_parser_parse_string_as_batch (GdaSqlParser *parser, const gchar *sql, co
                batch = NULL;
        }
 
-       gda_mutex_unlock (parser->priv->mutex);
+       g_rec_mutex_unlock (& (parser->priv->mutex));
 
        return batch;
 }
@@ -1699,7 +1699,7 @@ gda_sql_parser_lock (GdaLockable *lockable)
        GdaSqlParser *parser = (GdaSqlParser *) lockable;
        g_return_if_fail (parser->priv);
 
-       gda_mutex_lock (parser->priv->mutex);
+       g_rec_mutex_lock (& (parser->priv->mutex));
 }
 
 static gboolean
@@ -1708,7 +1708,7 @@ gda_sql_parser_trylock (GdaLockable *lockable)
        GdaSqlParser *parser = (GdaSqlParser *) lockable;
        g_return_val_if_fail (parser->priv, FALSE);
 
-       return gda_mutex_trylock (parser->priv->mutex);
+       return g_rec_mutex_trylock (& (parser->priv->mutex));
 }
 
 static void
@@ -1717,5 +1717,5 @@ gda_sql_parser_unlock (GdaLockable *lockable)
        GdaSqlParser *parser = (GdaSqlParser *) lockable;
        g_return_if_fail (parser->priv);
 
-       gda_mutex_unlock (parser->priv->mutex);
+       g_rec_mutex_unlock (& (parser->priv->mutex));
 }
diff --git a/providers/web/gda-web-provider.c b/providers/web/gda-web-provider.c
index a604570..aea1fd7 100644
--- a/providers/web/gda-web-provider.c
+++ b/providers/web/gda-web-provider.c
@@ -381,7 +381,7 @@ gda_web_provider_open_connection (GdaServerProvider *provider, GdaConnection *cn
        GString *server_url;
 
        cdata = g_new0 (WebConnectionData, 1);
-       cdata->mutex = gda_mutex_new ();
+       g_rec_mutex_init (& (cdata->mutex));
        cdata->server_id = NULL;
        cdata->forced_closing = FALSE;
        cdata->worker_session = soup_session_sync_new ();
@@ -500,9 +500,9 @@ gda_web_provider_close_connection (GdaServerProvider *provider, GdaConnection *c
        if (!cdata) 
                return FALSE;
 
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        if (!cdata->forced_closing && cdata->worker_running) {
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                /* send BYE message */
                xmlDocPtr doc;
                gchar status;
@@ -528,7 +528,7 @@ gda_web_provider_close_connection (GdaServerProvider *provider, GdaConnection *c
                xmlFreeDoc (doc);
        }
        else
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
 
        _gda_web_do_server_cleanup (cnc, cdata);
 
@@ -1694,10 +1694,10 @@ gda_web_provider_statement_execute (GdaServerProvider *provider, GdaConnection *
                }
                else if (!strcmp ((gchar*) node->name, "gda_array")) {
                        GdaDataModel *data_model;
-                       gda_mutex_lock (cdata->mutex);
+                       g_rec_mutex_lock (& (cdata->mutex));
                        data_model = gda_web_recordset_new (cnc, ps, params, model_usage,
                                                            col_types, cdata->session_id, node, error);
-                       gda_mutex_unlock (cdata->mutex);
+                       g_rec_mutex_unlock (& (cdata->mutex));
                        retval = (GObject*) data_model;
 
                        if (! gda_web_recordset_store (GDA_WEB_RECORDSET (data_model), node, error)) {
diff --git a/providers/web/gda-web-util.c b/providers/web/gda-web-util.c
index c7454be..8f35026 100644
--- a/providers/web/gda-web-util.c
+++ b/providers/web/gda-web-util.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2013 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -181,9 +181,9 @@ worker_got_chunk_cb (SoupMessage *msg, SoupBuffer *chunk, ThreadData *thdata)
                                        xmlFreeDoc (doc);
                        }
                        else {
-                               gda_mutex_lock (thdata->cdata->mutex);
+                               g_rec_mutex_lock (& (thdata->cdata->mutex));
                                g_assert (thdata->cdata->worker_counter == counter_id);
-                               gda_mutex_unlock (thdata->cdata->mutex);
+                               g_rec_mutex_unlock (& (thdata->cdata->mutex));
                                xmlFreeDoc (doc);
                        }
                }
@@ -201,7 +201,7 @@ start_worker_in_sub_thread (ThreadData *thdata)
        
        while (runagain) {
                GString *real_url;
-               gda_mutex_lock (thdata->cdata->mutex);
+               g_rec_mutex_lock (& (thdata->cdata->mutex));
                real_url = g_string_new (thdata->cdata->worker_url);
                if (thdata->cdata->session_id)
                        g_string_append_printf (real_url, "?%s", thdata->cdata->session_id);
@@ -210,16 +210,16 @@ start_worker_in_sub_thread (ThreadData *thdata)
                        thdata->cdata->worker_counter = 1;
                else
                        thdata->cdata->worker_counter ++;
-               gda_mutex_unlock (thdata->cdata->mutex);
+               g_rec_mutex_unlock (& (thdata->cdata->mutex));
 
                msg = soup_message_new ("GET", real_url->str);
                /*g_print ("=== WORKER Request URL: [%s]\n", real_url->str);*/
                if (!msg) {
                        g_warning (_("Invalid HOST/SCRIPT '%s'"), real_url->str);
                        g_string_free (real_url, TRUE);
-                       gda_mutex_lock (thdata->cdata->mutex);
+                       g_rec_mutex_lock (& (thdata->cdata->mutex));
                        thdata->cdata->worker_running = FALSE;
-                       gda_mutex_unlock (thdata->cdata->mutex);
+                       g_rec_mutex_unlock (& (thdata->cdata->mutex));
                        g_free (thdata);
                        return NULL;
                }
@@ -230,11 +230,11 @@ start_worker_in_sub_thread (ThreadData *thdata)
                guint res;
                res = soup_session_send_message (thdata->cdata->worker_session, msg);
                
-               gda_mutex_lock (thdata->cdata->mutex);
+               g_rec_mutex_lock (& (thdata->cdata->mutex));
                thdata->cdata->worker_running = FALSE;
                runagain = thdata->cdata->worker_needed;
                runagain = runagain && SOUP_STATUS_IS_SUCCESSFUL (res);
-               gda_mutex_unlock (thdata->cdata->mutex);
+               g_rec_mutex_unlock (& (thdata->cdata->mutex));
 
                g_signal_handler_disconnect (msg, sigid);
                g_object_unref (msg);
@@ -259,9 +259,9 @@ start_worker (GdaConnection *cnc, WebConnectionData *cdata)
        thdata->cdata = cdata;
 
        /* set cdata->worker_running to TRUE to avoid having to add a delay */
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        cdata->worker_running = TRUE;
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
 
        if (! g_thread_new ("web-worker", (GThreadFunc) start_worker_in_sub_thread,
                            thdata)) {
@@ -273,21 +273,21 @@ start_worker (GdaConnection *cnc, WebConnectionData *cdata)
        gint nb_retries;
        for (nb_retries = 0; nb_retries < 10; nb_retries++) {
                gboolean wait_over;
-               gda_mutex_lock (cdata->mutex);
+               g_rec_mutex_lock (& (cdata->mutex));
                wait_over = !cdata->worker_running || cdata->session_id;
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                if (wait_over)
                        break;
                else
                        g_usleep (200000);
        }
 
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        if (!cdata->session_id) {
                /* there was an error */
                cdata->worker_running = FALSE;
        }
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
 }
 
 /*
@@ -312,17 +312,17 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
                *out_status_chr = 0;
 
        /* handle the need to run the worker to get an initial sessionID */
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        cdata->worker_needed = TRUE;
        if (!cdata->worker_running && !cdata->session_id) {
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                start_worker (cnc, cdata);
 
-               gda_mutex_lock (cdata->mutex);
+               g_rec_mutex_lock (& (cdata->mutex));
                if (! cdata->worker_running) {
                        gda_connection_add_event_string (cnc, _("Could not run PHP script on the server"));
                        cdata->worker_needed = FALSE;
-                       gda_mutex_unlock (cdata->mutex);
+                       g_rec_mutex_unlock (& (cdata->mutex));
                        return NULL;
                }
        }
@@ -330,7 +330,7 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
        /* prepare new message */
        g_assert (cdata->session_id);
        real_url = g_strdup_printf ("%s?%s&c=%d", cdata->front_url, cdata->session_id, counter++);
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
        msg = soup_message_new ("POST", real_url);
        if (!msg) {
                gda_connection_add_event_string (cnc, _("Invalid HOST/SCRIPT '%s'"), real_url);
@@ -340,7 +340,7 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
        g_free (real_url);
 
        /* check context */
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        if (gda_connection_get_transaction_status (cnc) &&
            (!cdata->worker_running ||
             ((msgtype == MESSAGE_EXEC) && (cdata->last_exec_counter != cdata->worker_counter)))) {
@@ -351,22 +351,22 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
                g_object_unref (msg);
 
                gda_connection_internal_reset_transaction_status (cnc);
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                return NULL;
        }
        if (! cdata->worker_running) {
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                start_worker (cnc, cdata);
 
-               gda_mutex_lock (cdata->mutex);
+               g_rec_mutex_lock (& (cdata->mutex));
                if (! cdata->worker_running) {
                        gda_connection_add_event_string (cnc, _("Could not run PHP script on the server"));
                        g_object_unref (msg);
-                       gda_mutex_unlock (cdata->mutex);
+                       g_rec_mutex_unlock (& (cdata->mutex));
                        return NULL;
                }
        }
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
 
        /* finalize and send message */
        if (hash_key) {
@@ -393,9 +393,9 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
        g_object_set (G_OBJECT (cdata->front_session), SOUP_SESSION_TIMEOUT, 20, NULL);
        status = soup_session_send_message (cdata->front_session, msg);
 
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        cdata->worker_needed = FALSE;
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
 
        if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
                gda_connection_add_event_string (cnc, msg->reason_phrase);
@@ -408,10 +408,10 @@ _gda_web_send_message_to_frontend (GdaConnection *cnc, WebConnectionData *cdata,
        doc = _gda_web_decode_response (cnc, cdata, msg->response_body, out_status_chr, &counter_id);
        g_object_unref (msg);
        
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        if (msgtype == MESSAGE_EXEC)
                cdata->last_exec_counter = counter_id;
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
 
        return doc;
 }
@@ -466,13 +466,13 @@ _gda_web_do_server_cleanup (GdaConnection *cnc, WebConnectionData *cdata)
        gint nb_retries;
 
        /* wait for worker to finish */
-       gda_mutex_lock (cdata->mutex);
+       g_rec_mutex_lock (& (cdata->mutex));
        for (nb_retries = 0; (nb_retries < 10) && cdata->worker_running; nb_retries ++) {
-               gda_mutex_unlock (cdata->mutex);
+               g_rec_mutex_unlock (& (cdata->mutex));
                g_usleep (50000);
-               gda_mutex_lock (cdata->mutex);
+               g_rec_mutex_lock (& (cdata->mutex));
        }
-       gda_mutex_unlock (cdata->mutex);
+       g_rec_mutex_unlock (& (cdata->mutex));
  
        real_url = g_strdup_printf ("%s/gda-clean.php?%s", cdata->server_base_url, cdata->session_id);
        msg = soup_message_new ("GET", real_url);
@@ -564,8 +564,7 @@ _gda_web_free_cnc_data (WebConnectionData *cdata)
        g_free (cdata->server_base_url);
        g_free (cdata->front_url);
        g_free (cdata->worker_url);
-       if (cdata->mutex)
-               gda_mutex_free (cdata->mutex);
+       g_rec_mutex_clear (& (cdata->mutex));
        if (cdata->worker_session)
                g_object_unref (cdata->worker_session);
        if (cdata->front_session)
diff --git a/providers/web/gda-web.h b/providers/web/gda-web.h
index 814e7a5..7f7297d 100644
--- a/providers/web/gda-web.h
+++ b/providers/web/gda-web.h
@@ -30,7 +30,6 @@
 #define WEB_PROVIDER_NAME "Web"
 
 #include <libsoup/soup.h>
-#include <libgda/gda-mutex.h>
 #include <libgda/gda-connection.h>
 #include <libgda/gda-connection-private.h>
 #include "../reuseable/gda-provider-reuseable.h"
@@ -41,7 +40,7 @@
 typedef struct {
        GdaServerProviderConnectionData parent;
        GdaProviderReuseable *reuseable; /* pointer to GdaProviderReuseable, not inherited! */
-       GdaMutex *mutex; /* protected access */
+       GRecMutex mutex; /* protected access */
 
        gchar *server_id; /* PostgreSQL, MySQL, ... */
        gchar *server_version; /* native representation */
diff --git a/tests/multi-threading/Makefile.am b/tests/multi-threading/Makefile.am
index b33ab82..48a19d6 100644
--- a/tests/multi-threading/Makefile.am
+++ b/tests/multi-threading/Makefile.am
@@ -7,8 +7,8 @@ AM_CPPFLAGS = \
        -DROOT_DIR=\""$(top_srcdir)"\"
 
 TESTS_ENVIRONMENT = GDA_TOP_SRC_DIR="$(abs_top_srcdir)" GDA_TOP_BUILD_DIR="$(abs_top_builddir)"
-TESTS = check_mutex check_parser check_cnc_lock
-check_PROGRAMS = check_mutex check_parser check_cnc_lock
+TESTS = check_parser check_cnc_lock
+check_PROGRAMS = check_parser check_cnc_lock
 
 common_sources = \
         ../test-errors.h \
@@ -16,11 +16,6 @@ common_sources = \
        common.c \
        common.h
 
-check_mutex_SOURCES = check_mutex.c
-check_mutex_LDADD = \
-       $(top_builddir)/libgda/libgda-6.0.la \
-       $(COREDEPS_LIBS)
-
 check_parser_SOURCES = check_parser.c
 check_parser_LDADD = \
        $(top_builddir)/libgda/libgda-6.0.la \
diff --git a/tests/multi-threading/check_parser.c b/tests/multi-threading/check_parser.c
index e7c044e..5e6d4b2 100644
--- a/tests/multi-threading/check_parser.c
+++ b/tests/multi-threading/check_parser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -31,7 +31,7 @@
 #define NTHREADS 3
 
 typedef struct {
-       GMutex            *mutex;
+       GMutex             mutex;
        GPrivate          *thread_priv;
        xmlDocPtr          doc;
        xmlNodePtr         node;
@@ -108,7 +108,7 @@ main (int argc, char** argv)
                        gint i;
                        GThread *threads[NTHREADS];
                        
-                       data.mutex = g_mutex_new ();
+                       g_mutex_init (& (data.mutex));
                        data.thread_priv = g_private_new (g_free);
                        data.doc = doc;
                        data.node = NULL;
@@ -131,7 +131,7 @@ main (int argc, char** argv)
                                g_free (priv);
                        }
                        
-                       g_mutex_free (data.mutex);
+                       g_mutex_clear (& (data.mutex));
                }
        }
        xmlFreeDoc (doc);
@@ -167,11 +167,11 @@ start_thread (ThData *data)
                xmlChar *prov_name;
                GdaSqlParser *parser;
 
-               g_mutex_lock (data->mutex);
+               g_mutex_lock (& (data->mutex));
                        
                if (data->all_done) {
                        ThPrivate *copy = g_new (ThPrivate, 1);
-                       g_mutex_unlock (data->mutex);
+                       g_mutex_unlock (& (data->mutex));
                        *copy = *thpriv;
                        return copy;
                }
@@ -185,7 +185,7 @@ start_thread (ThData *data)
                if (!data->node) {
                        ThPrivate *copy = g_new (ThPrivate, 1);
                        data->all_done = TRUE;
-                       g_mutex_unlock (data->mutex);
+                       g_mutex_unlock (& (data->mutex));
                        *copy = *thpriv;
                        return copy;
                }
@@ -199,7 +199,7 @@ start_thread (ThData *data)
                else
                        parser = g_hash_table_lookup (data->parsers_hash, "");
 
-               g_mutex_unlock (data->mutex);
+               g_mutex_unlock (& (data->mutex));
                g_thread_yield ();
 
                /* test elected node */


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