Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Re-apply old patch A. Giersch 06/07/2010
[simgrid.git] / src / xbt / dynar.c
index 7c3bcc6..79333a9 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);
+    XBT_DEBUG("expand %p from %lu to %lu elements", dynar, old_size, new_size);
 
-    if (old_data) {
-      memcpy(new_data, old_data, used_length);
-      free(old_data);
-    }
-
-    _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;
@@ -316,7 +307,7 @@ void xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots_wanted)
  * kilkil a dynar and its content
  */
 
-XBT_INLINE void xbt_dynar_free(xbt_dynar_t * dynar)
+void xbt_dynar_free(xbt_dynar_t * dynar)
 {
   if (dynar && *dynar) {
     xbt_dynar_reset(*dynar);
@@ -335,7 +326,7 @@ void xbt_dynar_free_voidp(void *d)
  *
  * \param dynar the dynar we want to mesure
  */
-XBT_INLINE unsigned long xbt_dynar_length(const xbt_dynar_t dynar)
+unsigned long xbt_dynar_length(const xbt_dynar_t dynar)
 {
   return (dynar ? (unsigned long) dynar->used : (unsigned long) 0);
 }
@@ -345,7 +336,7 @@ XBT_INLINE unsigned long xbt_dynar_length(const xbt_dynar_t dynar)
  *\param dynar the dynat we want to check
  */
 
-XBT_INLINE int xbt_dynar_is_empty(const xbt_dynar_t dynar)
+int xbt_dynar_is_empty(const xbt_dynar_t dynar)
 {
   return (xbt_dynar_length(dynar) == 0);
 }
@@ -377,7 +368,7 @@ xbt_dynar_get_cpy(const xbt_dynar_t dynar,
  * \warning The returned value is the actual content of the dynar.
  * Make a copy before fooling with it.
  */
-XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
+void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
                                    const unsigned long idx)
 {
 
@@ -583,7 +574,8 @@ int xbt_dynar_member(xbt_dynar_t const dynar, void *const elem)
 
   TRY {
     xbt_dynar_search(dynar, elem);
-  } CATCH(e) {
+  }
+  CATCH(e) {
     if (e.category == not_found_error) {
       xbt_ex_free(e);
       return 0;
@@ -612,7 +604,7 @@ XBT_INLINE void *xbt_dynar_push_ptr(xbt_dynar_t const dynar)
 }
 
 /** @brief Add an element at the end of the dynar */
-XBT_INLINE void xbt_dynar_push(xbt_dynar_t const dynar,
+void xbt_dynar_push(xbt_dynar_t const dynar,
                                const void *const src)
 {
   _dynar_lock(dynar);
@@ -627,7 +619,7 @@ XBT_INLINE void xbt_dynar_push(xbt_dynar_t const dynar,
  * You can then use regular affectation to set its value instead of relying
  * on the slow memcpy. This is what xbt_dynar_pop_as() does.
  */
-XBT_INLINE void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar)
+void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar)
 {
   void *res;
 
@@ -713,7 +705,7 @@ XBT_INLINE void xbt_dynar_map(const xbt_dynar_t dynar,
  *
  * This function can be used while traversing without problem.
  */
-XBT_INLINE void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
+void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
                                     unsigned int *const cursor)
 {