From: Arnaud Giersch Date: Wed, 6 Mar 2019 22:07:09 +0000 (+0100) Subject: Use C++ memory operators for smpi buffers. X-Git-Tag: v3.22.2~21 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/a340d551febe4876af2efe881b0d79a70ee0ace4 Use C++ memory operators for smpi buffers. NOTE: there is a problem with the current implementation. When a resize() happen, the previous pointer may be invalid, even if it is still in use. --- diff --git a/include/simgrid/smpi/replay.hpp b/include/simgrid/smpi/replay.hpp index 91f8943bd8..f1f432d440 100644 --- a/include/simgrid/smpi/replay.hpp +++ b/include/simgrid/smpi/replay.hpp @@ -31,8 +31,8 @@ } \ } -XBT_PRIVATE void* smpi_get_tmp_sendbuffer(int size); -XBT_PRIVATE void* smpi_get_tmp_recvbuffer(int size); +XBT_PRIVATE void* smpi_get_tmp_sendbuffer(size_t size); +XBT_PRIVATE void* smpi_get_tmp_recvbuffer(size_t size); XBT_PRIVATE void log_timed_action(simgrid::xbt::ReplayAction& action, double clock); diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index 2f135703ae..39946e0ab7 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -112,9 +112,9 @@ XBT_PRIVATE void smpi_bench_begin(); XBT_PRIVATE void smpi_bench_end(); XBT_PRIVATE void smpi_shared_destroy(); -XBT_PRIVATE void* smpi_get_tmp_sendbuffer(int size); -XBT_PRIVATE void* smpi_get_tmp_recvbuffer(int size); -XBT_PRIVATE void smpi_free_tmp_buffer(void* buf); +XBT_PRIVATE void* smpi_get_tmp_sendbuffer(size_t size); +XBT_PRIVATE void* smpi_get_tmp_recvbuffer(size_t size); +XBT_PRIVATE void smpi_free_tmp_buffer(const void* buf); XBT_PRIVATE void smpi_free_replay_tmp_buffers(); extern "C" { diff --git a/src/smpi/internals/smpi_memory.cpp b/src/smpi/internals/smpi_memory.cpp index 04a59d607c..2544ad6d0b 100644 --- a/src/smpi/internals/smpi_memory.cpp +++ b/src/smpi/internals/smpi_memory.cpp @@ -250,40 +250,39 @@ void smpi_destroy_global_memory_segments(){ #endif } -static int sendbuffer_size = 0; -static char* sendbuffer = nullptr; -static int recvbuffer_size = 0; -static char* recvbuffer = nullptr; +static std::vector sendbuffer; +static std::vector recvbuffer; //allocate a single buffer for all sends, growing it if needed -void* smpi_get_tmp_sendbuffer(int size) +void* smpi_get_tmp_sendbuffer(size_t size) { if (not smpi_process()->replaying()) - return xbt_malloc(size); - if (sendbuffer_size(xbt_realloc(sendbuffer,size)); - sendbuffer_size=size; - } - return sendbuffer; + return new unsigned char[size]; + // FIXME: a resize() may invalidate a previous pointer. Maybe we need to handle a queue of buffers with a reference + // counter. The same holds for smpi_get_tmp_recvbuffer. + if (sendbuffer.size() < size) + sendbuffer.resize(size); + return sendbuffer.data(); } //allocate a single buffer for all recv -void* smpi_get_tmp_recvbuffer(int size){ +void* smpi_get_tmp_recvbuffer(size_t size) +{ if (not smpi_process()->replaying()) - return xbt_malloc(size); - if (recvbuffer_size(xbt_realloc(recvbuffer,size)); - recvbuffer_size=size; - } - return recvbuffer; + return new unsigned char[size]; + if (recvbuffer.size() < size) + recvbuffer.resize(size); + return recvbuffer.data(); } -void smpi_free_tmp_buffer(void* buf){ +void smpi_free_tmp_buffer(const void* buf) +{ if (not smpi_process()->replaying()) - xbt_free(buf); + delete[] static_cast(buf); } -void smpi_free_replay_tmp_buffers(){ - xbt_free(sendbuffer); - xbt_free(recvbuffer); +void smpi_free_replay_tmp_buffers() +{ + std::vector().swap(sendbuffer); + std::vector().swap(recvbuffer); }