+void Comm::wait(double timeout) {
+ xbt_assert(state_ == started || state_ == inited || state_ == finished);
+
+ if (state_ == finished)
+ return;
+
+ if (state_ == started) {
+ simcall_comm_wait(pimpl_, timeout);
+ state_ = finished;
+ return;
+ }
+
+ // It's not started yet. Do it in one simcall
+ if (srcBuff_ != nullptr) {
+ simcall_comm_send(sender_, mailbox_->getImpl(), remains_, rate_,
+ srcBuff_, srcBuffSize_,
+ matchFunction_, copyDataFunction_,
+ userData_, timeout);
+ } else { // Receiver
+ simcall_comm_recv(receiver_, mailbox_->getImpl(), dstBuff_, &dstBuffSize_,
+ matchFunction_, copyDataFunction_,
+ userData_, timeout, rate_);
+ }
+ state_ = finished;