X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0199ba108d66c94df94e4f044994e79efdece4b1..4306c7bae7bd9715eb3d691677c0106f80801f15:/src/smpi/internals/smpi_memory.cpp diff --git a/src/smpi/internals/smpi_memory.cpp b/src/smpi/internals/smpi_memory.cpp index 40bd1e4a6d..77ea460d03 100644 --- a/src/smpi/internals/smpi_memory.cpp +++ b/src/smpi/internals/smpi_memory.cpp @@ -1,8 +1,14 @@ -/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2015-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. */ +#include "private.hpp" +#include "src/internal_config.h" +#include "src/kernel/EngineImpl.hpp" +#include "src/smpi/include/smpi_actor.hpp" +#include "src/xbt/memory_map.hpp" + #include #include #include @@ -12,25 +18,17 @@ #include #include #include +#include #include #include -#include - -#ifndef WIN32 -#include #include - -#include "src/internal_config.h" -#include "src/xbt/memory_map.hpp" - -#include "private.hpp" -#include "src/smpi/include/smpi_actor.hpp" +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_memory, smpi, "Memory layout support for SMPI"); -char* smpi_data_exe_start = nullptr; -size_t smpi_data_exe_size = 0; -SmpiPrivStrategies smpi_privatize_global_variables; +static char* smpi_data_exe_start = nullptr; // start of the data+bss segment of the executable +static size_t smpi_data_exe_size = 0; // size of the data+bss segment of the executable +static SmpiPrivStrategies smpi_privatize_global_variables; static void* smpi_data_exe_copy; // Initialized by smpi_prepare_global_memory_segment(). @@ -54,8 +52,9 @@ void smpi_prepare_global_memory_segment() static void smpi_get_executable_global_size() { - char* buffer = realpath(simgrid::xbt::binary_name.c_str(), nullptr); - xbt_assert(buffer != nullptr, "Could not resolve real path of binary file '%s'", simgrid::xbt::binary_name.c_str()); + const auto* binary_name = simgrid::kernel::EngineImpl::get_instance()->get_cmdline().front().c_str(); + char* buffer = realpath(binary_name, nullptr); + xbt_assert(buffer != nullptr, "Could not resolve real path of binary file '%s'", binary_name); std::string full_name = buffer; free(buffer); @@ -71,9 +70,8 @@ static void smpi_get_executable_global_size() /* Here we are making the assumption that a suitable empty region following the rw- area is the end of the data segment. It would be better to check with the size of the data segment. */ - auto j = i + 1; - if (j != map.end() && j->pathname.empty() && (j->prot & PROT_RWX) == PROT_RW && - (char*)j->start_addr == smpi_data_exe_start + smpi_data_exe_size) { + if (auto j = i + 1; j != map.end() && j->pathname.empty() && (j->prot & PROT_RWX) == PROT_RW && + (char*)j->start_addr == smpi_data_exe_start + smpi_data_exe_size) { // Only count the portion of this region not present in the initial map. auto found = std::find_if(initial_vm_map.begin(), initial_vm_map.end(), [&j](const simgrid::xbt::VmMap& m) { return j->start_addr <= m.start_addr && m.start_addr < j->end_addr; @@ -86,7 +84,6 @@ static void smpi_get_executable_global_size() } xbt_die("Did not find my data segment."); } -#endif #if HAVE_SANITIZER_ADDRESS #include @@ -98,7 +95,7 @@ static void* asan_safe_memcpy(void* dest, void* src, size_t n) while (i < n && __asan_address_is_poisoned(psrc + i)) ++i; if (i < n) { - char* p = static_cast(__asan_region_is_poisoned(psrc + i, n - i)); + const char* p = static_cast(__asan_region_is_poisoned(psrc + i, n - i)); size_t j = p ? (p - psrc) : n; memcpy(pdest + i, psrc + i, j - i); i = j;