From 2960278de1d9e6497a93e0f614530f78cf1075e3 Mon Sep 17 00:00:00 2001 From: Christian Heinrich Date: Wed, 28 Mar 2018 17:30:26 +0200 Subject: [PATCH] [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... --- src/smpi/include/smpi_datatype.hpp | 2 +- src/smpi/mpi/smpi_datatype.cpp | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) 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() -- 2.20.1