X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eb3aab21bef7315d8d2b8481b9c0c7800049c10c..3a9be3b03e764af6a69418124a4e213713b2fd6d:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 51d207b14a..79333a95b7 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -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); - - XBT_DEBUG("expand %p from %lu to %lu elements", (void *) dynar, - (unsigned long) old_size, nb); + void *const new_data = xbt_realloc(old_data, new_length); - 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; @@ -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) { @@ -745,8 +737,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); }