+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("%uelm x %u cells; ", count, size);
+ }
+ }
+ printf("\n");
+ xbt_dynar_free(&sizes);
+}
+
+/**
+ * Create the dict mallocators.
+ * This is an internal XBT function called during the lib initialization.
+ * It can be used several times to recreate the mallocator, for example when you switch to MC mode
+ */
+void xbt_dict_preinit(void)
+{
+ if (dict_elm_mallocator != NULL) {
+ /* Already created. I guess we want to switch to MC mode, so kill the previously created mallocator */
+ xbt_mallocator_free(dict_elm_mallocator);
+ xbt_mallocator_free(dict_het_elm_mallocator);
+ }
+
+ dict_elm_mallocator = xbt_mallocator_new(256,
+ dict_elm_mallocator_new_f,
+ dict_elm_mallocator_free_f,
+ dict_elm_mallocator_reset_f);
+ dict_het_elm_mallocator = xbt_mallocator_new(256,
+ dict_het_elm_mallocator_new_f,
+ dict_het_elm_mallocator_free_f,
+ dict_het_elm_mallocator_reset_f);
+}
+
+/**
+ * Destroy the dict mallocators.
+ * This is an internal XBT function during the lib initialization
+ */
+void xbt_dict_postexit(void)
+{
+ if (dict_elm_mallocator != NULL) {
+ xbt_mallocator_free(dict_elm_mallocator);
+ dict_elm_mallocator = NULL;
+ xbt_mallocator_free(dict_het_elm_mallocator);
+ dict_het_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("%uelm x %d cells; ", count, size);
+ avg += count * size;
+ total_count += size;
+ }
+ printf("; %f elm per cell\n", avg / (double) total_count);
+ }
+}
+