X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3bef281ca99926ea1a62e27d39c8fbfae05f0318..027d23ef8cbfcc3ff3f8b9731658e5580b409782:/src/s4u/s4u_Comm.cpp diff --git a/src/s4u/s4u_Comm.cpp b/src/s4u/s4u_Comm.cpp index f348f6885a..46515ea934 100644 --- a/src/s4u/s4u_Comm.cpp +++ b/src/s4u/s4u_Comm.cpp @@ -35,7 +35,7 @@ Comm::~Comm() int Comm::wait_any_for(const std::vector* comms, double timeout) { - std::unique_ptr rcomms(new kernel::activity::CommImpl*[comms->size()]); + auto rcomms = std::make_unique(comms->size()); std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) { return static_cast(comm->pimpl_.get()); }); int changed_pos = simcall_comm_waitany(rcomms.get(), comms->size(), timeout); @@ -138,6 +138,10 @@ Comm* Comm::start() } else { xbt_die("Cannot start a communication before specifying whether we are the sender or the receiver"); } + + if (suspended_) + pimpl_->suspend(); + state_ = State::STARTED; return this; } @@ -194,7 +198,7 @@ Comm* Comm::wait_for(double timeout) int Comm::test_any(const std::vector* comms) { - std::unique_ptr rcomms(new kernel::activity::CommImpl*[comms->size()]); + auto rcomms = std::make_unique(comms->size()); std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) { return static_cast(comm->pimpl_.get()); }); int changed_pos = simcall_comm_testany(rcomms.get(), comms->size()); @@ -249,7 +253,10 @@ Mailbox* Comm::get_mailbox() const Actor* Comm::get_sender() const { - return sender_ ? sender_->ciface() : nullptr; + kernel::actor::ActorImplPtr sender = nullptr; + if (pimpl_) + sender = boost::static_pointer_cast(pimpl_)->src_actor_; + return sender ? sender->ciface() : nullptr; } } // namespace s4u @@ -257,9 +264,13 @@ Actor* Comm::get_sender() const /* **************************** Public C interface *************************** */ void sg_comm_detach(sg_comm_t comm, void (*clean_function)(void*)) { - comm = comm->detach(clean_function); + comm->detach(clean_function); + comm->unref(); +} +void sg_comm_unref(sg_comm_t comm) +{ + comm->unref(); } - int sg_comm_test(sg_comm_t comm) { bool finished = comm->test();