X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/35f18859ce88a96b7e07de4d7d70867424feb8df..5f6a327912f32b7023f507bd36282be42c22b3c0:/src/smpi/mpi/smpi_request.cpp diff --git a/src/smpi/mpi/smpi_request.cpp b/src/smpi/mpi/smpi_request.cpp index 05cdc18c1e..e9a2a49b49 100644 --- a/src/smpi/mpi/smpi_request.cpp +++ b/src/smpi/mpi/smpi_request.cpp @@ -2,8 +2,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "simgrid/s4u/Mutex.hpp" -#include "simgrid/s4u/ConditionVariable.hpp" + #include "smpi_request.hpp" #include "mc/mc.h" @@ -17,8 +16,6 @@ #include "src/kernel/activity/CommImpl.hpp" #include "src/mc/mc_replay.hpp" #include "src/smpi/include/smpi_actor.hpp" -#include "xbt/config.hpp" - #include @@ -547,7 +544,7 @@ int Request::test(MPI_Request * request, MPI_Status * status, int* flag) { Status::empty(status); *flag = 1; if (((*request)->flags_ & MPI_REQ_PREPARED) == 0) { - if ((*request)->action_ != nullptr){ + if ((*request)->action_ != nullptr && (*request)->cancelled_ != 1){ try{ *flag = simcall_comm_test((*request)->action_); } catch (const Exception&) { @@ -594,15 +591,15 @@ int Request::testsome(int incount, MPI_Request requests[], int *count, int *indi *count = 0; for (int i = 0; i < incount; i++) { - if (requests[i] != MPI_REQUEST_NULL) { + if (requests[i] != MPI_REQUEST_NULL && not (requests[i]->flags_ & MPI_REQ_FINISHED)) { ret = test(&requests[i], pstat, &flag); if(ret!=MPI_SUCCESS) error = 1; if(flag) { - indices[i] = 1; - (*count)++; + indices[*count] = i; if (status != MPI_STATUSES_IGNORE) - status[i] = *pstat; + status[*count] = *pstat; + (*count)++; if ((requests[i] != MPI_REQUEST_NULL) && (requests[i]->flags_ & MPI_REQ_NON_PERSISTENT)) requests[i] = MPI_REQUEST_NULL; } @@ -1060,7 +1057,6 @@ int Request::waitsome(int incount, MPI_Request requests[], int *indices, MPI_Sta int index = 0; MPI_Status stat; MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; - index = waitany(incount, (MPI_Request*)requests, pstat); if(index==MPI_UNDEFINED) return MPI_UNDEFINED; if(status != MPI_STATUSES_IGNORE) { @@ -1069,9 +1065,8 @@ int Request::waitsome(int incount, MPI_Request requests[], int *indices, MPI_Sta indices[count] = index; count++; for (int i = 0; i < incount; i++) { - if (i==index) - continue; - if (requests[i] != MPI_REQUEST_NULL) { + if (i!=index && requests[i] != MPI_REQUEST_NULL + && not(requests[i]->flags_ & MPI_REQ_FINISHED)) { test(&requests[i], pstat,&flag); if (flag==1){ indices[count] = i; @@ -1091,29 +1086,17 @@ MPI_Request Request::f2c(int id) { char key[KEY_SIZE]; if(id==MPI_FORTRAN_REQUEST_NULL) return static_cast(MPI_REQUEST_NULL); - return static_cast(F2C::f2c_lookup()->at(get_key_id(key, id))); -} - -int Request::add_f() -{ - if (F2C::f2c_lookup() == nullptr) { - F2C::set_f2c_lookup(new std::unordered_map); - } - char key[KEY_SIZE]; - (*(F2C::f2c_lookup()))[get_key_id(key, F2C::f2c_id())] = this; - F2C::f2c_id_increment(); - return F2C::f2c_id()-1; + return static_cast(F2C::f2c_lookup()->at(get_key(key,id))); } void Request::free_f(int id) { if (id != MPI_FORTRAN_REQUEST_NULL) { char key[KEY_SIZE]; - F2C::f2c_lookup()->erase(get_key_id(key, id)); + F2C::f2c_lookup()->erase(get_key(key, id)); } } - int Request::get_status(MPI_Request req, int* flag, MPI_Status * status){ *flag=0;