- if (not attributes()->empty()) {
- int flag=0;
- for (auto const& it : attributes_) {
- auto elm = T::keyvals_.find(it.first);
- if (elm != T::keyvals_.end()) {
- smpi_key_elem elem = elm->second;
- if(elem != nullptr){
- call_deleter<T>((T*)this, elem, it.first,it.second,&flag);
- }
- } else {
- // already deleted, not a problem
- flag=0;
- }
- }
+ for (auto const& [key, value] : attributes()) {
+ auto elem_it = T::keyvals_.find(key);
+ xbt_assert(elem_it != T::keyvals_.end());
+ smpi_key_elem& elem = elem_it->second;
+ int flag = 0;
+ call_deleter<T>((T*)this, elem, key, value, &flag);
+ elem.refcount--;
+ if (elem.deleted && elem.refcount == 0)
+ T::keyvals_.erase(elem_it);