Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Let the context version compile properly after the last 'sanitization' of the backtra...
[simgrid.git] / src / xbt / dynar.c
index e4a4a29..1d8786f 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays");
 
-#define _dynar_lock(dynar) \
-           if (dynar->mutex) \
-              xbt_mutex_lock(dynar->mutex)
-#define _dynar_unlock(dynar) \
-           if (dynar->mutex) \
-              xbt_mutex_unlock(dynar->mutex)
+
 #define _sanity_check_dynar(dynar)       \
            xbt_assert0(dynar,           \
                        "dynar is NULL")
@@ -165,6 +160,7 @@ xbt_dynar_new_sync(const unsigned long elmsize,
                void_f_pvoid_t * const free_f) {
    xbt_dynar_t res = xbt_dynar_new(elmsize,free_f);
    res->mutex = xbt_mutex_init();
+   res->synchro_process_pid = -1;
    return res;
 }
 
@@ -184,11 +180,11 @@ xbt_dynar_free_container(xbt_dynar_t *dynar) {
       free((*dynar)->data);
     }
 
-    _xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
-
     if ((*dynar)->mutex) 
        xbt_mutex_destroy((*dynar)->mutex);
      
+    _xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
+
     free(*dynar);
     *dynar=NULL;
   }
@@ -704,6 +700,20 @@ void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) {
   _dynar_unlock(dynar);
 }
 
+void _dynar_lock(xbt_dynar_t dynar) {
+       if ( (dynar->mutex) && (dynar->synchro_process_pid != xbt_getpid()) ) {
+               xbt_mutex_lock(dynar->mutex);
+               dynar->synchro_process_pid = xbt_getpid();
+       }
+
+}
+void _dynar_unlock(xbt_dynar_t dynar) {
+       if (dynar->mutex) {
+               xbt_mutex_unlock(dynar->mutex);
+               dynar->synchro_process_pid = -1;
+       }
+}
+
 #ifdef SIMGRID_TEST
 
 #define NB_ELEM 5000