From: Gabriel Corona Date: Tue, 5 Apr 2016 11:34:40 +0000 (+0200) Subject: [mc] Use RAII std::string for s_mc_comm_pattern::rdv X-Git-Tag: v3_13~171 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/99a8e224b5973a2cae9e379c140ceaa9c5a467f4?ds=sidebyside [mc] Use RAII std::string for s_mc_comm_pattern::rdv --- diff --git a/src/mc/CommunicationDeterminismChecker.cpp b/src/mc/CommunicationDeterminismChecker.cpp index 368d4e8ffe..f2fb17e1f5 100644 --- a/src/mc/CommunicationDeterminismChecker.cpp +++ b/src/mc/CommunicationDeterminismChecker.cpp @@ -38,7 +38,7 @@ xbt_dynar_t incomplete_communications_pattern; static e_mc_comm_pattern_difference_t compare_comm_pattern(mc_comm_pattern_t comm1, mc_comm_pattern_t comm2) { if(comm1->type != comm2->type) return TYPE_DIFF; - if (strcmp(comm1->rdv, comm2->rdv) != 0) + if (comm1->rdv != comm2->rdv) return RDV_DIFF; if (comm1->src_proc != comm2->src_proc) return SRC_PROC_DIFF; diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index dd04f153ae..de44cf84f2 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -439,17 +439,16 @@ void Process::read_variable(const char* name, void* target, size_t size) const this->read_bytes(target, size, remote(var->address)); } -char* Process::read_string(RemotePtr address) const +std::string Process::read_string(RemotePtr address) const { if (!address) - return nullptr; + return {}; - off_t len = 128; - char* res = (char*) malloc(len); + std::vector res(128); off_t off = 0; while (1) { - ssize_t c = pread(this->memory_file, res + off, len - off, (off_t) address.address() + off); + ssize_t c = pread(this->memory_file, res.data() + off, res.size() - off, (off_t) address.address() + off); if (c == -1) { if (errno == EINTR) continue; @@ -459,15 +458,13 @@ char* Process::read_string(RemotePtr address) const if (c==0) xbt_die("Could not read string from remote process"); - void* p = memchr(res + off, '\0', c); + void* p = memchr(res.data() + off, '\0', c); if (p) - return res; + return std::string(res.data()); off += c; - if (off == len) { - len *= 2; - res = (char*) realloc(res, len); - } + if (off == (off_t) res.size()) + res.resize(res.size() * 2); } } diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index 150f7d1827..b709c33779 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -118,7 +119,7 @@ public: read_variable(name, &res, sizeof(T)); return res; } - char* read_string(RemotePtr address) const; + std::string read_string(RemotePtr address) const; // Write memory: void write_bytes(const void* buffer, size_t len, RemotePtr address); diff --git a/src/mc/mc_comm_pattern.cpp b/src/mc/mc_comm_pattern.cpp index e474ddeb96..e8536f0a2b 100644 --- a/src/mc/mc_comm_pattern.cpp +++ b/src/mc/mc_comm_pattern.cpp @@ -26,7 +26,7 @@ mc_comm_pattern_t MC_comm_pattern_dup(mc_comm_pattern_t comm) res->index = comm->index; res->type = comm->type; res->comm_addr = comm->comm_addr; - res->rdv = xbt_strdup(comm->rdv); + res->rdv = comm->rdv; res->data_size = -1; res->data = nullptr; if (comm->type == SIMIX_COMM_SEND) { diff --git a/src/mc/mc_comm_pattern.h b/src/mc/mc_comm_pattern.h index d944f3df80..1fd9774e30 100644 --- a/src/mc/mc_comm_pattern.h +++ b/src/mc/mc_comm_pattern.h @@ -10,6 +10,8 @@ #include #include +#include + #include #include @@ -29,7 +31,7 @@ typedef struct s_mc_comm_pattern{ unsigned long dst_proc = 0; const char *src_host = nullptr; const char *dst_host = nullptr; - char *rdv = nullptr; + std::string rdv; ssize_t data_size = 0; void *data = nullptr; int tag = 0; @@ -41,7 +43,6 @@ typedef struct s_mc_comm_pattern{ } ~s_mc_comm_pattern() { - xbt_free(this->rdv); xbt_free(this->data); } diff --git a/src/mc/mc_smx.cpp b/src/mc/mc_smx.cpp index 3f6102ffdd..6913890cfd 100644 --- a/src/mc/mc_smx.cpp +++ b/src/mc/mc_smx.cpp @@ -203,11 +203,8 @@ const char* MC_smx_process_get_name(smx_process_t p) return nullptr; simgrid::mc::SimixProcessInformation* info = MC_smx_process_get_info(p); - if (info->name.empty()) { - char* name = process->read_string(p->name); - info->name = name; - free(name); - } + if (info->name.empty()) + info->name = process->read_string(p->name); return info->name.c_str(); }