Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Kill Simcall::COMM_RECV, COMM_IRECV, COMM_SEND and COMM_ISEND
[simgrid.git] / src / simix / libsmx.cpp
index e327acc..87d1465 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,17 +42,33 @@ 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(
+        [&send_observer] { return simgrid::kernel::activity::CommImpl::isend(&send_observer); }, &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 {
-    simcall_BODY_comm_send(sender, mbox, task_size, rate, static_cast<unsigned char*>(src_buff), src_buff_size,
-                           match_fun, copy_data_fun, data, timeout);
+    simgrid::kernel::actor::CommIsendSimcall observer(sender, mbox, task_size, rate,
+                                                      static_cast<unsigned char*>(src_buff), src_buff_size, match_fun,
+                                                      nullptr, copy_data_fun, data, false);
+    simgrid::kernel::actor::simcall_blocking([&observer, timeout] {
+      simgrid::kernel::activity::ActivityImplPtr comm = simgrid::kernel::activity::CommImpl::isend(&observer);
+      comm->wait_for(observer.get_issuer(), timeout);
+    });
   }
 }
 
@@ -70,8 +87,10 @@ simcall_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, dou
 
   xbt_assert(mbox, "No rendez-vous point defined for isend");
 
-  return simcall_BODY_comm_isend(sender, mbox, task_size, rate, static_cast<unsigned char*>(src_buff), src_buff_size,
-                                 match_fun, clean_fun, copy_data_fun, data, detached);
+  simgrid::kernel::actor::CommIsendSimcall observer(sender, mbox, task_size, rate,
+                                                    static_cast<unsigned char*>(src_buff), src_buff_size, match_fun,
+                                                    clean_fun, copy_data_fun, data, detached);
+  return simgrid::kernel::actor::simcall([&observer] { return simgrid::kernel::activity::CommImpl::isend(&observer); });
 }
 
 /**
@@ -86,17 +105,31 @@ 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(
+        [&observer] { return simgrid::kernel::activity::CommImpl::irecv(&observer); }, &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 {
-    simcall_BODY_comm_recv(receiver, mbox, static_cast<unsigned char*>(dst_buff), dst_buff_size, match_fun,
-                           copy_data_fun, data, timeout, rate);
+    simgrid::kernel::actor::CommIrecvSimcall observer(receiver, mbox, static_cast<unsigned char*>(dst_buff),
+                                                      dst_buff_size, match_fun, copy_data_fun, data, rate);
+    simgrid::kernel::actor::simcall_blocking([&observer, timeout] {
+      simgrid::kernel::activity::ActivityImplPtr comm = simgrid::kernel::activity::CommImpl::irecv(&observer);
+      comm->wait_for(observer.get_issuer(), timeout);
+    });
   }
 }
 /**
@@ -109,8 +142,9 @@ simcall_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, siz
 {
   xbt_assert(mbox, "No rendez-vous point defined for irecv");
 
-  return simcall_BODY_comm_irecv(receiver, mbox, static_cast<unsigned char*>(dst_buff), dst_buff_size, match_fun,
-                                 copy_data_fun, data, rate);
+  simgrid::kernel::actor::CommIrecvSimcall observer(receiver, mbox, static_cast<unsigned char*>(dst_buff),
+                                                    dst_buff_size, match_fun, copy_data_fun, data, rate);
+  return simgrid::kernel::actor::simcall([&observer] { return simgrid::kernel::activity::CommImpl::irecv(&observer); });
 }
 
 /**
@@ -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();
@@ -197,7 +236,7 @@ const char* SIMIX_simcall_name(const s_smx_simcall& simcall)
       cname += 17; // strip prefix "simgrid::kernel::"
     return cname;
   } else {
-    return simcall_names[static_cast<int>(simcall.call_)];
+    return simcall_names.at(static_cast<int>(simcall.call_));
   }
 }