+void Comm::start() {
+ xbt_assert(state_ == inited);
+
+ if (srcBuff_ != nullptr) { // Sender side
+ pimpl_ = simcall_comm_isend(sender_, mailbox_->getImpl(), remains_, rate_,
+ srcBuff_, srcBuffSize_,
+ matchFunction_, cleanFunction_, copyDataFunction_,
+ userData_, detached_);
+ } else if (dstBuff_ != nullptr) { // Receiver side
+ pimpl_ = simcall_comm_irecv(receiver_, mailbox_->getImpl(), dstBuff_, &dstBuffSize_,
+ matchFunction_, copyDataFunction_,
+ userData_, rate_);
+
+ } else {
+ xbt_die("Cannot start a communication before specifying whether we are the sender or the receiver");
+ }
+ state_ = started;
+}
+void Comm::wait() {
+ xbt_assert(state_ == started || state_ == inited);
+
+ if (state_ == started)
+ simcall_comm_wait(pimpl_, -1/*timeout*/);
+ else { // state_ == inited. Save a simcall and do directly a blocking send/recv
+ if (srcBuff_ != nullptr) {
+ simcall_comm_send(sender_, mailbox_->getImpl(), remains_, rate_,
+ srcBuff_, srcBuffSize_,
+ matchFunction_, copyDataFunction_,
+ userData_, -1 /*timeout*/);
+ } else {
+ simcall_comm_recv(receiver_, mailbox_->getImpl(), dstBuff_, &dstBuffSize_,
+ matchFunction_, copyDataFunction_,
+ userData_, -1/*timeout*/, rate_);
+ }
+ }
+ state_ = finished;
+ if (pimpl_)
+ pimpl_->unref();
+}