X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/33883442375c73f8116eca3ca3269a6f1725a285..4936d3a7e7a293750b17254e5339b678df2b5bbc:/src/simix/libsmx.cpp diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index e327acc893..d27ddfcbdd 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -18,6 +18,7 @@ #include "src/kernel/actor/SimcallObserver.hpp" #include "src/mc/mc_replay.hpp" #include "xbt/random.hpp" +#include #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(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(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 {