From 180707377f1965f85820329f72c7624b3858109f Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 8 Mar 2022 10:30:13 +0100 Subject: [PATCH] Define Comm::send and Comm::recv (replace simcall_comm_send/recv). Mark last legacy simcalls as deprecated. --- include/simgrid/s4u/Comm.hpp | 9 ++++ include/simgrid/simix.h | 19 ++++---- src/s4u/s4u_Comm.cpp | 93 ++++++++++++++++++++++++++++++++++-- src/simix/libsmx.cpp | 84 +++----------------------------- 4 files changed, 115 insertions(+), 90 deletions(-) diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index a08e5f76a7..d4ea842c5f 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -59,6 +59,15 @@ public: ~Comm() override; + static void send(kernel::actor::ActorImpl* sender, const Mailbox* mbox, double task_size, double rate, void* src_buff, + size_t src_buff_size, bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, + double timeout); + static void recv(kernel::actor::ActorImpl* receiver, const Mailbox* mbox, void* dst_buff, size_t* dst_buff_size, + bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, + double timeout, double rate); + /* "One-sided" communications. This way of communicating bypasses the mailbox and actors mechanism. It creates a * communication (vetoabled, asynchronous, or synchronous) directly between two hosts. There is really no limit on * the hosts involved. In particular, the actor creating such a communication does not have to be on one of the diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 253964f0b8..7f4f512d2a 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -70,11 +70,11 @@ XBT_ATTRIB_DEPRECATED_v333("Please use Comm::copy_pointer_callback()") XBT_PUBLI /************************** Communication simcalls ****************************/ -XBT_PUBLIC void simcall_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, - size_t src_buff_size, - bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), - void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), - void* data, double timeout); +XBT_ATTRIB_DEPRECATED_v335("Please use s4u::Comm::send()") XBT_PUBLIC + void simcall_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, + size_t src_buff_size, bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, + double timeout); XBT_ATTRIB_DEPRECATED_v335("Please use s4u::Comm::isend()") XBT_PUBLIC simgrid::kernel::activity::ActivityImplPtr simcall_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, @@ -83,10 +83,11 @@ XBT_ATTRIB_DEPRECATED_v335("Please use s4u::Comm::isend()") XBT_PUBLIC simgrid:: void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, bool detached); -XBT_PUBLIC void simcall_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, - bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), - void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), - void* data, double timeout, double rate); +XBT_ATTRIB_DEPRECATED_v335("Please use s4u::Comm::recv()") XBT_PUBLIC + void simcall_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, + bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, + double timeout, double rate); XBT_ATTRIB_DEPRECATED_v335("Please use s4u::Comm::irecv()") XBT_PUBLIC simgrid::kernel::activity::ActivityImplPtr simcall_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, diff --git a/src/s4u/s4u_Comm.cpp b/src/s4u/s4u_Comm.cpp index 2d2ed3169b..00c96bcc38 100644 --- a/src/s4u/s4u_Comm.cpp +++ b/src/s4u/s4u_Comm.cpp @@ -12,9 +12,11 @@ #include #include +#include "mc/mc.h" #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" +#include "src/mc/mc_replay.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm, s4u_activity, "S4U asynchronous communications"); @@ -60,6 +62,89 @@ Comm::~Comm() } } +void Comm::send(kernel::actor::ActorImpl* sender, const Mailbox* mbox, double task_size, double rate, void* src_buff, + size_t src_buff_size, bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, double timeout) +{ + /* checking for infinite values */ + xbt_assert(std::isfinite(task_size), "task_size is not finite!"); + xbt_assert(std::isfinite(rate), "rate is not finite!"); + xbt_assert(std::isfinite(timeout), "timeout is not finite!"); + + 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, and wants comm to be nullptr during the simcall */ + simgrid::kernel::activity::ActivityImplPtr comm = nullptr; + + simgrid::kernel::actor::CommIsendSimcall send_observer{ + sender, mbox->get_impl(), task_size, rate, static_cast(src_buff), src_buff_size, match_fun, + nullptr, copy_data_fun, data, false}; + comm = simgrid::kernel::actor::simcall_answered( + [&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 { + simgrid::kernel::actor::CommIsendSimcall observer(sender, mbox->get_impl(), task_size, rate, + static_cast(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); + }); + } +} + +void Comm::recv(kernel::actor::ActorImpl* receiver, const Mailbox* mbox, void* dst_buff, size_t* dst_buff_size, + bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), + void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, double timeout, + double rate) +{ + xbt_assert(std::isfinite(timeout), "timeout is not finite!"); + 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, and wants comm to be nullptr during the simcall */ + simgrid::kernel::activity::ActivityImplPtr comm = nullptr; + + simgrid::kernel::actor::CommIrecvSimcall observer{receiver, + mbox->get_impl(), + static_cast(dst_buff), + dst_buff_size, + match_fun, + copy_data_fun, + data, + rate}; + comm = simgrid::kernel::actor::simcall_answered( + [&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 { + simgrid::kernel::actor::CommIrecvSimcall observer(receiver, mbox->get_impl(), static_cast(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); + }); + } +} + CommPtr Comm::sendto_init() { CommPtr res(new Comm()); @@ -306,13 +391,13 @@ Comm* Comm::wait_for(double timeout) return vetoable_start()->wait_for(timeout); // In the case of host2host comm, do it in two simcalls } else if (src_buff_ != nullptr) { on_send(*this); - simcall_comm_send(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_, - copy_data_function_, get_data(), timeout); + send(sender_, mailbox_, remains_, rate_, src_buff_, src_buff_size_, match_fun_, copy_data_function_, + get_data(), timeout); } else { // Receiver on_recv(*this); - simcall_comm_recv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_, - get_data(), timeout, rate_); + recv(receiver_, mailbox_, dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_, get_data(), + timeout, rate_); } break; case State::STARTED: diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 9b1ea6bb2a..79e3cb03c2 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -10,22 +10,11 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "mc/mc.h" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/activity/CommImpl.hpp" -#include "src/kernel/activity/ConditionVariableImpl.hpp" -#include "src/kernel/activity/MutexImpl.hpp" -#include "src/kernel/activity/SemaphoreImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" -#include "src/mc/mc_replay.hpp" -#include "xbt/random.hpp" -#include #include -#include -#include -#include - XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); /** @@ -34,44 +23,11 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); void simcall_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, - double timeout) + double timeout) // XBT_ATTRIB_DEPRECATED_v335 { - /* checking for infinite values */ - xbt_assert(std::isfinite(task_size), "task_size is not finite!"); - xbt_assert(std::isfinite(rate), "rate is not finite!"); - xbt_assert(std::isfinite(timeout), "timeout is not finite!"); - 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, 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_answered( - [&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 { - simgrid::kernel::actor::CommIsendSimcall observer(sender, mbox, task_size, rate, - static_cast(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); - }); - } + simgrid::s4u::Comm::send(sender, mbox->get_iface(), task_size, rate, src_buff, src_buff_size, match_fun, + copy_data_fun, data, timeout); } /** @@ -102,39 +58,13 @@ simcall_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, dou void simcall_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, bool (*match_fun)(void*, void*, simgrid::kernel::activity::CommImpl*), void (*copy_data_fun)(simgrid::kernel::activity::CommImpl*, void*, size_t), void* data, - double timeout, double rate) + double timeout, double rate) // XBT_ATTRIB_DEPRECATED_v335 { - xbt_assert(std::isfinite(timeout), "timeout is not finite!"); 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, 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_answered( - [&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 { - simgrid::kernel::actor::CommIrecvSimcall observer(receiver, mbox, static_cast(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); - }); - } + simgrid::s4u::Comm::recv(receiver, mbox->get_iface(), dst_buff, dst_buff_size, match_fun, copy_data_fun, data, + timeout, rate); } + /** * @ingroup simix_comm_management */ -- 2.20.1