Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Replace linear search by a faster one.
[simgrid.git] / src / smpi / smpi_shared.cpp
index e0aa0d1..f8033fd 100644 (file)
  *                                                                    \ |  |
  *                                                                      ----
  */
-#include <cstring>
+#include <map>
 
-#include <unordered_map>
-#include <utility>
-
-#include "src/internal_config.h"
 #include "private.h"
 #include "private.hpp"
-#include <xbt/ex.hpp>
 #include "xbt/dict.h"
-//#include "xbt/sysdep.h"
-//#include "xbt/ex.h"
-#include "surf/surf.h"
-#include "simgrid/sg_config.h"
-//#include "simgrid/modelchecker.h"
-//#include "src/mc/mc_replay.h"
+#include <errno.h>
 
 #include <sys/types.h>
 #ifndef WIN32
 #include <sys/mman.h>
 #endif
 #include <sys/stat.h>
-#include <errno.h>
 #include <fcntl.h>
-//#include <math.h> // sqrt
-#include <unistd.h>
 #include <string.h>
 #include <stdio.h>
 
@@ -130,7 +117,7 @@ typedef struct {
   shared_data_key_type* data;
 } shared_metadata_t;
 
-std::unordered_map<void*, shared_metadata_t> allocs_metadata;
+std::map<void*, shared_metadata_t> allocs_metadata;
 xbt_dict_t calls = nullptr;           /* Allocated on first use */
 #ifndef WIN32
 static int smpi_shared_malloc_bogusfile           = -1;
@@ -225,6 +212,8 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
     if (smpi_shared_malloc_bogusfile == -1) {
       /* Create a fd to a new file on disk, make it smpi_shared_malloc_blocksize big, and unlink it.
        * It still exists in memory but not in the file system (thus it cannot be leaked). */
+      smpi_shared_malloc_blocksize = static_cast<unsigned long>(xbt_cfg_get_double("smpi/shared-malloc-blocksize"));
+      XBT_DEBUG("global shared allocation. Blocksize %lu", smpi_shared_malloc_blocksize);
       char* name                   = xbt_strdup("/tmp/simgrid-shmalloc-XXXXXX");
       smpi_shared_malloc_bogusfile = mkstemp(name);
       unlink(name);
@@ -243,7 +232,8 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
       void* res = mmap(pos, smpi_shared_malloc_blocksize, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED | MAP_POPULATE,
                        smpi_shared_malloc_bogusfile, 0);
       xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the "
-                             "STARPU_MALLOC_SIMULATION_FOLD environment variable or the sysctl vm.max_map_count?",
+                             "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));
     }
     if (size % smpi_shared_malloc_blocksize) {
@@ -251,7 +241,8 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
       void* res = mmap(pos, size % smpi_shared_malloc_blocksize, PROT_READ | PROT_WRITE,
                        MAP_FIXED | MAP_SHARED | MAP_POPULATE, smpi_shared_malloc_bogusfile, 0);
       xbt_assert(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the "
-                             "STARPU_MALLOC_SIMULATION_FOLD environment variable or the sysctl vm.max_map_count?",
+                             "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));
     }
 
@@ -271,15 +262,19 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
   return mem;
 }
 
-int smpi_is_shared(void*ptr){
+int smpi_is_shared(void* ptr){
+  if (allocs_metadata.empty())
+    return 0;
   if ( smpi_cfg_shared_malloc == shmalloc_local || smpi_cfg_shared_malloc == shmalloc_global) {
-    if (allocs_metadata.count(ptr) != 0) 
-     return 1;
-    for(auto it : allocs_metadata){
-      if (ptr >= it.first && ptr < (char*)it.first + it.second.size)
-        return 1;
-    }
+    auto low = allocs_metadata.lower_bound(ptr);
+    if (low->first==ptr)
+      return 1;
+    if (low == allocs_metadata.begin())
       return 0;
+    low --;
+    if (ptr < (char*)low->first + low->second.size)
+      return 1;
+    return 0;
   } else {
     return 0;
   }