Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Unlock dynar at proper place.
[simgrid.git] / src / xbt / dynar.c
index 5831a78..7ac54dd 100644 (file)
@@ -228,18 +228,11 @@ xbt_dynar_new_sync(const unsigned long elmsize,
 void xbt_dynar_free_container(xbt_dynar_t * dynar)
 {
   if (dynar && *dynar) {
-
-    if ((*dynar)->data) {
-      _xbt_clear_mem((*dynar)->data, (*dynar)->size);
-      free((*dynar)->data);
-    }
-
-    if ((*dynar)->mutex)
-      xbt_mutex_destroy((*dynar)->mutex);
-
-    _xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
-
-    free(*dynar);
+    xbt_dynar_t d = *dynar;
+    free(d->data);
+    if (d->mutex)
+      xbt_mutex_destroy(d->mutex);
+    free(d);
     *dynar = NULL;
   }
 }
@@ -389,18 +382,16 @@ XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
   _dynar_lock(dynar);
   _sanity_check_dynar(dynar);
 
-  _xbt_dynar_expand(dynar, idx + 1);
-
   if (idx >= dynar->used) {
+    _xbt_dynar_expand(dynar, idx + 1);
     _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize,
                    (idx + 1 - dynar->used)*dynar->elmsize);
     dynar->used = idx + 1;
   }
-  
-  _dynar_unlock(dynar);
-
   res = _xbt_dynar_elm(dynar, idx);
 
+  _dynar_unlock(dynar);
+
   return res;
 }
 
@@ -411,9 +402,8 @@ _xbt_dynar_set(xbt_dynar_t dynar,
 
   _sanity_check_dynar(dynar);
 
-  _xbt_dynar_expand(dynar, idx + 1);
-
   if (idx >= dynar->used) {
+    _xbt_dynar_expand(dynar, idx + 1);
     _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize,
                    (idx + 1 - dynar->used)*dynar->elmsize);
     dynar->used = idx + 1;
@@ -1002,7 +992,7 @@ XBT_TEST_UNIT("insert",test_dynar_insert,"Using the xbt_dynar_insert and xbt_dyn
                      "The retrieved value is not the same than the injected one (%d!=%d)",
                      cursor, cpt);
   }
-  xbt_test_assert(xbt_dynar_length(d) == 0,
+  xbt_test_assert(xbt_dynar_is_empty(d),
                    "There is still %lu elements in the dynar after removing everything",
                    xbt_dynar_length(d));
   xbt_dynar_free(&d);
@@ -1030,7 +1020,7 @@ XBT_TEST_UNIT("insert",test_dynar_insert,"Using the xbt_dynar_insert and xbt_dyn
                      "The retrieved value is not the same than the injected one (%d!=%d)",
                      cursor, cpt);
   }
-  xbt_test_assert(xbt_dynar_length(d) == 0,
+  xbt_test_assert(xbt_dynar_is_empty(d),
                    "There is still %lu elements in the dynar after removing everything",
                    xbt_dynar_length(d));
   xbt_dynar_free(&d);