- }else{
- xbt_die("freeing an already free request");
- }
-}
-
-int Request::match_recv(void* a, void* b, simgrid::kernel::activity::CommImpl*)
-{
- MPI_Request ref = static_cast<MPI_Request>(a);
- MPI_Request req = static_cast<MPI_Request>(b);
- XBT_DEBUG("Trying to match a recv of src %d against %d, tag %d against %d",ref->src_,req->src_, ref->tag_, req->tag_);
-
- xbt_assert(ref, "Cannot match recv against null reference");
- xbt_assert(req, "Cannot match recv against null request");
- if((ref->src_ == MPI_ANY_SOURCE || req->src_ == ref->src_)
- && ((ref->tag_ == MPI_ANY_TAG && req->tag_ >=0) || req->tag_ == ref->tag_)){
- //we match, we can transfer some values
- if(ref->src_ == MPI_ANY_SOURCE)
- ref->real_src_ = req->src_;
- if(ref->tag_ == MPI_ANY_TAG)
- ref->real_tag_ = req->tag_;
- if(ref->real_size_ < req->real_size_)
- ref->truncated_ = 1;
- if(req->detached_==1)
- ref->detached_sender_=req; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
- if(req->cancelled_==0)
- req->cancelled_=-1;//mark as uncancellable
- XBT_DEBUG("match succeeded");
- return 1;
- }else return 0;
-}
-
-int Request::match_send(void* a, void* b, simgrid::kernel::activity::CommImpl*)
-{
- MPI_Request ref = static_cast<MPI_Request>(a);
- MPI_Request req = static_cast<MPI_Request>(b);
- XBT_DEBUG("Trying to match a send of src %d against %d, tag %d against %d",ref->src_,req->src_, ref->tag_, req->tag_);
- xbt_assert(ref, "Cannot match send against null reference");
- xbt_assert(req, "Cannot match send against null request");
-
- if((req->src_ == MPI_ANY_SOURCE || req->src_ == ref->src_)
- && ((req->tag_ == MPI_ANY_TAG && ref->tag_ >=0)|| req->tag_ == ref->tag_)){
- if(req->src_ == MPI_ANY_SOURCE)
- req->real_src_ = ref->src_;
- if(req->tag_ == MPI_ANY_TAG)
- req->real_tag_ = ref->tag_;
- if(req->real_size_ < ref->real_size_)
- req->truncated_ = 1;
- if(ref->detached_==1)
- req->detached_sender_=ref; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
- if(req->cancelled_==0)
- req->cancelled_=-1;//mark as uncancellable
- XBT_DEBUG("match succeeded");
- return 1;
- } else
- return 0;
+ } else {
+ match = false;
+ req->flags_ &= ~MPI_REQ_MATCHED;
+ ref->detached_sender_ = nullptr;
+ XBT_DEBUG("Refusing to match message, as its ID is not the one I expect. in comm %p, %u != %u, "
+ "from pid %ld to pid %ld, with tag %d",
+ ref->comm_,
+ ref->comm_->get_received_messages_count(ref->comm_->group()->rank(req->src_),
+ ref->comm_->group()->rank(req->dst_), req->tag_),
+ req->message_id_, req->src_, req->dst_, req->tag_);
+ }
+ return match;