Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
log tweakings
[simgrid.git] / src / xbt / dynar.c
index bf3c5f6..ede8618 100644 (file)
@@ -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] */