Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix mc_translate_address() for MC_REGION_STORAGE_TYPE_PRIVATIZED:
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 28 May 2015 12:44:28 +0000 (14:44 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 28 May 2015 12:44:28 +0000 (14:44 +0200)
It was incorrectly calling itself insteaf of translating the region in
the "sub-region".

src/mc/mc_snapshot.cpp
src/mc/mc_snapshot.h

index 270a6ae..f72b64d 100644 (file)
@@ -82,7 +82,7 @@ const void* MC_region_read_fragmented(mc_mem_region_t region, void* target, cons
 
   // Read each page:
   while (mc_page_number(NULL, addr) != page_end) {
 
   // Read each page:
   while (mc_page_number(NULL, addr) != page_end) {
-    void* snapshot_addr = mc_translate_address_region((uintptr_t) addr, region);
+    void* snapshot_addr = mc_translate_address_region_chunked((uintptr_t) addr, region);
     void* next_page = mc_page_from_number(NULL, mc_page_number(NULL, addr) + 1);
     size_t readable = (char*) next_page - (char*) addr;
     memcpy(dest, snapshot_addr, readable);
     void* next_page = mc_page_from_number(NULL, mc_page_number(NULL, addr) + 1);
     size_t readable = (char*) next_page - (char*) addr;
     memcpy(dest, snapshot_addr, readable);
@@ -92,7 +92,7 @@ const void* MC_region_read_fragmented(mc_mem_region_t region, void* target, cons
   }
 
   // Read the end:
   }
 
   // Read the end:
-  void* snapshot_addr = mc_translate_address_region((uintptr_t)addr, region);
+  void* snapshot_addr = mc_translate_address_region_chunked((uintptr_t)addr, region);
   memcpy(dest, snapshot_addr, size);
 
   return target;
   memcpy(dest, snapshot_addr, size);
 
   return target;
index e56fee0..d186663 100644 (file)
@@ -110,7 +110,7 @@ bool mc_region_contain(mc_mem_region_t region, const void* p)
 }
 
 static inline __attribute__((always_inline))
 }
 
 static inline __attribute__((always_inline))
-void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region)
+void* mc_translate_address_region_chunked(uintptr_t addr, mc_mem_region_t region)
 {
   size_t pageno = mc_page_number(region->start_addr, (void*) addr);
   size_t snapshot_pageno = region->chunked.page_numbers[pageno];
 {
   size_t pageno = mc_page_number(region->start_addr, (void*) addr);
   size_t snapshot_pageno = region->chunked.page_numbers[pageno];
@@ -119,6 +119,36 @@ void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region)
   return (char*) snapshot_page + mc_page_offset((void*) addr);
 }
 
   return (char*) snapshot_page + mc_page_offset((void*) addr);
 }
 
+static inline __attribute__((always_inline))
+void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region, int process_index)
+{
+  switch (region->storage_type) {
+  case MC_REGION_STORAGE_TYPE_NONE:
+  default:
+    xbt_die("Storage type not supported");
+
+  case MC_REGION_STORAGE_TYPE_FLAT:
+    {
+      uintptr_t offset = addr - (uintptr_t) region->start_addr;
+      return (void *) ((uintptr_t) region->flat.data + offset);
+    }
+
+  case MC_REGION_STORAGE_TYPE_CHUNKED:
+    return mc_translate_address_region_chunked(addr, region);
+
+  case MC_REGION_STORAGE_TYPE_PRIVATIZED:
+    {
+      xbt_assert(process_index >=0,
+        "Missing process index for privatized region");
+      xbt_assert((size_t) process_index < region->privatized.regions_count,
+        "Out of range process index");
+      mc_mem_region_t subregion = region->privatized.regions[process_index];
+      xbt_assert(subregion, "Missing memory region for process %i", process_index);
+      return mc_translate_address_region(addr, subregion, process_index);
+    }
+  }
+}
+
 XBT_INTERNAL mc_mem_region_t mc_get_snapshot_region(
   const void* addr, const s_mc_snapshot_t *snapshot, int process_index);
 
 XBT_INTERNAL mc_mem_region_t mc_get_snapshot_region(
   const void* addr, const s_mc_snapshot_t *snapshot, int process_index);
 
@@ -148,35 +178,11 @@ void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot, int process_i
 
   xbt_assert(mc_region_contain(region, (void*) addr), "Trying to read out of the region boundary.");
 
 
   xbt_assert(mc_region_contain(region, (void*) addr), "Trying to read out of the region boundary.");
 
-  if (!region) {
+  if (!region)
+    // TODO, This is not correct anymore in the cross process model?
     return (void *) addr;
     return (void *) addr;
-  }
-
-  switch (region->storage_type) {
-  case MC_REGION_STORAGE_TYPE_NONE:
-  default:
-    xbt_die("Storage type not supported");
-
-  case MC_REGION_STORAGE_TYPE_FLAT:
-    {
-      uintptr_t offset = addr - (uintptr_t) region->start_addr;
-      return (void *) ((uintptr_t) region->flat.data + offset);
-    }
-
-  case MC_REGION_STORAGE_TYPE_CHUNKED:
-    return mc_translate_address_region(addr, region);
-
-  case MC_REGION_STORAGE_TYPE_PRIVATIZED:
-    {
-      xbt_assert(process_index >=0,
-        "Missing process index for privatized region");
-      xbt_assert((size_t) process_index < region->privatized.regions_count,
-        "Out of range process index");
-      mc_mem_region_t subregion = region->privatized.regions[process_index];
-      xbt_assert(subregion, "Missing memory region for process %i", process_index);
-      return mc_translate_address(addr, snapshot, process_index);
-    }
-  }
+  else
+    return mc_translate_address_region(addr, region, process_index);
 }
 
 // ***** MC Snapshot
 }
 
 // ***** MC Snapshot
@@ -346,7 +352,7 @@ const void* MC_region_read(mc_mem_region_t region, void* target, const void* add
       void* end = (char*) addr + size - 1;
       if (mc_same_page(addr, end) ) {
         // The memory is contained in a single page:
       void* end = (char*) addr + size - 1;
       if (mc_same_page(addr, end) ) {
         // The memory is contained in a single page:
-        return mc_translate_address_region((uintptr_t) addr, region);
+        return mc_translate_address_region_chunked((uintptr_t) addr, region);
       } else {
         // The memory spans several pages:
         return MC_region_read_fragmented(region, target, addr, size);
       } else {
         // The memory spans several pages:
         return MC_region_read_fragmented(region, target, addr, size);