X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/629bbb0ea28eee8adebd687a0ed72ca9bf110a26..230f14e9e54194231417a6afe68983b67693ed6d:/include/simgrid/s4u/Comm.hpp diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index 2577c88845..167f70ca7a 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -42,17 +42,35 @@ class XBT_PUBLIC Comm : public Activity_T { protected: static xbt::signal on_send; static xbt::signal on_recv; - static xbt::signal on_start; + inline static xbt::signal on_start; + xbt::signal on_this_start; - void fire_on_completion() const override { /* Do nothing */ } - void fire_on_veto() const override { on_veto(const_cast(*this)); } + void fire_on_completion() const override { + /* The completion signal of a Comm has to be thrown only once and not by the sender AND the receiver. + then Comm::on_completion is thrown in the kernel in CommImpl::finish. + */ + } + void fire_on_this_completion() const override { + /* The completion signal of a Comm has to be thrown only once and not by the sender AND the receiver. + then Comm::on_completion is thrown in the kernel in CommImpl::finish. + */ + } void fire_on_suspend() const override { on_suspend(*this); } + void fire_on_this_suspend() const override { on_this_suspend(*this); } void fire_on_resume() const override { on_resume(*this); } + void fire_on_this_resume() const override { on_this_resume(*this); } + void fire_on_veto() const override { on_veto(const_cast(*this)); } + void fire_on_this_veto() const override { on_this_veto(const_cast(*this)); } public: + /*! \static Add a callback fired when the send of any Comm is posted */ static void on_send_cb(const std::function& cb) { on_send.connect(cb); } + /*! \static Add a callback fired when the recv of any Comm is posted */ static void on_recv_cb(const std::function& cb) { on_recv.connect(cb); } + /*! \static Add a callback fired when any Comm starts */ static void on_start_cb(const std::function& cb) { on_start.connect(cb); } + /*! Add a callback fired when this specific Comm starts */ + void on_this_start_cb(const std::function& cb) { on_this_start.connect(cb); } CommPtr set_copy_data_callback(const std::function& callback); XBT_ATTRIB_DEPRECATED_v337("Please manifest if you actually need this function") static void copy_buffer_callback( @@ -72,7 +90,8 @@ public: const std::function& copy_data_fun, void* data, double timeout, double rate); - /* "One-sided" communications. This way of communicating bypasses the mailbox and actors mechanism. It creates a + /* \static + * "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 * involved hosts! Enjoy the comfort of the simulator :) @@ -165,19 +184,19 @@ public: Comm* wait_for(double timeout) override; - /*! take a vector s4u::CommPtr and return the rank of the first finished one (or -1 if none is done). */ + /*! \static take a vector s4u::CommPtr and return the rank of the first finished one (or -1 if none is done). */ static ssize_t test_any(const std::vector& comms); - /*! take a vector s4u::CommPtr and return when one of them is finished. + /*! \static take a vector s4u::CommPtr and return when one of them is finished. * The return value is the rank of the first finished CommPtr. */ static ssize_t wait_any(const std::vector& comms) { return wait_any_for(comms, -1); } - /*! Same as wait_any, but with a timeout. Return -1 if the timeout occurs.*/ + /*! \static Same as wait_any, but with a timeout. Return -1 if the timeout occurs.*/ static ssize_t wait_any_for(const std::vector& comms, double timeout); - /*! take a vector s4u::CommPtr and return when all of them is finished. */ + /*! \static take a vector s4u::CommPtr and return when all of them is finished. */ static void wait_all(const std::vector& comms); - /*! Same as wait_all, but with a timeout. Return the number of terminated comm (less than comms.size() if the timeout - * occurs). */ + /*! \static Same as wait_all, but with a timeout. Return the number of terminated comm (less than comms.size() if + * the timeout occurs). */ static size_t wait_all_for(const std::vector& comms, double timeout); }; } // namespace simgrid::s4u