Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Make SimixProcessInformation a real C++ object
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 3 Mar 2016 16:54:06 +0000 (17:54 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 3 Mar 2016 17:36:56 +0000 (18:36 +0100)
and use std::vector<> for storing it instead of xbt_dynar

src/mc/Process.cpp
src/mc/Process.hpp
src/mc/mc_base.cpp
src/mc/mc_smx.cpp
src/mc/mc_smx.h
src/mc/mc_visited.cpp

index 2e51067..c4c951a 100644 (file)
@@ -232,8 +232,8 @@ void Process::init()
     remote(std_heap_var->address),
     simgrid::mc::ProcessIndexDisabled);
 
     remote(std_heap_var->address),
     simgrid::mc::ProcessIndexDisabled);
 
-  this->smx_process_infos = MC_smx_process_info_list_new();
-  this->smx_old_process_infos = MC_smx_process_info_list_new();
+  this->smx_process_infos.clear();
+  this->smx_old_process_infos.clear();
   this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors  , __BYTE_ORDER);
   this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER);
   this->unw_underlying_context = _UPT_create(this->pid_);
   this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors  , __BYTE_ORDER);
   this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER);
   this->unw_underlying_context = _UPT_create(this->pid_);
@@ -247,9 +247,6 @@ Process::~Process()
   this->maestro_stack_start_ = nullptr;
   this->maestro_stack_end_ = nullptr;
 
   this->maestro_stack_start_ = nullptr;
   this->maestro_stack_end_ = nullptr;
 
-  xbt_dynar_free(&this->smx_process_infos);
-  xbt_dynar_free(&this->smx_old_process_infos);
-
   if (this->memory_file >= 0) {
     close(this->memory_file);
   }
   if (this->memory_file >= 0) {
     close(this->memory_file);
   }
@@ -705,7 +702,9 @@ boost::iterator_range<s_mc_smx_process_info*> Process::simix_processes()
 {
   xbt_assert(mc_mode != MC_MODE_CLIENT);
   MC_process_smx_refresh(&mc_model_checker->process());
 {
   xbt_assert(mc_mode != MC_MODE_CLIENT);
   MC_process_smx_refresh(&mc_model_checker->process());
-  return simgrid::xbt::range<s_mc_smx_process_info>(smx_process_infos);
+  return boost::iterator_range<s_mc_smx_process_info*>(
+    &*smx_process_infos.begin(),
+    &*smx_process_infos.end());
 }
 
 }
 }
 
 }
index 7c4c983..5f2ba9a 100644 (file)
@@ -62,7 +62,14 @@ public:
   };
   /** Hostname (owned by `mc_modelchecker->hostnames`) */
   const char* hostname = nullptr;
   };
   /** Hostname (owned by `mc_modelchecker->hostnames`) */
   const char* hostname = nullptr;
-  char* name = nullptr;
+  std::string name;
+
+  void clear()
+  {
+    name.clear();
+    address = nullptr;
+    hostname = nullptr;
+  }
 };
 
 struct IgnoredRegion {
 };
 
 struct IgnoredRegion {
@@ -242,13 +249,13 @@ public: // Copies of MCed SMX data structures
    *
    *  See mc_smx.c.
    */
    *
    *  See mc_smx.c.
    */
-  xbt_dynar_t smx_process_infos = nullptr;
+  std::vector<SimixProcessInformation> smx_process_infos;
 
   /** Copy of `simix_global->process_to_destroy`
    *
    *  See mc_smx.c.
    */
 
   /** Copy of `simix_global->process_to_destroy`
    *
    *  See mc_smx.c.
    */
-  xbt_dynar_t smx_old_process_infos = nullptr;
+  std::vector<SimixProcessInformation> smx_old_process_infos;
 
   /** State of the cache (which variables are up to date) */
   mc_process_cache_flags_t cache_flags = MC_PROCESS_CACHE_FLAG_NONE;
 
   /** State of the cache (which variables are up to date) */
   mc_process_cache_flags_t cache_flags = MC_PROCESS_CACHE_FLAG_NONE;
@@ -295,6 +302,12 @@ public: // Libunwind-data
   void* unw_underlying_context;
 };
 
   void* unw_underlying_context;
 };
 
+// TODO, remove this
+#define MC_PROCESS_FOREACH(xs, cursor, p) \
+  if (! xs.empty()) \
+  for (auto __it = (cursor = 0, p = &*xs.begin(), xs.begin()); \
+    __it != xs.end(); ++__it, ++cursor, p = &*__it)
+
 /** Open a FD to a remote process memory (`/dev/$pid/mem`)
  */
 XBT_PRIVATE int open_vm(pid_t pid, int flags);
 /** Open a FD to a remote process memory (`/dev/$pid/mem`)
  */
 XBT_PRIVATE int open_vm(pid_t pid, int flags);
index 5b61d7b..82da31f 100644 (file)
@@ -230,7 +230,7 @@ void MC_simcall_handle(smx_simcall_t req, int value)
   unsigned i;
   mc_smx_process_info_t pi = nullptr;
 
   unsigned i;
   mc_smx_process_info_t pi = nullptr;
 
-  xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, pi) {
+  MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, pi) {
     if (req == &pi->copy.simcall) {
       mc_model_checker->simcall_handle(
         mc_model_checker->process(), pi->copy.pid, value);
     if (req == &pi->copy.simcall) {
       mc_model_checker->simcall_handle(
         mc_model_checker->process(), pi->copy.pid, value);
index 205fcf7..868ea75 100644 (file)
@@ -21,33 +21,18 @@ using simgrid::mc::remote;
 
 extern "C" {
 
 
 extern "C" {
 
-static
-void MC_smx_process_info_clear(mc_smx_process_info_t p)
-{
-  p->hostname = nullptr;
-  std::free(p->name);
-  p->name = nullptr;
-}
-
-xbt_dynar_t MC_smx_process_info_list_new(void)
-{
-  return xbt_dynar_new(
-    sizeof(s_mc_smx_process_info_t),
-    ( void_f_pvoid_t) &MC_smx_process_info_clear);
-}
-
 static inline
 static inline
-bool is_in_dynar(smx_process_t p, xbt_dynar_t dynar)
+bool is_in_vector(smx_process_t p, std::vector<simgrid::mc::SimixProcessInformation>& ps)
 {
 {
-  return (uintptr_t) p >= (uintptr_t) dynar->data
-    && (uintptr_t) p < ((uintptr_t) dynar->data + dynar->used * dynar->elmsize);
+  return (uintptr_t) p >= (uintptr_t) &ps[0]
+    && (uintptr_t) p < (uintptr_t) &ps[ps.size()];
 }
 
 static inline
 mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p)
 {
 }
 
 static inline
 mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p)
 {
-  assert(is_in_dynar(p, mc_model_checker->process().smx_process_infos)
-    || is_in_dynar(p, mc_model_checker->process().smx_old_process_infos));
+  assert(is_in_vector(p, mc_model_checker->process().smx_process_infos)
+    || is_in_vector(p, mc_model_checker->process().smx_old_process_infos));
   mc_smx_process_info_t process_info =
     (mc_smx_process_info_t)
       ((char*) p - offsetof(s_mc_smx_process_info_t, copy));
   mc_smx_process_info_t process_info =
     (mc_smx_process_info_t)
       ((char*) p - offsetof(s_mc_smx_process_info_t, copy));
@@ -62,25 +47,23 @@ mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p)
  */
 static void MC_process_refresh_simix_process_list(
   simgrid::mc::Process* process,
  */
 static void MC_process_refresh_simix_process_list(
   simgrid::mc::Process* process,
-  xbt_dynar_t target, xbt_swag_t remote_swag)
+  std::vector<simgrid::mc::SimixProcessInformation>& target, xbt_swag_t remote_swag)
 {
 {
+  target.clear();
+
   // swag = REMOTE(*simix_global->process_list)
   s_xbt_swag_t swag;
   process->read_bytes(&swag, sizeof(swag), remote(remote_swag));
 
   // swag = REMOTE(*simix_global->process_list)
   s_xbt_swag_t swag;
   process->read_bytes(&swag, sizeof(swag), remote(remote_swag));
 
-  smx_process_t p;
-  xbt_dynar_reset(target);
-
   // Load each element of the dynar from the MCed process:
   int i = 0;
   // Load each element of the dynar from the MCed process:
   int i = 0;
-  for (p = (smx_process_t) swag.head; p; ++i) {
+  for (smx_process_t p = (smx_process_t) swag.head; p; ++i) {
 
 
-    s_mc_smx_process_info_t info;
+    simgrid::mc::SimixProcessInformation info;
     info.address = p;
     info.address = p;
-    info.name = nullptr;
     info.hostname = nullptr;
     process->read_bytes(&info.copy, sizeof(info.copy), remote(p));
     info.hostname = nullptr;
     process->read_bytes(&info.copy, sizeof(info.copy), remote(p));
-    xbt_dynar_push(target, &info);
+    target.push_back(std::move(info));
 
     // Lookup next process address:
     p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset);
 
     // Lookup next process address:
     p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset);
@@ -136,10 +119,10 @@ smx_process_t MC_smx_simcall_get_issuer(smx_simcall_t req)
   mc_smx_process_info_t p;
 
   // Lookup by address:
   mc_smx_process_info_t p;
 
   // Lookup by address:
-  xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, p)
+  MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, p)
     if (p->address == address)
       return &p->copy;
     if (p->address == address)
       return &p->copy;
-  xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, i, p)
+  MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, i, p)
     if (p->address == address)
       return &p->copy;
 
     if (p->address == address)
       return &p->copy;
 
@@ -167,10 +150,10 @@ mc_smx_process_info_t MC_smx_resolve_process_info(smx_process_t process_remote_a
 
   unsigned index;
   mc_smx_process_info_t process_info;
 
   unsigned index;
   mc_smx_process_info_t process_info;
-  xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, index, process_info)
+  MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, index, process_info)
     if (process_info->address == process_remote_address)
       return process_info;
     if (process_info->address == process_remote_address)
       return process_info;
-  xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, index, process_info)
+  MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, index, process_info)
     if (process_info->address == process_remote_address)
       return process_info;
   xbt_die("Process info not found");
     if (process_info->address == process_remote_address)
       return process_info;
   xbt_die("Process info not found");
@@ -222,10 +205,12 @@ const char* MC_smx_process_get_name(smx_process_t p)
     return nullptr;
 
   mc_smx_process_info_t info = MC_smx_process_get_info(p);
     return nullptr;
 
   mc_smx_process_info_t info = MC_smx_process_get_info(p);
-  if (!info->name) {
-    info->name = process->read_string(p->name);
+  if (info->name.empty()) {
+    char* name = process->read_string(p->name);
+    info->name = name;
+    free(name);
   }
   }
-  return info->name;
+  return info->name.c_str();
 }
 
 #ifdef HAVE_SMPI
 }
 
 #ifdef HAVE_SMPI
index 7c9fc47..0d7e87f 100644 (file)
@@ -45,8 +45,6 @@ SG_BEGIN_DECL()
 
 typedef s_mc_smx_process_info s_mc_smx_process_info_t, *mc_smx_process_info_t;
 
 
 typedef s_mc_smx_process_info s_mc_smx_process_info_t, *mc_smx_process_info_t;
 
-XBT_PRIVATE xbt_dynar_t MC_smx_process_info_list_new(void);
-
 XBT_PRIVATE void MC_process_smx_refresh(simgrid::mc::Process* process);
 
 /** Get the issuer of  a simcall (`req->issuer`)
 XBT_PRIVATE void MC_process_smx_refresh(simgrid::mc::Process* process);
 
 /** Get the issuer of  a simcall (`req->issuer`)
index 1d218be..8f07b4c 100644 (file)
@@ -67,8 +67,8 @@ static mc_visited_state_t visited_state_new()
     process->get_malloc_info());
 
   MC_process_smx_refresh(&mc_model_checker->process());
     process->get_malloc_info());
 
   MC_process_smx_refresh(&mc_model_checker->process());
-  new_state->nb_processes = xbt_dynar_length(
-    mc_model_checker->process().smx_process_infos);
+  new_state->nb_processes =
+    mc_model_checker->process().smx_process_infos.size();
 
   new_state->system_state = simgrid::mc::take_snapshot(mc_stats->expanded_states);
   new_state->num = mc_stats->expanded_states;
 
   new_state->system_state = simgrid::mc::take_snapshot(mc_stats->expanded_states);
   new_state->num = mc_stats->expanded_states;
@@ -89,8 +89,8 @@ mc_visited_pair_t MC_visited_pair_new(int pair_num, xbt_automaton_state_t automa
     process->get_malloc_info());
 
   MC_process_smx_refresh(&mc_model_checker->process());
     process->get_malloc_info());
 
   MC_process_smx_refresh(&mc_model_checker->process());
-  pair->nb_processes = xbt_dynar_length(
-    mc_model_checker->process().smx_process_infos);
+  pair->nb_processes =
+    mc_model_checker->process().smx_process_infos.size();
 
   pair->automaton_state = automaton_state;
   pair->num = pair_num;
 
   pair->automaton_state = automaton_state;
   pair->num = pair_num;