From: Arnaud Giersch Date: Fri, 28 May 2021 15:16:30 +0000 (+0200) Subject: Fix refcount for Datatype_contents. X-Git-Tag: v3.28~206 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/8394a0c6dcbc6c3c9dfc53a50550e46c4ef93473 Fix refcount for Datatype_contents. Error seen with Petsc test: vec_is_sf_tutorials-ex3_basic_dupped. --- diff --git a/src/smpi/include/smpi_datatype.hpp b/src/smpi/include/smpi_datatype.hpp index 7bd716a7bc..434299a972 100644 --- a/src/smpi/include/smpi_datatype.hpp +++ b/src/smpi/include/smpi_datatype.hpp @@ -94,6 +94,7 @@ class Datatype_contents { int number_of_integers, const int* integers, int number_of_addresses, const MPI_Aint* addresses, int number_of_datatypes, const MPI_Datatype* datatypes); + ~Datatype_contents(); }; class Datatype : public F2C, public Keyval{ diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index 8fb7e77162..3f5b211697 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -315,7 +315,8 @@ int Datatype::get_contents(int max_integers, int max_addresses, int max_datatype if (static_cast(max_datatypes) < contents_->datatypes_.size()) return MPI_ERR_COUNT; std::copy(begin(contents_->datatypes_), end(contents_->datatypes_), array_of_datatypes); - std::for_each(begin(contents_->datatypes_), end(contents_->datatypes_), std::mem_fn(&Datatype::ref)); + for (auto& datatype : contents_->datatypes_) + datatype->ref(); return MPI_SUCCESS; } diff --git a/src/smpi/mpi/smpi_datatype_derived.cpp b/src/smpi/mpi/smpi_datatype_derived.cpp index b9c9cf7b57..60ccd26e97 100644 --- a/src/smpi/mpi/smpi_datatype_derived.cpp +++ b/src/smpi/mpi/smpi_datatype_derived.cpp @@ -21,6 +21,14 @@ Datatype_contents::Datatype_contents(int combiner, int number_of_integers, const , addresses_(addresses, addresses + number_of_addresses) , datatypes_(datatypes, datatypes + number_of_datatypes) { + for (auto& datatype : datatypes_) + datatype->ref(); +} + +Datatype_contents::~Datatype_contents() +{ + for (auto& datatype : datatypes_) + Datatype::unref(datatype); } Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type)