#ifndef SMPI_KEYVALS_HPP_INCLUDED
#define SMPI_KEYVALS_HPP_INCLUDED
+#include "simgrid/s4u/Actor.hpp"
#include "smpi/smpi.h"
#include "xbt/asserts.h"
#include <unordered_map>
+XBT_LOG_EXTERNAL_CATEGORY(smpi);
+
struct smpi_delete_fn {
MPI_Comm_delete_attr_function *comm_delete_fn;
MPI_Type_delete_attr_function *type_delete_fn;
smpi_copy_fn copy_fn;
smpi_delete_fn delete_fn;
void* extra_state;
+ aid_t actor_id;
int refcount;
bool deleted;
bool delete_attr; // if true, xbt_free(attr) on delete: used by Fortran bindings
value.copy_fn = copy_fn;
value.delete_fn = delete_fn;
value.extra_state = extra_state;
+ value.actor_id = simgrid::s4u::this_actor::get_pid();
value.refcount = 0;
value.deleted = false;
value.delete_attr = delete_attr;
return MPI_ERR_ARG;
smpi_key_elem& elem = elem_it->second;
+ if (elem.actor_id != simgrid::s4u::this_actor::get_pid())
+ XBT_CWARN(smpi, "Asked to free keyval '%d' which is owned by actor #%ld", *keyval, elem.actor_id);
+
elem.deleted = true;
if (elem.refcount == 0)
T::keyvals_.erase(elem_it);
return MPI_ERR_ARG;
smpi_key_elem& elem = elem_it->second;
+ if (elem.actor_id != simgrid::s4u::this_actor::get_pid())
+ XBT_CWARN(smpi, "Asked to delete attribute for keyval '%d' which is owned by actor #%ld", keyval, elem.actor_id);
+
int flag = 0;
if (int ret = call_deleter<T>((T*)this, elem, keyval, attr->second, &flag); ret != MPI_SUCCESS)
return ret;
if (auto elem_it = T::keyvals_.find(keyval); elem_it == T::keyvals_.end() || elem_it->second.deleted)
return MPI_ERR_ARG;
+ if (elem_it->second.actor_id != simgrid::s4u::this_actor::get_pid())
+ XBT_CWARN(smpi, "Asked to get attribute for keyval '%d' which is owned by actor #%ld", keyval, elem_it->second.actor_id);
+
if (auto attr = attributes().find(keyval); attr != attributes().end()) {
*static_cast<void**>(attr_value) = attr->second;
*flag=1;
return MPI_ERR_ARG;
smpi_key_elem& elem = elem_it->second;
+ if (elem.actor_id != simgrid::s4u::this_actor::get_pid())
+ XBT_CWARN(smpi, "Asked to put attribute for keyval '%d' which is owned by actor #%ld", keyval, elem.actor_id);
+
if (auto [attr, inserted] = attributes().try_emplace(keyval, attr_value); inserted) {
elem.refcount++;
} else {
auto elem_it = T::keyvals_.find(key);
xbt_assert(elem_it != T::keyvals_.end());
smpi_key_elem& elem = elem_it->second;
+ if (elem.actor_id != simgrid::s4u::this_actor::get_pid())
+ XBT_CWARN(smpi, "Delete attribute for keyval '%d' which is owned by actor #%ld", it.first, elem.actor_id);
+
int flag = 0;
call_deleter<T>((T*)this, elem, key, value, &flag);
elem.refcount--;