X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cdf6a962eb4e88efbed3df9c41343adabcf09e6c..5a4a50803fa81e171c6c4b6962c597a3b33f55ca:/src/smpi/internals/smpi_shared.cpp diff --git a/src/smpi/internals/smpi_shared.cpp b/src/smpi/internals/smpi_shared.cpp index defbbba636..b549d72efa 100644 --- a/src/smpi/internals/smpi_shared.cpp +++ b/src/smpi/internals/smpi_shared.cpp @@ -342,6 +342,24 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int return mem; } + +void *smpi_shared_malloc_intercept(size_t size, const char *file, int line) { + if( simgrid::config::get_value("smpi/auto-shared-malloc-thresh") == 0 || size < simgrid::config::get_value("smpi/auto-shared-malloc-thresh")) + return ::operator new(size); + else + return smpi_shared_malloc(size, file, line); +} + +void* smpi_shared_calloc_intercept(size_t num_elm, size_t elem_size, const char* file, int line){ + if( simgrid::config::get_value("smpi/auto-shared-malloc-thresh") == 0 || elem_size*num_elm < simgrid::config::get_value("smpi/auto-shared-malloc-thresh")){ + void* ptr = ::operator new(elem_size*num_elm); + memset(ptr, 0, elem_size*num_elm); + return ptr; + } else + return smpi_shared_malloc(elem_size*num_elm, file, line); + +} + void *smpi_shared_malloc(size_t size, const char *file, int line) { if (size > 0 && smpi_cfg_shared_malloc == SharedMallocType::LOCAL) { return smpi_shared_malloc_local(size, file, line); @@ -427,7 +445,7 @@ void smpi_shared_free(void *ptr) snprintf(loc, PTR_STRLEN, "%p", ptr); auto meta = allocs_metadata.find(ptr); if (meta == allocs_metadata.end()) { - XBT_WARN("Cannot free: %p was not shared-allocated by SMPI - maybe its size was 0?", ptr); + ::operator delete(ptr); return; } shared_data_t* data = &meta->second.data->second; @@ -448,11 +466,17 @@ void smpi_shared_free(void *ptr) auto meta = allocs_metadata.find(ptr); if (meta != allocs_metadata.end()){ meta->second.data->second.count--; - if(meta->second.data->second.count==0) + XBT_DEBUG("Shared free - Global - of %p", ptr); + munmap(ptr, meta->second.size); + if(meta->second.data->second.count==0){ delete meta->second.data; + allocs_metadata.erase(ptr); + } + }else{ + ::operator delete(ptr); + return; } - XBT_DEBUG("Shared free - Global - of %p", ptr); - munmap(ptr, meta->second.size); + } else { XBT_DEBUG("Classic deallocation of %p", ptr); ::operator delete(ptr);