-
-namespace simgrid{
-namespace smpi{
-
-std::unordered_map<int, void*>* Keyval::attributes(){
- return &attributes_;
-};
-
-
-template <> int Keyval::call_deleter<Comm>(Comm* obj, smpi_key_elem elem, int keyval, void * value, int* flag){
- if(elem->delete_fn.comm_delete_fn!=MPI_NULL_DELETE_FN){
- int ret = elem->delete_fn.comm_delete_fn(obj, keyval, value, flag);
- if(ret!=MPI_SUCCESS)
- return ret;
- }
- return MPI_SUCCESS;
+#include "xbt/sysdep.h"
+
+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)
+ elem.delete_fn.comm_delete_fn_fort(obj, keyval, value, elem.extra_state, &ret);
+ if (elem.delete_attr)
+ xbt_free(value);
+ return ret;