Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
mc: privatized regions now use a vector of pointers for sake of homogeneity
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 20 May 2019 22:07:48 +0000 (00:07 +0200)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Wed, 22 May 2019 08:19:54 +0000 (10:19 +0200)
This commit is ... not very helping the readability as is. I hope to
make a real hierarchy of classes here around soon.

src/mc/compare.cpp
src/mc/sosp/RegionSnapshot.hpp
src/mc/sosp/mc_checkpoint.cpp
src/mc/sosp/mc_snapshot.cpp
src/mc/sosp/mc_snapshot.hpp

index b6e259c..51c99bb 100644 (file)
@@ -1329,8 +1329,8 @@ static int compare_global_variables(simgrid::mc::StateComparator& state, simgrid
 
     // Compare the global variables separately for each simulates process:
     for (size_t i = 0; i < process_count; i++) {
-      if (compare_global_variables(state, object_info, i, &r1->privatized_data()[i], &r2->privatized_data()[i],
-                                   snapshot1, snapshot2))
+      if (compare_global_variables(state, object_info, i, r1->privatized_data()[i].get(),
+                                   r2->privatized_data()[i].get(), snapshot1, snapshot2))
         return 1;
     }
     return 0;
index 7d335bc..87996d7 100644 (file)
@@ -121,7 +121,7 @@ private:
 
   Buffer flat_data_;
   ChunkedData page_numbers_;
-  std::vector<RegionSnapshot> privatized_regions_;
+  std::vector<std::unique_ptr<RegionSnapshot>> privatized_regions_;
 
 public:
   RegionSnapshot() {}
@@ -205,15 +205,15 @@ public:
   }
   ChunkedData const& page_data() const { return page_numbers_; }
 
-  void privatized_data(std::vector<RegionSnapshot> data)
+  void privatized_data(std::vector<std::unique_ptr<RegionSnapshot>> data)
   {
     storage_type_ = StorageType::Privatized;
     flat_data_.clear();
     page_numbers_.clear();
     privatized_regions_ = std::move(data);
   }
-  std::vector<RegionSnapshot> const& privatized_data() const { return privatized_regions_; }
-  std::vector<RegionSnapshot>& privatized_data() { return privatized_regions_; }
+  std::vector<std::unique_ptr<RegionSnapshot>> const& privatized_data() const { return privatized_regions_; }
+  std::vector<std::unique_ptr<RegionSnapshot>>& privatized_data() { return privatized_regions_; }
 
   simgrid::mc::ObjectInformation* object_info() const { return object_info_; }
   void object_info(simgrid::mc::ObjectInformation* info) { object_info_ = info; }
@@ -232,8 +232,8 @@ public:
 
 RegionSnapshot privatized_region(RegionType region_type, void* start_addr, void* permanent_addr, std::size_t size);
 RegionSnapshot dense_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
-simgrid::mc::RegionSnapshot sparse_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
-simgrid::mc::RegionSnapshot region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
+RegionSnapshot sparse_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
+RegionSnapshot region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
 
 } // namespace mc
 } // namespace simgrid
index 99cd848..e614bd3 100644 (file)
@@ -75,7 +75,7 @@ static void restore(RegionSnapshot* region)
 
     case simgrid::mc::StorageType::Privatized:
       for (auto& p : region->privatized_data())
-        restore(&p);
+        restore(p.get());
       break;
 
     default: // includes StorageType::NoData
@@ -97,14 +97,15 @@ RegionSnapshot privatized_region(RegionType region_type, void* start_addr, void*
   mc_model_checker->process().read_bytes(&privatization_regions, sizeof(privatization_regions),
                                          remote(remote_smpi_privatization_regions));
 
-  std::vector<RegionSnapshot> data;
+  std::vector<std::unique_ptr<RegionSnapshot>> data;
   data.reserve(process_count);
   for (size_t i = 0; i < process_count; i++)
-    data.push_back(region(region_type, start_addr, privatization_regions[i].address, size));
+    data.push_back(std::unique_ptr<simgrid::mc::RegionSnapshot>(
+        new RegionSnapshot(region(region_type, start_addr, privatization_regions[i].address, size))));
 
-  RegionSnapshot region = RegionSnapshot(region_type, start_addr, permanent_addr, size);
-  region.privatized_data(std::move(data));
-  return region;
+  RegionSnapshot reg = RegionSnapshot(region_type, start_addr, permanent_addr, size);
+  reg.privatized_data(std::move(data));
+  return reg;
 }
 #endif
 
@@ -123,15 +124,14 @@ static void get_memory_regions(simgrid::mc::RemoteClient* process, simgrid::mc::
   snapshot->add_region(simgrid::mc::RegionType::Heap, nullptr, start_heap, start_heap,
                        (char*)end_heap - (char*)start_heap);
   snapshot->heap_bytes_used_ = mmalloc_get_bytes_used_remote(heap->heaplimit, process->get_malloc_info());
+  snapshot->privatization_index_ = simgrid::mc::ProcessIndexMissing;
 
 #if HAVE_SMPI
   if (mc_model_checker->process().privatized() && MC_smpi_process_count())
     // snapshot->privatization_index = smpi_loaded_page
     mc_model_checker->process().read_variable("smpi_loaded_page", &snapshot->privatization_index_,
                                               sizeof(snapshot->privatization_index_));
-  else
 #endif
-    snapshot->privatization_index_ = simgrid::mc::ProcessIndexMissing;
 }
 
 /** @brief Fills the position of the segments (executable, read-only, read/write).
index 7696bec..4b58752 100644 (file)
@@ -167,9 +167,9 @@ RegionSnapshot* Snapshot::get_region(const void* addr, int process_index) const
       xbt_assert(process_index >= 0, "Missing process index");
       xbt_assert(process_index < (int)region->privatized_data().size(), "Invalid process index");
 
-      RegionSnapshot& priv_region = region->privatized_data()[process_index];
-      xbt_assert(priv_region.contain(simgrid::mc::remote(addr)));
-      return &priv_region;
+      RegionSnapshot* priv_region = region->privatized_data()[process_index].get();
+      xbt_assert(priv_region->contain(simgrid::mc::remote(addr)));
+      return priv_region;
 #else
       xbt_die("Privatized region in a non SMPI build (this should not happen)");
 #endif
index 9e63033..147c7fa 100644 (file)
@@ -35,8 +35,8 @@ static XBT_ALWAYS_INLINE void* mc_translate_address_region(uintptr_t addr, simgr
     case simgrid::mc::StorageType::Privatized: {
       xbt_assert(process_index >= 0, "Missing process index for privatized region");
       xbt_assert((size_t)process_index < region->privatized_data().size(), "Out of range process index");
-      simgrid::mc::RegionSnapshot& subregion = region->privatized_data()[process_index];
-      return mc_translate_address_region(addr, &subregion, process_index);
+      simgrid::mc::RegionSnapshot* subregion = region->privatized_data()[process_index].get();
+      return mc_translate_address_region(addr, subregion, process_index);
     }
     default: // includes StorageType::NoData
       xbt_die("Storage type not supported");