]> AND Public Git Repository - simgrid.git/blobdiff - src/smpi/internals/smpi_shared.cpp
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Unused variables.
[simgrid.git] / src / smpi / internals / smpi_shared.cpp
index cfc746ee9ffb35e2f9e18a0d8a6469fa3e37b3d7..1ba5158936ec6f563fa98d5999dd045522156d40 100644 (file)
@@ -59,8 +59,6 @@
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_shared, smpi, "Logging specific to SMPI (shared memory macros)");
 
-#define PTR_STRLEN (2 + 2 * sizeof(void*) + 1)
-
 namespace{
 /** Some location in the source code
  *
@@ -91,7 +89,7 @@ struct shared_metadata_t {
   shared_data_key_type* data;
 };
 
-std::map<void*, shared_metadata_t> allocs_metadata;
+std::map<const void*, shared_metadata_t> allocs_metadata;
 std::map<std::string, void*> calls;
 
 #ifndef WIN32
@@ -120,7 +118,6 @@ static size_t shm_size(int fd) {
 
 #ifndef WIN32
 static void* shm_map(int fd, size_t size, shared_data_key_type* data) {
-  char loc[PTR_STRLEN];
   shared_metadata_t meta;
 
   if(size > shm_size(fd) && (ftruncate(fd, static_cast<off_t>(size)) < 0)) {
@@ -137,7 +134,6 @@ static void* shm_map(int fd, size_t size, shared_data_key_type* data) {
             "information.",
             fd, size, strerror(errno));
   }
-  snprintf(loc, PTR_STRLEN, "%p", mem);
   meta.size = size;
   meta.data = data;
   meta.allocated_ptr   = mem;
@@ -282,7 +278,7 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int
       void* res = mmap(pos, smpi_shared_malloc_blocksize, PROT_READ | PROT_WRITE, mmap_flag,
                        huge_fd, 0);
       xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the "
-                             "size of the mapped file using --cfg=smpi/shared-malloc-blocksize=newvalue (default 1048576) ? "
+                             "size of the mapped file using --cfg=smpi/shared-malloc-blocksize:newvalue (default 1048576) ? "
                              "You can also try using  the sysctl vm.max_map_count. "
                              "If you are using huge pages, check that you have at least one huge page (/proc/sys/vm/nr_hugepages) "
                              "and that the directory you are passing is mounted correctly (mount /path/to/huge -t hugetlbfs -o rw,mode=0777).",
@@ -296,7 +292,7 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int
       void* res = mmap(pos, low_page_stop_offset-low_page_start_offset, PROT_READ | PROT_WRITE, mmap_base_flag, // not a full huge page
                        smpi_shared_malloc_bogusfile, 0);
       xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the "
-                             "size of the mapped file using --cfg=smpi/shared-malloc-blocksize=newvalue (default 1048576) ?"
+                             "size of the mapped file using --cfg=smpi/shared-malloc-blocksize:newvalue (default 1048576) ?"
                              "You can also try using  the sysctl vm.max_map_count",
                  strerror(errno));
     }
@@ -308,7 +304,7 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int
         void* res = mmap(pos, high_page_stop_offset-stop_block_offset, PROT_READ | PROT_WRITE, mmap_base_flag, // not a full huge page
                          smpi_shared_malloc_bogusfile, 0);
         xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the "
-                               "size of the mapped file using --cfg=smpi/shared-malloc-blocksize=newvalue (default 1048576) ?"
+                               "size of the mapped file using --cfg=smpi/shared-malloc-blocksize:newvalue (default 1048576) ?"
                                "You can also try using  the sysctl vm.max_map_count",
                    strerror(errno));
       }
@@ -342,10 +338,28 @@ 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( smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_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( 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);
+    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) {
+  if (size > 0 && smpi_cfg_shared_malloc() == SharedMallocType::LOCAL) {
     return smpi_shared_malloc_local(size, file, line);
-  } else if (smpi_cfg_shared_malloc == SharedMallocType::GLOBAL) {
+  } else if (smpi_cfg_shared_malloc() == SharedMallocType::GLOBAL) {
     int nb_shared_blocks = 1;
     size_t shared_block_offsets[2] = {0, size};
     return smpi_shared_malloc_partial(size, shared_block_offsets, nb_shared_blocks);
@@ -354,11 +368,11 @@ void *smpi_shared_malloc(size_t size, const char *file, int line) {
   return ::operator new(size);
 }
 
-int smpi_is_shared(void* ptr, std::vector<std::pair<size_t, size_t>> &private_blocks, size_t *offset){
+int smpi_is_shared(const void* ptr, std::vector<std::pair<size_t, size_t>> &private_blocks, size_t *offset){
   private_blocks.clear(); // being paranoid
   if (allocs_metadata.empty())
     return 0;
-  if (smpi_cfg_shared_malloc == SharedMallocType::LOCAL || smpi_cfg_shared_malloc == SharedMallocType::GLOBAL) {
+  if (smpi_cfg_shared_malloc() == SharedMallocType::LOCAL || smpi_cfg_shared_malloc() == SharedMallocType::GLOBAL) {
     auto low = allocs_metadata.lower_bound(ptr);
     if (low != allocs_metadata.end() && low->first == ptr) {
       private_blocks = low->second.private_blocks;
@@ -422,12 +436,10 @@ std::vector<std::pair<size_t, size_t>> merge_private_blocks(const std::vector<st
 
 void smpi_shared_free(void *ptr)
 {
-  if (smpi_cfg_shared_malloc == SharedMallocType::LOCAL) {
-    char loc[PTR_STRLEN];
-    snprintf(loc, PTR_STRLEN, "%p", ptr);
+  if (smpi_cfg_shared_malloc() == SharedMallocType::LOCAL) {
     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;
@@ -444,15 +456,21 @@ void smpi_shared_free(void *ptr)
       XBT_DEBUG("Shared free - Local - no removal - of %p, count = %d", ptr, data->count);
     }
 
-  } else if (smpi_cfg_shared_malloc == SharedMallocType::GLOBAL) {
+  } else if (smpi_cfg_shared_malloc() == SharedMallocType::GLOBAL) {
     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);