X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/befbbbe1fbb31663a8f91e24ce12df271cf4ae79..423d3ad610d6a1e0587b42fd7d2a7a9959af778d:/src/s4u/s4u_comm.cpp diff --git a/src/s4u/s4u_comm.cpp b/src/s4u/s4u_comm.cpp index 7729d3e6f9..95a5a8712d 100644 --- a/src/s4u/s4u_comm.cpp +++ b/src/s4u/s4u_comm.cpp @@ -25,22 +25,6 @@ Comm::~Comm() } } -s4u::CommPtr Comm::send_init(s4u::MailboxPtr chan) -{ - CommPtr res = CommPtr(new s4u::Comm()); - res->sender_ = SIMIX_process_self(); - res->mailbox_ = chan; - return res; -} - -s4u::CommPtr Comm::recv_init(s4u::MailboxPtr chan) -{ - CommPtr res = CommPtr(new s4u::Comm()); - res->receiver_ = SIMIX_process_self(); - res->mailbox_ = chan; - return res; -} - void Comm::setRate(double rate) { xbt_assert(state_==inited); rate_ = rate; @@ -99,7 +83,10 @@ void Comm::start() { state_ = started; } void Comm::wait() { - xbt_assert(state_ == started || state_ == inited); + xbt_assert(state_ == started || state_ == inited || state_ == finished); + + if (state_ == finished) + return; if (state_ == started) simcall_comm_wait(pimpl_, -1/*timeout*/); @@ -119,7 +106,10 @@ void Comm::wait() { } void Comm::wait(double timeout) { - xbt_assert(state_ == started || state_ == inited); + xbt_assert(state_ == started || state_ == inited || state_ == finished); + + if (state_ == finished) + return; if (state_ == started) { simcall_comm_wait(pimpl_, timeout); @@ -141,32 +131,12 @@ void Comm::wait(double timeout) { state_ = finished; } -void Comm::send_detached(MailboxPtr dest, void* data, int simulatedSize) +void Comm::detach() { - s4u::CommPtr res = CommPtr(s4u::Comm::send_init(dest)); - res->setRemains(simulatedSize); - res->srcBuff_ = data; - res->srcBuffSize_ = sizeof(void*); - 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)); - res->setRemains(simulatedSize); - res->srcBuff_ = data; - res->srcBuffSize_ = sizeof(void*); - res->start(); - return res; -} - -s4u::CommPtr Comm::recv_async(MailboxPtr dest, void** data) -{ - s4u::CommPtr res = CommPtr(s4u::Comm::recv_init(dest)); - res->setDstData(data, sizeof(*data)); - res->start(); - return res; + xbt_assert(state_ == inited, "You cannot detach communications once they are started."); + xbt_assert(srcBuff_ != nullptr && srcBuffSize_ != 0, "You can only detach sends, not recvs"); + detached_ = true; + start(); } void Comm::cancel() @@ -176,11 +146,13 @@ void Comm::cancel() commPimpl->cancel(); } -bool Comm::test() { +bool Comm::test() +{ xbt_assert(state_ == inited || state_ == started || state_ == finished); - if (state_ == finished) - xbt_die("Don't call test on a finished comm."); + if (state_ == finished) { + return true; + } if (state_ == inited) { this->start(); @@ -193,6 +165,11 @@ bool Comm::test() { return false; } +MailboxPtr Comm::mailbox() +{ + return mailbox_; +} + void intrusive_ptr_release(simgrid::s4u::Comm* c) { if (c->refcount_.fetch_sub(1, std::memory_order_release) == 1) {