Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Check owner for MPI keyvals, and skip callbacks for dead actors.
[simgrid.git] / src / smpi / mpi / smpi_keyvals.cpp
index b1c61a3..e60a2b2 100644 (file)
@@ -9,9 +9,17 @@
 
 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)
@@ -24,6 +32,7 @@ template <> int Keyval::call_deleter<Comm>(Comm* obj, const smpi_key_elem& elem,
 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)
@@ -37,6 +46,7 @@ template <>
 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)