X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/45ae0195c6ad8232415288c5da07b4bdc23a31b4..c8b31ee6aba2b75d54acd9c94514d54da16168d6:/src/s4u/s4u_comm.cpp diff --git a/src/s4u/s4u_comm.cpp b/src/s4u/s4u_comm.cpp index da54cdd23a..7729d3e6f9 100644 --- a/src/s4u/s4u_comm.cpp +++ b/src/s4u/s4u_comm.cpp @@ -23,8 +23,6 @@ Comm::~Comm() XBT_INFO("pimpl_ is null"); xbt_backtrace_display_current(); } - if (pimpl_) - pimpl_->unref(); } s4u::CommPtr Comm::send_init(s4u::MailboxPtr chan) @@ -90,6 +88,7 @@ void Comm::start() { matchFunction_, cleanFunction_, copyDataFunction_, userData_, detached_); } else if (dstBuff_ != nullptr) { // Receiver side + xbt_assert(not detached_, "Receive cannot be detached"); pimpl_ = simcall_comm_irecv(receiver_, mailbox_->getImpl(), dstBuff_, &dstBuffSize_, matchFunction_, copyDataFunction_, userData_, rate_); @@ -97,11 +96,6 @@ void Comm::start() { } else { xbt_die("Cannot start a communication before specifying whether we are the sender or the receiver"); } - while (refcount_ > 1) { // Pass all the refcounts we had to the underlying pimpl since we are delegating the - // refcounting to it afterward - refcount_--; - pimpl_->ref(); - } state_ = started; } void Comm::wait() { @@ -123,6 +117,7 @@ void Comm::wait() { } state_ = finished; } + void Comm::wait(double timeout) { xbt_assert(state_ == started || state_ == inited); @@ -155,6 +150,7 @@ void Comm::send_detached(MailboxPtr dest, void* data, int simulatedSize) res->detached_ = true; res->start(); } + s4u::CommPtr Comm::send_async(MailboxPtr dest, void* data, int simulatedSize) { s4u::CommPtr res = CommPtr(s4u::Comm::send_init(dest)); @@ -175,19 +171,21 @@ s4u::CommPtr Comm::recv_async(MailboxPtr dest, void** data) void Comm::cancel() { - simgrid::kernel::activity::Comm* commPimpl = static_cast(pimpl_); + simgrid::kernel::activity::CommImplPtr commPimpl = + boost::static_pointer_cast(pimpl_); commPimpl->cancel(); } + bool Comm::test() { xbt_assert(state_ == inited || state_ == started || state_ == finished); - - if (state_ == finished) + + if (state_ == finished) xbt_die("Don't call test on a finished comm."); - + if (state_ == inited) { this->start(); } - + if(simcall_comm_test(pimpl_)){ state_ = finished; return true; @@ -197,23 +195,14 @@ bool Comm::test() { void intrusive_ptr_release(simgrid::s4u::Comm* c) { - if (c->pimpl_ != nullptr) { - if (c->pimpl_->unref()) { - c->pimpl_ = nullptr; - delete c; - } - } else if (c->refcount_.fetch_sub(1, std::memory_order_release) == 1) { + if (c->refcount_.fetch_sub(1, std::memory_order_release) == 1) { std::atomic_thread_fence(std::memory_order_acquire); delete c; } } void intrusive_ptr_add_ref(simgrid::s4u::Comm* c) { - if (c->pimpl_ != nullptr) { - c->pimpl_->ref(); - } else { - c->refcount_.fetch_add(1, std::memory_order_relaxed); - } + c->refcount_.fetch_add(1, std::memory_order_relaxed); } } } // namespaces