-void s4u::Comm::wait() {
- xbt_assert(p_state == started || p_state == inited);
-
- if (p_state == started)
- simcall_comm_wait(p_inferior, -1/*timeout*/);
- else {// p_state == inited. Save a simcall and do directly a blocking send/recv
- if (p_srcBuff != NULL) {
- simcall_comm_send(p_sender->getInferior(), p_mailbox->getInferior(), p_remains, p_rate,
- p_srcBuff, p_srcBuffSize,
- p_matchFunction, p_copyDataFunction,
- p_userData, -1 /*timeout*/);
- } else {
- simcall_comm_recv(p_receiver->getInferior(), p_mailbox->getInferior(), p_dstBuff, &p_dstBuffSize,
- p_matchFunction, p_copyDataFunction,
- p_userData, -1/*timeout*/, p_rate);
- }
- }
- p_state = finished;
+void Comm::wait() {
+ xbt_assert(state_ == started || state_ == inited);
+
+ if (state_ == started)
+ simcall_comm_wait(pimpl_, -1/*timeout*/);
+ else {// p_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;
+ delete this;
+}
+void Comm::wait(double timeout) {
+ xbt_assert(state_ == started || state_ == inited);
+
+ 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;
+ delete this;