X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e1a5484101efbff9c8d982a0c4650f7953ee7e2f..492c467dc0dadb58aba6e9bb10df6e0c78b2765f:/src/smpi/internals/smpi_shared.cpp diff --git a/src/smpi/internals/smpi_shared.cpp b/src/smpi/internals/smpi_shared.cpp index dfc99b8446..10ab0ad0ae 100644 --- a/src/smpi/internals/smpi_shared.cpp +++ b/src/smpi/internals/smpi_shared.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -43,14 +43,11 @@ #include -#include -#ifndef WIN32 -#include -#endif +#include "smpi_utils.hpp" #include +#include #include #include -#include "smpi_utils.hpp" #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif @@ -61,7 +58,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_shared, smpi, "Logging specific to SMPI (shared memory macros)"); -namespace{ +namespace { /** Some location in the source code * * This information is used by SMPI_SHARED_MALLOC to allocate some shared memory for all simulated processes. @@ -94,12 +91,10 @@ struct shared_metadata_t { std::map allocs_metadata; std::map> calls; -#ifndef WIN32 int smpi_shared_malloc_bogusfile = -1; int smpi_shared_malloc_bogusfile_huge_page = -1; unsigned long smpi_shared_malloc_blocksize = 1UL << 20; -#endif -} +} // namespace void smpi_shared_destroy() { @@ -108,7 +103,6 @@ void smpi_shared_destroy() calls.clear(); } -#ifndef WIN32 static void* shm_map(int fd, size_t size, shared_data_key_type* data) { void* mem = smpi_temp_shm_mmap(fd, size); @@ -126,9 +120,8 @@ static void *smpi_shared_malloc_local(size_t size, const char *file, int line) { void* mem; smpi_source_location loc(file, line); - auto res = allocs.insert(std::make_pair(loc, shared_data_t())); - auto data = res.first; - if (res.second) { + auto [data, inserted] = allocs.try_emplace(loc); + if (inserted) { // The new element was inserted. int fd = smpi_temp_shm_get(); data->second.fd = fd; @@ -305,7 +298,7 @@ void* smpi_shared_malloc_partial(size_t size, const size_t* shared_block_offsets void* smpi_shared_malloc_intercept(size_t size, const char* file, int line) { if( smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()){ - void* ptr = ::operator new(size); + void* ptr = xbt_malloc(size); if(not smpi_cfg_trace_call_use_absolute_path()) simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr); else @@ -319,18 +312,42 @@ void* smpi_shared_malloc_intercept(size_t size, const char* file, int line) void* smpi_shared_calloc_intercept(size_t num_elm, size_t elem_size, const char* file, int line) { - if( smpi_cfg_auto_shared_malloc_thresh() == 0 || elem_size*num_elm < smpi_cfg_auto_shared_malloc_thresh()){ - void* ptr = ::operator new(elem_size*num_elm); + size_t size = elem_size * num_elm; + if (smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()) { + void* ptr = xbt_malloc0(size); if(not smpi_cfg_trace_call_use_absolute_path()) - simgrid::smpi::utils::account_malloc_size(elem_size*num_elm, simgrid::xbt::Path(file).get_base_name(), line, ptr); + simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr); else - simgrid::smpi::utils::account_malloc_size(elem_size*num_elm, file, line, ptr); - memset(ptr, 0, elem_size*num_elm); + simgrid::smpi::utils::account_malloc_size(size, file, line, ptr); return ptr; } else { - simgrid::smpi::utils::account_shared_size(elem_size*num_elm); - return smpi_shared_malloc(elem_size*num_elm, file, line); + simgrid::smpi::utils::account_shared_size(size); + return memset(smpi_shared_malloc(size, file, line), 0, size); + } +} + +void* smpi_shared_realloc_intercept(void* data, size_t size, const char* file, int line) +{ + if (size == 0) { + smpi_shared_free(data); + return nullptr; } + if (data == nullptr) + return smpi_shared_malloc_intercept(size, file, line); + + auto meta = allocs_metadata.find(data); + if (meta == allocs_metadata.end()) { + XBT_DEBUG("Classical realloc(%p, %zu)", data, size); + return xbt_realloc(data, size); + } + + XBT_DEBUG("Shared realloc(%p, %zu) (old size: %zu)", data, size, meta->second.size); + void* ptr = smpi_shared_malloc_intercept(size, file, line); + if (ptr != data) { + memcpy(ptr, data, std::min(size, meta->second.size)); + smpi_shared_free(data); + } + return ptr; } void* smpi_shared_malloc(size_t size, const char* file, int line) @@ -343,7 +360,7 @@ void* smpi_shared_malloc(size_t size, const char* file, int line) return smpi_shared_malloc_partial(size, shared_block_offsets.data(), nb_shared_blocks); } XBT_DEBUG("Classic allocation of %zu bytes", size); - return ::operator new(size); + return xbt_malloc(size); } int smpi_is_shared(const void* ptr, std::vector> &private_blocks, size_t *offset){ @@ -376,9 +393,9 @@ std::vector> shift_and_frame_private_blocks(const std: size_t offset, size_t buff_size) { std::vector> result; - for (auto const& block : vec) { - auto new_block = std::make_pair(std::min(std::max((size_t)0, block.first - offset), buff_size), - std::min(std::max((size_t)0, block.second - offset), buff_size)); + for (auto const& [block_begin, block_end] : vec) { + auto new_block = std::make_pair(std::clamp(block_begin - offset, (size_t)0, buff_size), + std::clamp(block_end - offset, (size_t)0, buff_size)); if (new_block.second > 0 && new_block.first < buff_size) result.push_back(new_block); } @@ -418,7 +435,7 @@ void smpi_shared_free(void *ptr) if (smpi_cfg_shared_malloc() == SharedMallocType::LOCAL) { auto meta = allocs_metadata.find(ptr); if (meta == allocs_metadata.end()) { - ::operator delete(ptr); + xbt_free(ptr); return; } shared_data_t* data = &meta->second.data->second; @@ -429,7 +446,7 @@ void smpi_shared_free(void *ptr) if (data->count <= 0) { close(data->fd); allocs.erase(allocs.find(meta->second.data->first)); - allocs_metadata.erase(ptr); + allocs_metadata.erase(meta); XBT_DEBUG("Shared free - Local - with removal - of %p", ptr); } else { XBT_DEBUG("Shared free - Local - no removal - of %p, count = %d", ptr, data->count); @@ -443,19 +460,18 @@ void smpi_shared_free(void *ptr) munmap(ptr, meta->second.size); if(meta->second.data->second.count==0){ delete meta->second.data; - allocs_metadata.erase(ptr); + allocs_metadata.erase(meta); } }else{ - ::operator delete(ptr); + xbt_free(ptr); return; } } else { XBT_DEBUG("Classic deallocation of %p", ptr); - ::operator delete(ptr); + xbt_free(ptr); } } -#endif int smpi_shared_known_call(const char* func, const char* input) {