Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use realloc and make _xbt_dynar_expand a bit faster.
[simgrid.git] / src / xbt / dynar.c
index 52d11fb..20b9ec9 100644 (file)
@@ -86,27 +86,18 @@ static XBT_INLINE
   const unsigned long old_size = dynar->size;
 
   if (nb > old_size) {
-    char *const old_data = (char *) dynar->data;
-
+    void *const old_data = dynar->data;
     const unsigned long elmsize = dynar->elmsize;
+    const unsigned long old_length = old_size * elmsize;
 
-    const unsigned long used = dynar->used;
-    const unsigned long used_length = used * elmsize;
-
-    const unsigned long new_size =
-        nb > (2 * (old_size + 1)) ? nb : (2 * (old_size + 1));
+    const unsigned long expand = 2 * (old_size + 1);
+    const unsigned long new_size = (nb > expand ? nb : expand);
     const unsigned long new_length = new_size * elmsize;
-    char *const new_data = (char *) xbt_malloc0(elmsize * new_size);
+    void *const new_data = xbt_realloc(old_data, new_length);
 
-    XBT_DEBUG("expand %p from %lu to %lu elements", (void *) dynar,
-           (unsigned long) old_size, nb);
-
-    if (old_data) {
-      memcpy(new_data, old_data, used_length);
-      free(old_data);
-    }
+    XBT_DEBUG("expand %p from %lu to %lu elements", dynar, old_size, new_size);
 
-    _xbt_clear_mem(new_data + used_length, new_length - used_length);
+    _xbt_clear_mem((char *)new_data + old_length, new_length - old_length);
 
     dynar->size = new_size;
     dynar->data = new_data;
@@ -676,12 +667,13 @@ XBT_INLINE void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst)
 
 static void _dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op)
 {
-  char elm[SIZEOF_MAX];
+  char *const data = (char *) dynar->data;
+  const unsigned long elmsize = dynar->elmsize;
   const unsigned long used = dynar->used;
-  unsigned long i = 0;
+  unsigned long i;
 
   for (i = 0; i < used; i++) {
-    _xbt_dynar_get_elm(elm, dynar, i);
+    char* elm = (char*) data + i * elmsize;
     (*op) (elm);
   }
 }
@@ -744,8 +736,11 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar,
 
   _dynar_lock(dynar);
 
+#ifdef HAVE_MERGESORT
+  mergesort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
+#else
   qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
-
+#endif
   _dynar_unlock(dynar);
 }