namespace simgrid::smpi {
+#define CHECK_OWNER(aid) \
+ if (not s4u::Actor::by_pid(aid)) { \
+ XBT_CWARN(smpi, "Actor #%ld not found. Skip delete callback.", aid); \
+ return ret; \
+ } else \
+ (void)0
+
template <> int Keyval::call_deleter<Comm>(Comm* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
{
int ret = MPI_SUCCESS;
+ CHECK_OWNER(elem.actor_id);
if (elem.delete_fn.comm_delete_fn != MPI_NULL_DELETE_FN)
ret = elem.delete_fn.comm_delete_fn(obj, keyval, value, elem.extra_state);
else if (elem.delete_fn.comm_delete_fn_fort != MPI_NULL_DELETE_FN)
template <> int Keyval::call_deleter<Win>(Win* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
{
int ret = MPI_SUCCESS;
+ CHECK_OWNER(elem.actor_id);
if (elem.delete_fn.win_delete_fn != MPI_NULL_DELETE_FN)
ret = elem.delete_fn.win_delete_fn(obj, keyval, value, elem.extra_state);
else if (elem.delete_fn.win_delete_fn_fort != MPI_NULL_DELETE_FN)
int Keyval::call_deleter<Datatype>(Datatype* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
{
int ret = MPI_SUCCESS;
+ CHECK_OWNER(elem.actor_id);
if (elem.delete_fn.type_delete_fn != MPI_NULL_DELETE_FN)
ret = elem.delete_fn.type_delete_fn(obj, keyval, value, elem.extra_state);
else if (elem.delete_fn.type_delete_fn_fort != MPI_NULL_DELETE_FN)