From: Christian Heinrich Date: Wed, 28 Mar 2018 15:30:26 +0000 (+0200) Subject: [SMPI] Datatype: Make the dt id a std::string X-Git-Tag: v3.20~600^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/2960278de1d9e6497a93e0f614530f78cf1075e3?hp=-c [SMPI] Datatype: Make the dt id a std::string Currently, the Datatype::encode() function returns a const char*. Using a temporary object as returned from std::to_string() would return a temporary memory address via .c_str() and hence cannot be used. Once encode has been moved to std::string, this could potentially be an int again... --- 2960278de1d9e6497a93e0f614530f78cf1075e3 diff --git a/src/smpi/include/smpi_datatype.hpp b/src/smpi/include/smpi_datatype.hpp index 160a9f970f..9318570fdd 100644 --- a/src/smpi/include/smpi_datatype.hpp +++ b/src/smpi/include/smpi_datatype.hpp @@ -80,7 +80,7 @@ class Datatype : public F2C, public Keyval{ * It's default value is set to -1 since some code expects this return value * when no other id has been assigned */ - int id = -1; + std::string id = "-1"; size_t size_; MPI_Aint lb_; MPI_Aint ub_; diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index 88b8750d21..de11260b77 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -9,10 +9,11 @@ #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" #include "smpi_process.hpp" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)"); -static std::unordered_map id2type_lookup; +static std::unordered_map id2type_lookup; #define CREATE_MPI_DATATYPE(name, id, type) \ static simgrid::smpi::Datatype mpi_##name((char*)#name, id, sizeof(type), /* size */ \ @@ -97,9 +98,9 @@ namespace smpi{ std::unordered_map Datatype::keyvals_; // required by the Keyval class implementation int Datatype::keyval_id_=0; // required by the Keyval class implementation -Datatype::Datatype(int id, int size, MPI_Aint lb, MPI_Aint ub, int flags) : Datatype(size, lb, ub, flags) +Datatype::Datatype(int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags) : Datatype(size, lb, ub, flags) { - id = id; + id = std::to_string(ident); } Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(1){ #if SIMGRID_HAVE_MC @@ -109,8 +110,8 @@ Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr } //for predefined types, so in_use = 0. -Datatype::Datatype(char* name, int id, int size, MPI_Aint lb, MPI_Aint ub, int flags) - : name_(name), id(id), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0) +Datatype::Datatype(char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags) + : name_(name), id(std::to_string(ident)), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0) { id2type_lookup.insert({id, this}); #if SIMGRID_HAVE_MC @@ -207,12 +208,12 @@ const char* Datatype::encode(MPI_Datatype dt) if (dt == MPI_DATATYPE_NULL) return "-1"; - return std::to_string(dt->id).c_str(); + return dt->id.c_str(); } MPI_Datatype Datatype::decode(std::string datatype_id) { - return id2type_lookup.find(std::stoi(datatype_id))->second; + return id2type_lookup.find(datatype_id)->second; } bool Datatype::is_replayable()