X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4b59504d08b0edfaaf41a2e63f91190c7c7861a2..6128f38b837d35ae9ab3822d9daa6750628caea0:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index bf3c5f6ca8..ede861850e 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -18,7 +18,7 @@ #include "xbt/dynar_private.h" /* type definition, which we share with the code in charge of sending this across the net */ -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays"); #define __sanity_check_dynar(dynar) \ @@ -34,7 +34,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays"); (int) (idx), (unsigned long) dynar->used) #define __check_sloppy_inbound_idx(dynar, idx) \ xbt_assert2(idx <= dynar->used, \ - "dynar is not that long. You asked %d, but it's only %lu long", \ + "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)", \ (int) (idx), (unsigned long) dynar->used) #define __check_populated_dynar(dynar) \ xbt_assert1(dynar->used, \ @@ -127,7 +127,7 @@ xbt_dynar_dump(xbt_dynar_t dynar) { * types (int, char, double, etc) or pointer of pointers (struct **). */ xbt_dynar_t -xbt_dynar_new(const unsigned long elmsize, +xbt_dynar_new(const unsigned long elmsize, void_f_pvoid_t * const free_f) { xbt_dynar_t dynar = xbt_new0(s_xbt_dynar_t,1); @@ -243,8 +243,7 @@ xbt_dynar_get_cpy(const xbt_dynar_t dynar, * Make a copy before fooling with it. */ void* -xbt_dynar_get_ptr(const xbt_dynar_t dynar, - const int idx) { +xbt_dynar_get_ptr(const xbt_dynar_t dynar, const int idx) { __sanity_check_dynar(dynar); __sanity_check_idx(idx); @@ -375,9 +374,16 @@ xbt_dynar_remove_at(xbt_dynar_t const dynar, if (object) { _xbt_dynar_get_elm(object, dynar, idx); } else if (dynar->free_f) { - char elm[SIZEOF_MAX]; - _xbt_dynar_get_elm(elm, dynar, idx); - (*dynar->free_f)(elm); + if (dynar->elmsize <= SIZEOF_MAX) { + char elm[SIZEOF_MAX]; + _xbt_dynar_get_elm(elm, dynar, idx); + (*dynar->free_f)(elm); + } else { + char *elm=malloc(dynar->elmsize); + _xbt_dynar_get_elm(elm, dynar, idx); + (*dynar->free_f)(elm); + free(elm); + } } nb_shift = dynar->used-1 - idx; @@ -590,8 +596,8 @@ void xbt_dynar_cursor_rm(xbt_dynar_t dynar, #define NB_ELEM 5000 XBT_TEST_SUITE("dynar","Dynar data container"); -XBT_LOG_EXTERNAL_CATEGORY(dynar); -XBT_LOG_DEFAULT_CATEGORY(dynar); +XBT_LOG_EXTERNAL_CATEGORY(xbt_dyn); +XBT_LOG_DEFAULT_CATEGORY(xbt_dyn); XBT_TEST_UNIT("int",test_dynar_int,"Dyars of integers") { /* Vars_decl [doxygen cruft] */