Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Build ID are somewhat gnu/linux specific.
[simgrid.git] / src / mc / mc_smx.cpp
index 9487799..69a1e87 100644 (file)
@@ -5,60 +5,63 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <cassert>
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <cassert>
+#include <cstddef>
 #include <cstdlib>
 
 #include <cstdlib>
 
+#include <memory>
+#include <type_traits>
+#include <utility>
 #include <vector>
 
 #include <xbt/log.h>
 #include <xbt/str.h>
 #include <xbt/swag.h>
 
 #include <vector>
 
 #include <xbt/log.h>
 #include <xbt/str.h>
 #include <xbt/swag.h>
 
-#include "src/simix/smx_private.h"
+#include <simgrid/s4u/host.hpp>
 
 
+#include "src/simix/smx_private.h"
 #include "src/mc/mc_smx.h"
 #include "src/mc/ModelChecker.hpp"
 
 using simgrid::mc::remote;
 
 #include "src/mc/mc_smx.h"
 #include "src/mc/ModelChecker.hpp"
 
 using simgrid::mc::remote;
 
-extern "C" {
-
+/** HACK, Statically "upcast" a s_smx_actor_t into a SimixProcessInformation
+ *
+ *  This gets 'processInfo' from '&processInfo->copy'. It upcasts in the
+ *  sense that we could achieve the same thing by having SimixProcessInformation
+ *  inherit from s_smx_actor_t but we don't really want to do that.
+ */
 static inline
 static inline
-bool is_in_vector(smx_process_t p, std::vector<simgrid::mc::SimixProcessInformation>& ps)
+simgrid::mc::SimixProcessInformation* process_info_cast(smx_actor_t p)
 {
 {
-  return (uintptr_t) p >= (uintptr_t) &ps[0]
-    && (uintptr_t) p < (uintptr_t) &ps[ps.size()];
-}
+  simgrid::mc::SimixProcessInformation temp;
+  std::size_t offset = (char*) temp.copy.getBuffer() - (char*)&temp;
 
 
-static inline
-simgrid::mc::SimixProcessInformation* MC_smx_process_get_info(smx_process_t p)
-{
-  assert(is_in_vector(p, mc_model_checker->process().smx_process_infos)
-    || is_in_vector(p, mc_model_checker->process().smx_old_process_infos));
   simgrid::mc::SimixProcessInformation* process_info =
   simgrid::mc::SimixProcessInformation* process_info =
-    (simgrid::mc::SimixProcessInformation*)
-      ((char*) p - offsetof(simgrid::mc::SimixProcessInformation, copy));
+    (simgrid::mc::SimixProcessInformation*) ((char*) p - offset);
   return process_info;
 }
 
 /** Load the remote swag of processes into a vector
  *
  *  @param process     MCed process
   return process_info;
 }
 
 /** Load the remote swag of processes into a vector
  *
  *  @param process     MCed process
- *  @param target      Local vector (to be filled with copies of `s_smx_process_t`)
+ *  @param target      Local vector (to be filled with copies of `s_smx_actor_t`)
  *  @param remote_swag Address of the process SWAG in the remote list
  */
 static void MC_process_refresh_simix_process_list(
   simgrid::mc::Process* process,
  *  @param remote_swag Address of the process SWAG in the remote list
  */
 static void MC_process_refresh_simix_process_list(
   simgrid::mc::Process* process,
-  std::vector<simgrid::mc::SimixProcessInformation>& target, xbt_swag_t remote_swag)
+  std::vector<simgrid::mc::SimixProcessInformation>& target,
+  simgrid::mc::RemotePtr<s_xbt_swag_t> remote_swag)
 {
   target.clear();
 
   // swag = REMOTE(*simix_global->process_list)
   s_xbt_swag_t swag;
 {
   target.clear();
 
   // swag = REMOTE(*simix_global->process_list)
   s_xbt_swag_t swag;
-  process->read_bytes(&swag, sizeof(swag), remote(remote_swag));
+  process->read_bytes(&swag, sizeof(swag), remote_swag);
 
   // Load each element of the vector from the MCed process:
   int i = 0;
 
   // Load each element of the vector from the MCed process:
   int i = 0;
-  for (smx_process_t p = (smx_process_t) swag.head; p; ++i) {
+  for (smx_actor_t p = (smx_actor_t) swag.head; p; ++i) {
 
     simgrid::mc::SimixProcessInformation info;
     info.address = p;
 
     simgrid::mc::SimixProcessInformation info;
     info.address = p;
@@ -67,7 +70,7 @@ static void MC_process_refresh_simix_process_list(
     target.push_back(std::move(info));
 
     // Lookup next process address:
     target.push_back(std::move(info));
 
     // Lookup next process address:
-    p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset);
+    p = (smx_actor_t) xbt_swag_getNext(&info.copy, swag.offset);
   }
   assert(i == swag.count);
 }
   }
   assert(i == swag.count);
 }
@@ -82,19 +85,27 @@ void Process::refresh_simix()
 
   // TODO, avoid to reload `&simix_global`, `simix_global`, `*simix_global`
 
 
   // TODO, avoid to reload `&simix_global`, `simix_global`, `*simix_global`
 
-  // simix_global_p = REMOTE(simix_global);
-  smx_global_t simix_global_p;
-  this->read_variable("simix_global", &simix_global_p, sizeof(simix_global_p));
+  static_assert(std::is_same<
+      std::unique_ptr<simgrid::simix::Global>,
+      decltype(simix_global)
+    >::value, "Unexpected type for simix_global");
+  static_assert(sizeof(simix_global) == sizeof(simgrid::simix::Global*),
+    "Bad size for simix_global");
+
+  // simix_global_p = REMOTE(simix_global.get());
+  RemotePtr<simgrid::simix::Global> simix_global_p =
+    this->read_variable<simgrid::simix::Global*>("simix_global");
 
   // simix_global = REMOTE(*simix_global)
 
   // simix_global = REMOTE(*simix_global)
-  s_smx_global_t simix_global;
-  this->read_bytes(&simix_global, sizeof(simix_global),
-    remote(simix_global_p));
+  Remote<simgrid::simix::Global> simix_global =
+    this->read<simgrid::simix::Global>(simix_global_p);
 
   MC_process_refresh_simix_process_list(
 
   MC_process_refresh_simix_process_list(
-    this, this->smx_process_infos, simix_global.process_list);
+    this, this->smx_process_infos,
+    remote(simix_global.getBuffer()->process_list));
   MC_process_refresh_simix_process_list(
   MC_process_refresh_simix_process_list(
-    this, this->smx_old_process_infos, simix_global.process_to_destroy);
+    this, this->smx_old_process_infos,
+    remote(simix_global.getBuffer()->process_to_destroy));
 
   this->cache_flags_ |= Process::cache_simix_processes;
 }
 
   this->cache_flags_ |= Process::cache_simix_processes;
 }
@@ -111,57 +122,27 @@ void Process::refresh_simix()
  *  @param process the MCed process
  *  @param req     the simcall (copied in the local process)
  */
  *  @param process the MCed process
  *  @param req     the simcall (copied in the local process)
  */
-smx_process_t MC_smx_simcall_get_issuer(s_smx_simcall_t const* req)
+smx_actor_t MC_smx_simcall_get_issuer(s_smx_simcall_t const* req)
 {
 {
-  xbt_assert(mc_mode == MC_MODE_SERVER);
+  xbt_assert(mc_model_checker != nullptr);
 
 
-  // This is the address of the smx_process in the MCed process:
+  // This is the address of the smx_actor in the MCed process:
   auto address = simgrid::mc::remote(req->issuer);
 
   // Lookup by address:
   for (auto& p : mc_model_checker->process().simix_processes())
     if (p.address == address)
   auto address = simgrid::mc::remote(req->issuer);
 
   // Lookup by address:
   for (auto& p : mc_model_checker->process().simix_processes())
     if (p.address == address)
-      return &p.copy;
+      return p.copy.getBuffer();
   for (auto& p : mc_model_checker->process().old_simix_processes())
     if (p.address == address)
   for (auto& p : mc_model_checker->process().old_simix_processes())
     if (p.address == address)
-      return &p.copy;
+      return p.copy.getBuffer();
 
   xbt_die("Issuer not found");
 }
 
 
   xbt_die("Issuer not found");
 }
 
-smx_process_t MC_smx_resolve_process(
-  simgrid::mc::RemotePtr<s_smx_process_t> process_remote_address)
-{
-  xbt_assert(mc_mode == MC_MODE_SERVER);
-
-  if (!process_remote_address)
-    return nullptr;
-
-  simgrid::mc::SimixProcessInformation* process_info =
-    MC_smx_resolve_process_info(process_remote_address);
-  if (process_info)
-    return &process_info->copy;
-  else
-    return nullptr;
-}
-
-simgrid::mc::SimixProcessInformation* MC_smx_resolve_process_info(
-  simgrid::mc::RemotePtr<s_smx_process_t> process_remote_address)
+const char* MC_smx_process_get_host_name(smx_actor_t p)
 {
 {
-  xbt_assert(mc_mode == MC_MODE_SERVER);
-
-  for (auto& process_info : mc_model_checker->process().smx_process_infos)
-    if (process_info.address == process_remote_address)
-      return &process_info;
-  for (auto& process_info : mc_model_checker->process().smx_old_process_infos)
-    if (process_info.address == process_remote_address)
-      return &process_info;
-  xbt_die("Process info not found");
-}
-
-const char* MC_smx_process_get_host_name(smx_process_t p)
-{
-  if (mc_mode == MC_MODE_CLIENT)
+  if (mc_model_checker == nullptr)
     return sg_host_get_name(p->host);
 
   simgrid::mc::Process* process = &mc_model_checker->process();
     return sg_host_get_name(p->host);
 
   simgrid::mc::Process* process = &mc_model_checker->process();
@@ -169,7 +150,7 @@ const char* MC_smx_process_get_host_name(smx_process_t p)
   /* HACK, Horrible hack to find the offset of the id in the simgrid::s4u::Host.
 
      Offsetof is not supported for non-POD types but this should
   /* HACK, Horrible hack to find the offset of the id in the simgrid::s4u::Host.
 
      Offsetof is not supported for non-POD types but this should
-     work in pratice for the targets currently supported by the MC
+     work in practice for the targets currently supported by the MC
      as long as we do not add funny features to the Host class
      (such as virtual base).
 
      as long as we do not add funny features to the Host class
      (such as virtual base).
 
@@ -185,35 +166,34 @@ const char* MC_smx_process_get_host_name(smx_process_t p)
   const size_t offset = (char*) &foo.host.name() - (char*) &foo.host;
 
   // Read the simgrid::xbt::string in the MCed process:
   const size_t offset = (char*) &foo.host.name() - (char*) &foo.host;
 
   // Read the simgrid::xbt::string in the MCed process:
-  simgrid::mc::SimixProcessInformation* info = MC_smx_process_get_info(p);
-  simgrid::xbt::string_data remote_string;
+  simgrid::mc::SimixProcessInformation* info = process_info_cast(p);
   auto remote_string_address = remote(
     (simgrid::xbt::string_data*) ((char*) p->host + offset));
   auto remote_string_address = remote(
     (simgrid::xbt::string_data*) ((char*) p->host + offset));
-  process->read_bytes(&remote_string, sizeof(remote_string), remote_string_address);
+  simgrid::xbt::string_data remote_string = process->read(remote_string_address);
   char hostname[remote_string.len];
   process->read_bytes(hostname, remote_string.len + 1, remote(remote_string.data));
   char hostname[remote_string.len];
   process->read_bytes(hostname, remote_string.len + 1, remote(remote_string.data));
-  info->hostname = mc_model_checker->get_host_name(hostname);
+  info->hostname = mc_model_checker->get_host_name(hostname).c_str();
   return info->hostname;
 }
 
   return info->hostname;
 }
 
-const char* MC_smx_process_get_name(smx_process_t p)
+const char* MC_smx_process_get_name(smx_actor_t p)
 {
   simgrid::mc::Process* process = &mc_model_checker->process();
 {
   simgrid::mc::Process* process = &mc_model_checker->process();
-  if (mc_mode == MC_MODE_CLIENT)
-    return p->name;
-  if (!p->name)
-    return nullptr;
-
-  simgrid::mc::SimixProcessInformation* info = MC_smx_process_get_info(p);
-  if (info->name.empty())
-    info->name = process->read_string(p->name);
+  if (mc_model_checker == nullptr)
+    return p->name.c_str();
+
+  simgrid::mc::SimixProcessInformation* info = process_info_cast(p);
+  if (info->name.empty()) {
+    simgrid::xbt::string_data string_data = (simgrid::xbt::string_data&)p->name;
+    info->name = process->read_string(remote(string_data.data), string_data.len);
+  }
   return info->name.c_str();
 }
 
 #if HAVE_SMPI
 int MC_smpi_process_count(void)
 {
   return info->name.c_str();
 }
 
 #if HAVE_SMPI
 int MC_smpi_process_count(void)
 {
-  if (mc_mode == MC_MODE_CLIENT)
+  if (mc_model_checker == nullptr)
     return smpi_process_count();
   int res;
   mc_model_checker->process().read_variable("process_count",
     return smpi_process_count();
   int res;
   mc_model_checker->process().read_variable("process_count",
@@ -229,5 +209,3 @@ unsigned long MC_smx_get_maxpid(void)
     &maxpid, sizeof(maxpid));
   return maxpid;
 }
     &maxpid, sizeof(maxpid));
   return maxpid;
 }
-
-}