X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/aa67057cbae409c22a57e9dcf4d82a2859e97f45..5ac17b95ed6baf225a7d90d65536e0ce1843ec93:/src/s4u/s4u_Mailbox.cpp diff --git a/src/s4u/s4u_Mailbox.cpp b/src/s4u/s4u_Mailbox.cpp index 421486f48c..03c12aa6c4 100644 --- a/src/s4u/s4u_Mailbox.cpp +++ b/src/s4u/s4u_Mailbox.cpp @@ -5,10 +5,8 @@ #include "simgrid/s4u/Comm.hpp" #include "simgrid/s4u/Mailbox.hpp" -#include "src/msg/msg_private.hpp" -#include "src/simix/ActorImpl.hpp" -#include "src/simix/smx_network_private.hpp" -#include "xbt/log.h" +#include "src/kernel/activity/MailboxImpl.hpp" +#include XBT_LOG_EXTERNAL_CATEGORY(s4u); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_channel, s4u, "S4U Communication Mailboxes"); @@ -26,7 +24,7 @@ const char* Mailbox::get_cname() const return pimpl_->get_cname(); } -MailboxPtr Mailbox::by_name(const char* name) +MailboxPtr Mailbox::by_name(std::string name) { kernel::activity::MailboxImpl* mbox = kernel::activity::MailboxImpl::byNameOrNull(name); if (mbox == nullptr) { @@ -35,11 +33,6 @@ MailboxPtr Mailbox::by_name(const char* name) return MailboxPtr(&mbox->piface_, true); } -MailboxPtr Mailbox::by_name(std::string name) -{ - return by_name(name.c_str()); -} - bool Mailbox::empty() { return pimpl_->comm_queue.empty(); @@ -75,38 +68,38 @@ CommPtr Mailbox::put_init() res->mailbox_ = this; return res; } -s4u::CommPtr Mailbox::put_init(void* data, uint64_t simulatedSize) +s4u::CommPtr Mailbox::put_init(void* data, uint64_t simulated_size_in_bytes) { s4u::CommPtr res = put_init(); - res->set_remaining(simulatedSize); + res->set_remaining(simulated_size_in_bytes); res->src_buff_ = data; res->src_buff_size_ = sizeof(void*); return res; } -s4u::CommPtr Mailbox::put_async(void* payload, uint64_t simulatedSize) +s4u::CommPtr Mailbox::put_async(void* payload, uint64_t simulated_size_in_bytes) { xbt_assert(payload != nullptr, "You cannot send nullptr"); - s4u::CommPtr res = put_init(payload, simulatedSize); + s4u::CommPtr res = put_init(payload, simulated_size_in_bytes); res->start(); return res; } -void Mailbox::put(void* payload, uint64_t simulatedSize) +void Mailbox::put(void* payload, uint64_t simulated_size_in_bytes) { xbt_assert(payload != nullptr, "You cannot send nullptr"); CommPtr c = put_init(); - c->set_remaining(simulatedSize); + c->set_remaining(simulated_size_in_bytes); c->set_src_data(payload); c->wait(); } /** Blocking send with timeout */ -void Mailbox::put(void* payload, uint64_t simulatedSize, double timeout) +void Mailbox::put(void* payload, uint64_t simulated_size_in_bytes, double timeout) { xbt_assert(payload != nullptr, "You cannot send nullptr"); CommPtr c = put_init(); - c->set_remaining(simulatedSize); + c->set_remaining(simulated_size_in_bytes); c->set_src_data(payload); // c->start() is optional. c->wait(timeout); @@ -145,3 +138,28 @@ void* Mailbox::get(double timeout) } } // namespace s4u } // namespace simgrid + +/* **************************** Public C interface *************************** */ +/** \brief Set the mailbox to receive in asynchronous mode + * + * All messages sent to this mailbox will be transferred to the receiver without waiting for the receive call. + * The receive call will still be necessary to use the received data. + * If there is a need to receive some messages asynchronously, and some not, two different mailboxes should be used. + * + * \param alias The name of the mailbox + */ +void sg_mailbox_set_receiver(const char* alias) +{ + simgrid::s4u::Mailbox::by_name(alias)->set_receiver(simgrid::s4u::Actor::self()); + XBT_VERB("%s mailbox set to receive eagerly for myself\n", alias); +} + +/** \brief Check if there is a communication going on in a mailbox. + * + * \param alias the name of the mailbox to be considered + * \return Returns 1 if there is a communication, 0 otherwise + */ +int sg_mailbox_listen(const char* alias) +{ + return simgrid::s4u::Mailbox::by_name(alias)->listen() ? 1 : 0; +}