Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MC: do not segfault when the logs are activated
[simgrid.git] / src / simix / libsmx.cpp
index e327acc..9914b02 100644 (file)
@@ -18,6 +18,7 @@
 #include "src/kernel/actor/SimcallObserver.hpp"
 #include "src/mc/mc_replay.hpp"
 #include "xbt/random.hpp"
+#include <simgrid/Exception.hpp>
 
 #include "popping_bodies.cpp"
 
@@ -41,12 +42,30 @@ void simcall_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size,
   xbt_assert(mbox, "No rendez-vous point defined for send");
 
   if (MC_is_active() || MC_record_replay_is_active()) {
-    /* the model-checker wants two separate simcalls */
-    simgrid::kernel::activity::ActivityImplPtr comm =
-        nullptr; /* MC needs the comm to be set to nullptr during the simcall */
-    comm = simcall_comm_isend(sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, nullptr, copy_data_fun,
-                              data, false);
-    simcall_comm_wait(comm.get(), timeout);
+    /* the model-checker wants two separate simcalls, and wants comm to be nullptr during the simcall */
+    simgrid::kernel::activity::ActivityImplPtr comm = nullptr;
+
+    simgrid::kernel::actor::CommIsendSimcall send_observer{
+        sender,  mbox,          task_size, rate, static_cast<unsigned char*>(src_buff), src_buff_size, match_fun,
+        nullptr, copy_data_fun, data,      false};
+    comm = simgrid::kernel::actor::simcall_blocking(
+        [&send_observer] {
+          return simgrid::kernel::activity::CommImpl::isend(
+              send_observer.get_issuer(), send_observer.get_mailbox(), send_observer.get_payload_size(),
+              send_observer.get_rate(), send_observer.get_src_buff(), send_observer.get_src_buff_size(),
+              send_observer.match_fun_, send_observer.clean_fun_, send_observer.copy_data_fun_,
+              send_observer.get_payload(), send_observer.is_detached());
+        },
+        &send_observer);
+
+    simgrid::kernel::actor::ActivityWaitSimcall wait_observer{sender, comm.get(), timeout};
+    if (simgrid::kernel::actor::simcall_blocking(
+            [&wait_observer] {
+              wait_observer.get_activity()->wait_for(wait_observer.get_issuer(), wait_observer.get_timeout());
+            },
+            &wait_observer)) {
+      throw simgrid::TimeoutException(XBT_THROW_POINT, "Timeouted");
+    }
     comm = nullptr;
   }
   else {
@@ -86,12 +105,27 @@ void simcall_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff,
   xbt_assert(mbox, "No rendez-vous point defined for recv");
 
   if (MC_is_active() || MC_record_replay_is_active()) {
-    /* the model-checker wants two separate simcalls */
-    simgrid::kernel::activity::ActivityImplPtr comm =
-        nullptr; /* MC needs the comm to be set to nullptr during the simcall */
-    comm = simcall_comm_irecv(receiver, mbox, dst_buff, dst_buff_size,
-                              match_fun, copy_data_fun, data, rate);
-    simcall_comm_wait(comm.get(), timeout);
+    /* the model-checker wants two separate simcalls, and wants comm to be nullptr during the simcall */
+    simgrid::kernel::activity::ActivityImplPtr comm = nullptr;
+
+    simgrid::kernel::actor::CommIrecvSimcall observer{
+        receiver, mbox, static_cast<unsigned char*>(dst_buff), dst_buff_size, match_fun, copy_data_fun, data, rate};
+    comm = simgrid::kernel::actor::simcall_blocking(
+        [&observer] {
+          return simgrid::kernel::activity::CommImpl::irecv(
+              observer.get_issuer(), observer.get_mailbox(), observer.get_dst_buff(), observer.get_dst_buff_size(),
+              observer.match_fun_, observer.copy_data_fun_, observer.get_payload(), observer.get_rate());
+        },
+        &observer);
+
+    simgrid::kernel::actor::ActivityWaitSimcall wait_observer{receiver, comm.get(), timeout};
+    if (simgrid::kernel::actor::simcall_blocking(
+            [&wait_observer] {
+              wait_observer.get_activity()->wait_for(wait_observer.get_issuer(), wait_observer.get_timeout());
+            },
+            &wait_observer)) {
+      throw simgrid::TimeoutException(XBT_THROW_POINT, "Timeouted");
+    }
     comm = nullptr;
   }
   else {
@@ -190,6 +224,11 @@ void simcall_run_blocking(std::function<void()> const& code, simgrid::kernel::ac
 const char* SIMIX_simcall_name(const s_smx_simcall& simcall)
 {
   if (simcall.observer_ != nullptr) {
+#if SIMGRID_HAVE_MC
+    if (mc_model_checker != nullptr) // Do not try to use the observer from the MCer
+      return "(remotely observed)";
+#endif
+
     static std::string name;
     name              = boost::core::demangle(typeid(*simcall.observer_).name());
     const char* cname = name.c_str();