- if (not attributes()->empty()) {
- int flag=0;
- for(auto it : attributes_){
- try{
- smpi_key_elem elem = T::keyvals_.at(it.first);
- if(elem != nullptr){
- call_deleter<T>((T*)this, elem, it.first,it.second,&flag);
- }
- }catch(const std::out_of_range& oor) {
- //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);