X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7cd237f9659b2df47fca65a4340ca7b5407f46a0..1cfb920ff29e1da07dd7a038c1250de514da9a00:/src/smpi/mpi/smpi_keyvals.cpp?ds=sidebyside diff --git a/src/smpi/mpi/smpi_keyvals.cpp b/src/smpi/mpi/smpi_keyvals.cpp index 7ddedb633e..e60a2b28be 100644 --- a/src/smpi/mpi/smpi_keyvals.cpp +++ b/src/smpi/mpi/smpi_keyvals.cpp @@ -1,51 +1,59 @@ -/* Copyright (c) 2007-2019. 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* 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* obj, const s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/) +template <> int Keyval::call_deleter(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* obj, const s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/) +template <> int Keyval::call_deleter(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* obj, const s_smpi_key_elem_t* elem, int keyval, void* value, int* /*flag*/) +int Keyval::call_deleter(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