Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Remove compatibility stuff
[simgrid.git] / src / mc / mc_process.cpp
index 31e79cf..5372a63 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "mc_process.h"
 #include "mc_object_info.h"
-#include "mc_address_space.h"
+#include "AddressSpace.hpp"
 #include "mc_unw.h"
 #include "mc_snapshot.h"
 #include "mc_ignore.h"
@@ -50,21 +50,17 @@ static mc_process_t MC_process_get_process(mc_process_t p) {
   return p;
 }
 
-static const s_mc_address_space_class_t mc_process_class = {
-  .read = (mc_address_space_class_read_callback_t) &MC_process_read,
-  .get_process = (mc_address_space_class_get_process_callback_t) MC_process_get_process
-};
-
-bool MC_is_process(mc_address_space_t p)
-{
-  return p->address_space_class == &mc_process_class;
 }
 
 // ***** mc_process
 
-void MC_process_init(mc_process_t process, pid_t pid, int sockfd)
+namespace simgrid {
+namespace mc {
+
+Process::Process(pid_t pid, int sockfd)
 {
-  process->address_space.address_space_class = &mc_process_class;
+  Process* process = this;
+
   process->process_flags = MC_PROCESS_NO_FLAG;
   process->socket = sockfd;
   process->pid = pid;
@@ -81,14 +77,15 @@ void MC_process_init(mc_process_t process, pid_t pid, int sockfd)
   MC_process_open_memory_file(process);
 
   // Read std_heap (is a struct mdesc*):
-  dw_variable_t std_heap_var = MC_process_find_variable_by_name(process, "std_heap");
+  dw_variable_t std_heap_var = MC_process_find_variable_by_name(process,
+    "__mmalloc_default_mdp");
   if (!std_heap_var)
     xbt_die("No heap information in the target process");
   if(!std_heap_var->address)
     xbt_die("No constant address for this variable");
-  MC_process_read(process, MC_ADDRESS_SPACE_READ_FLAGS_NONE,
+  MC_process_read(process, simgrid::mc::AddressSpace::Normal,
     &process->heap_address, std_heap_var->address, sizeof(struct mdesc*),
-    MC_PROCESS_INDEX_DISABLED);
+    simgrid::mc::ProcessIndexDisabled);
 
   process->smx_process_infos = MC_smx_process_info_list_new();
   process->smx_old_process_infos = MC_smx_process_info_list_new();
@@ -105,9 +102,10 @@ void MC_process_init(mc_process_t process, pid_t pid, int sockfd)
   }
 }
 
-void MC_process_clear(mc_process_t process)
+Process::~Process()
 {
-  process->address_space.address_space_class = NULL;
+  Process* process = this;
+
   process->process_flags = MC_PROCESS_NO_FLAG;
   process->pid = 0;
 
@@ -152,38 +150,41 @@ void MC_process_clear(mc_process_t process)
   process->heap_info = NULL;
 }
 
+}
+}
+
+extern "C" {
+
 void MC_process_refresh_heap(mc_process_t process)
 {
-  assert(!MC_process_is_self(process));
+  xbt_assert(mc_mode == MC_MODE_SERVER);
+  xbt_assert(!MC_process_is_self(process));
   // Read/dereference/refresh the std_heap pointer:
   if (!process->heap) {
-    xbt_mheap_t oldheap  = mmalloc_set_current_heap(mc_heap);
     process->heap = (struct mdesc*) malloc(sizeof(struct mdesc));
-    mmalloc_set_current_heap(oldheap);
   }
-  MC_process_read(process, MC_ADDRESS_SPACE_READ_FLAGS_NONE,
+  MC_process_read(process, simgrid::mc::AddressSpace::Normal,
     process->heap, process->heap_address, sizeof(struct mdesc),
-    MC_PROCESS_INDEX_DISABLED
+    simgrid::mc::ProcessIndexDisabled
     );
+  process->cache_flags |= MC_PROCESS_CACHE_FLAG_HEAP;
 }
 
 void MC_process_refresh_malloc_info(mc_process_t process)
 {
-  assert(!MC_process_is_self(process));
+  xbt_assert(mc_mode == MC_MODE_SERVER);
+  xbt_assert(!MC_process_is_self(process));
   if (!(process->cache_flags & MC_PROCESS_CACHE_FLAG_HEAP))
     MC_process_refresh_heap(process);
   // Refresh process->heapinfo:
   size_t malloc_info_bytesize =
     (process->heap->heaplimit + 1) * sizeof(malloc_info);
-
-  xbt_mheap_t heap  = mmalloc_set_current_heap(mc_heap);
   process->heap_info = (malloc_info*) realloc(process->heap_info, malloc_info_bytesize);
-  mmalloc_set_current_heap(heap);
-
-  MC_process_read(process, MC_ADDRESS_SPACE_READ_FLAGS_NONE,
+  MC_process_read(process, simgrid::mc::AddressSpace::Normal,
     process->heap_info,
     process->heap->heapinfo, malloc_info_bytesize,
-    MC_PROCESS_INDEX_DISABLED);
+    simgrid::mc::ProcessIndexDisabled);
+  process->cache_flags |= MC_PROCESS_CACHE_FLAG_MALLOC_INFO;
 }
 
 #define SO_RE "\\.so[\\.0-9]*$"
@@ -418,8 +419,8 @@ void MC_process_read_variable(mc_process_t process, const char* name, void* targ
   if ((size_t) var->type->full_type->byte_size != size)
     xbt_die("Unexpected size for %s (expected %zi, was %zi)",
       name, size, (size_t) var->type->full_type->byte_size);
-  MC_process_read(process, MC_ADDRESS_SPACE_READ_FLAGS_NONE, target, var->address, size,
-    MC_PROCESS_INDEX_ANY);
+  MC_process_read(process, simgrid::mc::AddressSpace::Normal, target, var->address, size,
+    simgrid::mc::ProcessIndexAny);
 }
 
 char* MC_process_read_string(mc_process_t process, void* address)
@@ -519,44 +520,46 @@ static ssize_t pwrite_whole(int fd, const void *buf, size_t count, off_t offset)
   return real_count;
 }
 
-const void* MC_process_read(mc_process_t process, adress_space_read_flags_t flags,
-  void* local, const void* remote, size_t len,
-  int process_index)
+}
+
+namespace simgrid {
+namespace mc {
+
+const void *Process::read_bytes(void* buffer, std::size_t size,
+  std::uint64_t address, int process_index,
+  AddressSpace::ReadMode mode)
 {
-  if (process_index != MC_PROCESS_INDEX_DISABLED) {
-    mc_object_info_t info = MC_process_find_object_info_rw(process, remote);
+  if (process_index != simgrid::mc::ProcessIndexDisabled) {
+    mc_object_info_t info = MC_process_find_object_info_rw(this, (void*)address);
     // Segment overlap is not handled.
     if (MC_object_info_is_privatized(info)) {
       if (process_index < 0)
         xbt_die("Missing process index");
       // Address translation in the privaization segment:
-      size_t offset = (const char*) remote - info->start_rw;
-      remote = (const char*) remote - offset;
+      // TODO, fix me (broken)
+      size_t offset = address - (std::uint64_t)info->start_rw;
+      address = address - offset;
     }
   }
 
-  if (MC_process_is_self(process)) {
-    if (flags & MC_ADDRESS_SPACE_READ_FLAGS_LAZY)
-      return remote;
+  if (MC_process_is_self(this)) {
+    if (mode == simgrid::mc::AddressSpace::Lazy)
+      return (void*)address;
     else {
-      memcpy(local, remote, len);
-      return local;
+      memcpy(buffer, (void*)address, size);
+      return buffer;
     }
   } else {
-    if (pread_whole(process->memory_file, local, len, (off_t) remote) < 0)
-      xbt_die("Read from process %lli failed", (long long) process->pid);
-    return local;
+    if (pread_whole(this->memory_file, buffer, size, (off_t) address) < 0)
+      xbt_die("Read from process %lli failed", (long long) this->pid);
+    return buffer;
   }
 }
 
-const void* MC_process_read_simple(mc_process_t process,
-  void* local, const void* remote, size_t len)
-{
-  adress_space_read_flags_t flags = MC_ADDRESS_SPACE_READ_FLAGS_NONE;
-  int index = MC_PROCESS_INDEX_ANY;
-   MC_process_read(process, flags, local, remote, len, index);
-   return local;
 }
+}
+
+extern "C" {
 
 const void* MC_process_read_dynar_element(mc_process_t process,
   void* local, const void* remote_dynar, size_t i, size_t len)
@@ -564,7 +567,7 @@ const void* MC_process_read_dynar_element(mc_process_t process,
   s_xbt_dynar_t d;
   MC_process_read_simple(process, &d, remote_dynar, sizeof(d));
   if (i >= d.used)
-    xbt_die("Out of bound index %zi/%zi", i, d.used);
+    xbt_die("Out of bound index %zi/%lu", i, d.used);
   if (len != d.elmsize)
     xbt_die("Bad size in MC_process_read_dynar_element");
   MC_process_read_simple(process, local, xbt_dynar_get_ptr(&d, i), len);
@@ -593,7 +596,7 @@ unsigned long MC_process_read_dynar_length(mc_process_t process, const void* rem
 
 static pthread_once_t zero_buffer_flag = PTHREAD_ONCE_INIT;
 static const void* zero_buffer;
-static const int zero_buffer_size = 10 * 4096;
+static const size_t zero_buffer_size = 10 * 4096;
 
 static void MC_zero_buffer_init(void)
 {