+xbt_dynar_t all_sizes = NULL;
+/** @brief shows some debugging info about the bucklet repartition */
+void xbt_dict_dump_sizes(xbt_dict_t dict) {
+
+ int i;
+ unsigned int count;
+ unsigned int size;
+ xbt_dictelm_t element;
+ xbt_dynar_t sizes = xbt_dynar_new(sizeof(int),NULL);
+
+ printf("Dict %p: %d bucklets, %d used cells (of %d) ", dict, dict->count, dict->fill,dict->table_size);
+ if (dict != NULL) {
+ for (i = 0; i < dict->table_size; i++) {
+ element = dict->table[i];
+ size = 0;
+ if (element) {
+ while (element != NULL) {
+ size ++;
+ element = element->next;
+ }
+ }
+ if (xbt_dynar_length(sizes) <= size) {
+ int prevsize = 1;
+ xbt_dynar_set(sizes,size,&prevsize);
+ } else {
+ int prevsize;
+ xbt_dynar_get_cpy(sizes,size,&prevsize);
+ prevsize++;
+ xbt_dynar_set(sizes,size,&prevsize);
+ }
+ }
+ if (!all_sizes)
+ all_sizes = xbt_dynar_new(sizeof(int), NULL);
+
+ xbt_dynar_foreach(sizes,count,size) {
+ /* Copy values of this one into all_sizes */
+ int prevcount;
+ if (xbt_dynar_length(all_sizes) <= count) {
+ prevcount = size;
+ xbt_dynar_set(all_sizes,count,&prevcount);
+ } else {
+ xbt_dynar_get_cpy(all_sizes,count,&prevcount);
+ prevcount += size;
+ xbt_dynar_set(all_sizes,count,&prevcount);
+ }
+
+ /* Report current sizes */
+ if (count==0)
+ continue;
+ if (size==0)
+ continue;
+ printf("%delm x %u cells; ",count,size);
+ }
+ }
+ printf("\n");
+ xbt_dynar_free(&sizes);
+}
+
+/**
+ * Destroy the dict mallocators.
+ * This is an internal XBT function called by xbt_exit().
+ */
+void xbt_dict_exit(void) {
+ if (dict_mallocator != NULL) {
+ xbt_mallocator_free(dict_mallocator);
+ dict_mallocator = NULL;
+ xbt_mallocator_free(dict_elm_mallocator);
+ dict_elm_mallocator = NULL;
+ }
+ if (all_sizes) {
+ unsigned int count;
+ int size;
+ double avg = 0;
+ int total_count = 0;
+ printf("Overall stats:");
+ xbt_dynar_foreach(all_sizes,count,size) {
+ if (count==0)
+ continue;
+ if (size==0)
+ continue;
+ printf("%delm x %d cells; ",count,size);
+ avg += count * size;
+ total_count += size;
+ }
+ printf("; %f elm per cell\n",avg/(double)total_count);
+ }
+}
+
+static void* dict_mallocator_new_f(void) {
+ return xbt_new(s_xbt_dict_t, 1);
+}
+
+static void dict_mallocator_free_f(void* dict) {
+ xbt_free(dict);
+}
+
+static void dict_mallocator_reset_f(void* dict) {
+ /* nothing to do because all fields are
+ * initialized in xbt_dict_new
+ */
+}
+