- errcode = gras_dict_retrieve_ext (set->dict,
- elm->name, elm->name_len,
- (void**) &found_in_dict);
- if (errcode == no_error) {
- elm->ID=found_in_dict->ID;
- DEBUG2("Reinsertion of key %s (id %d)", elm->name, elm->ID);
- TRY(gras_dict_insert_ext(set->dict, elm->name, elm->name_len, elm, free_func));
- TRY(gras_dynar_set(set->dynar, elm->ID, &elm));
- return no_error;
-
- } else if (errcode != mismatch_error) {
- return errcode; /* I expected mismatch_error */
+ TRY {
+ found_in_dict = xbt_dict_get_ext (set->dict,
+ elm->name, elm->name_len);
+ } CATCH(e) {
+ if (e.category != not_found_error)
+ RETHROW;
+ found = 0;
+ elm->ID = xbt_dynar_length( set->dynar );
+ xbt_dict_set_ext(set->dict, elm->name, elm->name_len, elm, free_func);
+ xbt_dynar_set(set->dynar, elm->ID, &elm);
+ DEBUG2("Insertion of key '%s' (id %d)", elm->name, elm->ID);
+ xbt_ex_free(e);
+ }
+
+ if (found) {
+ if (elm == found_in_dict) {
+ DEBUG2("Ignoring request to insert the same element twice (key %s ; id %d)",
+ elm->name, elm->ID);
+ return;
+ } else {
+ elm->ID=found_in_dict->ID;
+ DEBUG2("Reinsertion of key %s (id %d)", elm->name, elm->ID);
+ xbt_dict_set_ext(set->dict, elm->name, elm->name_len, elm, free_func);
+ xbt_dynar_set(set->dynar, elm->ID, &elm);
+ return;
+ }