- if((*request)->refcount_==0){
- if ((*request)->flags_ & MPI_REQ_GENERALIZED){
- ((*request)->generalized_funcs)->free_fn(((*request)->generalized_funcs)->extra_state);
- delete (*request)->generalized_funcs;
- }else{
- Comm::unref((*request)->comm_);
- Datatype::unref((*request)->old_type_);
+ if ((*request)->op_ != MPI_REPLACE && (*request)->op_ != MPI_OP_NULL)
+ Op::unref(&(*request)->op_);
+
+ (*request)->print_request("Destroying");
+ F2C::free_f((*request)->f2c_id());
+ delete *request;
+ *request = MPI_REQUEST_NULL;
+ } else {
+ (*request)->print_request("Decrementing");
+ }
+}
+
+bool Request::match_common(MPI_Request req, MPI_Request sender, MPI_Request receiver)
+{
+ xbt_assert(sender, "Cannot match against null sender");
+ xbt_assert(receiver, "Cannot match against null receiver");
+ XBT_DEBUG("Trying to match %s of sender src %d against %d, tag %d against %d, id %d against %d",
+ (req == receiver ? "send" : "recv"), sender->src_, receiver->src_, sender->tag_, receiver->tag_,
+ sender->comm_->id(), receiver->comm_->id());
+
+ if ((receiver->comm_->id() == MPI_UNDEFINED || sender->comm_->id() == MPI_UNDEFINED ||
+ receiver->comm_->id() == sender->comm_->id()) &&
+ ((receiver->src_ == MPI_ANY_SOURCE && (receiver->comm_->group()->rank(sender->src_) != MPI_UNDEFINED)) ||
+ receiver->src_ == sender->src_) &&
+ ((receiver->tag_ == MPI_ANY_TAG && sender->tag_ >= 0) || receiver->tag_ == sender->tag_)) {
+ // we match, we can transfer some values
+ if (receiver->src_ == MPI_ANY_SOURCE)
+ receiver->real_src_ = sender->src_;
+ if (receiver->tag_ == MPI_ANY_TAG)
+ receiver->real_tag_ = sender->tag_;
+ if ((receiver->flags_ & MPI_REQ_PROBE) == 0 ){
+ if (receiver->real_size_ < sender->real_size_){
+ XBT_DEBUG("Truncating message - should not happen: receiver size : %zu < sender size : %zu", receiver->real_size_, sender->real_size_);
+ receiver->truncated_ = true;
+ } else if (receiver->real_size_ > sender->real_size_){
+ receiver->real_size_=sender->real_size_;