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 bfc555c..e60a2b2 100644 (file)
@@ -1,51 +1,59 @@
-/* Copyright (c) 2007-2020. The SimGrid Team.
+/* Copyright (c) 2007-2023. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-//#include "private.hpp"
 #include "smpi_keyvals.hpp"
+#include "xbt/sysdep.h"
 
-namespace simgrid{
-namespace smpi{
+namespace simgrid::smpi {
 
-std::unordered_map<int, void*>* Keyval::attributes(){
-  return &attributes_;
-}
+#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 s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/)
+template <> int Keyval::call_deleter<Comm>(Comm* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
 {
   int ret = MPI_SUCCESS;
-  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);
+  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;
 }
 
-template <>
-int Keyval::call_deleter<Win>(Win* obj, const s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/)
+template <> int Keyval::call_deleter<Win>(Win* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
 {
   int ret = MPI_SUCCESS;
-  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)
-    elem->delete_fn.win_delete_fn_fort(obj, keyval, value, elem->extra_state, &ret);
+  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)
+    elem.delete_fn.win_delete_fn_fort(obj, keyval, value, elem.extra_state, &ret);
+  if (elem.delete_attr)
+    xbt_free(value);
   return ret;
 }
 
 template <>
-int Keyval::call_deleter<Datatype>(Datatype* obj, const s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/)
+int Keyval::call_deleter<Datatype>(Datatype* obj, const smpi_key_elem& elem, int keyval, void* value, int* /*flag*/)
 {
   int ret = MPI_SUCCESS;
-  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)
-    elem->delete_fn.type_delete_fn_fort(obj, keyval, value, elem->extra_state, &ret);
+  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)
+    elem.delete_fn.type_delete_fn_fort(obj, keyval, value, elem.extra_state, &ret);
+  if (elem.delete_attr)
+    xbt_free(value);
   return ret;
 }
 
-}
-}
+} // namespace simgrid::smpi