+int Request::finish_nbc_requests(MPI_Request* request, int test){
+ int flag = 1;
+ int ret = 0;
+ if(test == 0)
+ ret = waitall((*request)->nbc_requests_.size(), (*request)->nbc_requests_.data(), MPI_STATUSES_IGNORE);
+ else{
+ ret = testall((*request)->nbc_requests_.size(), (*request)->nbc_requests_.data(), &flag, MPI_STATUSES_IGNORE);
+ }
+ if(ret!=MPI_SUCCESS)
+ xbt_die("Failure when waiting on non blocking collective sub-requests");
+ if(flag == 1){
+ XBT_DEBUG("Finishing non blocking collective request with %zu sub-requests", (*request)->nbc_requests_.size());
+ for(auto& req: (*request)->nbc_requests_){
+ if((*request)->buf_!=nullptr && req!=MPI_REQUEST_NULL){//reduce case
+ void * buf=req->buf_;
+ if((*request)->type_->flags() & DT_FLAG_DERIVED)
+ buf=req->old_buf_;
+ if(req->flags_ & MPI_REQ_RECV ){
+ if((*request)->op_!=MPI_OP_NULL){
+ int count=(*request)->size_/ (*request)->type_->size();
+ (*request)->op_->apply(buf, (*request)->buf_, &count, (*request)->type_);
+ }
+ smpi_free_tmp_buffer(static_cast<unsigned char*>(buf));
+ }
+ }
+ if(req!=MPI_REQUEST_NULL)
+ Request::unref(&req);
+ }
+ (*request)->nbc_requests_.clear();
+ }
+ return flag;
+}
+