X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9221fa1d03e31904ab968278372863883b0aaca5..cd5185ae774cc99650b6cae2dca17b6062accea3:/src/smpi/bindings/smpi_f77_request.cpp diff --git a/src/smpi/bindings/smpi_f77_request.cpp b/src/smpi/bindings/smpi_f77_request.cpp index f36f095fcb..e61c66c50e 100644 --- a/src/smpi/bindings/smpi_f77_request.cpp +++ b/src/smpi/bindings/smpi_f77_request.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2023. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -13,28 +13,31 @@ extern "C" { // This should really use the C linkage to be usable from Fortran void mpi_send_init_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr) { MPI_Request req; + *request = MPI_FORTRAN_REQUEST_NULL; buf = static_cast(FORT_BOTTOM(buf)); *ierr = MPI_Send_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dst, *tag, simgrid::smpi::Comm::f2c(*comm), &req); - if(*ierr == MPI_SUCCESS) { - *request = req->add_f(); + if(*ierr == MPI_SUCCESS && req != nullptr) { + *request = req->c2f(); } } void mpi_isend_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr) { MPI_Request req; + *request = MPI_FORTRAN_REQUEST_NULL; buf = static_cast(FORT_BOTTOM(buf)); *ierr = MPI_Isend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dst, *tag, simgrid::smpi::Comm::f2c(*comm), &req); - if(*ierr == MPI_SUCCESS) { - *request = req->add_f(); + if(*ierr == MPI_SUCCESS && req != nullptr) { + *request = req->c2f(); } } void mpi_irsend_(void *buf, int* count, int* datatype, int* dst, int* tag, int* comm, int* request, int* ierr) { MPI_Request req; + *request = MPI_FORTRAN_REQUEST_NULL; buf = static_cast(FORT_BOTTOM(buf)); *ierr = MPI_Irsend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dst, *tag, simgrid::smpi::Comm::f2c(*comm), &req); - if(*ierr == MPI_SUCCESS) { - *request = req->add_f(); + if(*ierr == MPI_SUCCESS && req != nullptr) { + *request = req->c2f(); } } @@ -58,19 +61,21 @@ void mpi_sendrecv_(void* sendbuf, int* sendcount, int* sendtype, int* dst, int* void mpi_recv_init_(void *buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr) { MPI_Request req; + *request = MPI_FORTRAN_REQUEST_NULL; buf = static_cast( FORT_BOTTOM(buf)); *ierr = MPI_Recv_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *src, *tag, simgrid::smpi::Comm::f2c(*comm), &req); if(*ierr == MPI_SUCCESS) { - *request = req->add_f(); + *request = req->c2f(); } } void mpi_irecv_(void *buf, int* count, int* datatype, int* src, int* tag, int* comm, int* request, int* ierr) { MPI_Request req; + *request = MPI_FORTRAN_REQUEST_NULL; buf = static_cast( FORT_BOTTOM(buf)); *ierr = MPI_Irecv(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *src, *tag, simgrid::smpi::Comm::f2c(*comm), &req); - if(*ierr == MPI_SUCCESS) { - *request = req->add_f(); + if(*ierr == MPI_SUCCESS && req != nullptr) { + *request = req->c2f(); } } @@ -82,20 +87,21 @@ void mpi_recv_(void* buf, int* count, int* datatype, int* src, int* tag, int* co void mpi_sendrecv_replace_ (void *buf, int* count, int* datatype, int* dst, int* sendtag, int* src, int* recvtag, int* comm, MPI_Status* status, int* ierr) { - *ierr = MPI_Sendrecv_replace(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dst, *sendtag, *src, - *recvtag, simgrid::smpi::Comm::f2c(*comm), FORT_STATUS_IGNORE(status)); + *ierr = MPI_Sendrecv_replace(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dst, *sendtag, *src, + *recvtag, simgrid::smpi::Comm::f2c(*comm), FORT_STATUS_IGNORE(status)); } void mpi_ssend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr) { - *ierr = MPI_Ssend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm)); + *ierr = MPI_Ssend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm)); } void mpi_ssend_init_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* request, int* ierr) { MPI_Request tmp; - *ierr = MPI_Ssend_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); - if(*ierr == MPI_SUCCESS) { - *request = tmp->add_f(); - } + *request = MPI_FORTRAN_REQUEST_NULL; + *ierr = MPI_Ssend_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); + if(*ierr == MPI_SUCCESS && tmp != nullptr) { + *request = tmp->c2f(); + } } void mpi_bsend_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* comm, int* ierr) { @@ -104,34 +110,38 @@ void mpi_bsend_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* void mpi_bsend_init_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* comm, int* request, int* ierr) { MPI_Request tmp; + *request = MPI_FORTRAN_REQUEST_NULL; *ierr = MPI_Bsend_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); - if(*ierr == MPI_SUCCESS) { - *request = tmp->add_f(); - } + if(*ierr == MPI_SUCCESS && tmp != nullptr) { + *request = tmp->c2f(); + } } void mpi_ibsend_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* comm, int* request, int* ierr) { MPI_Request tmp; + *request = MPI_FORTRAN_REQUEST_NULL; *ierr = MPI_Ibsend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); - if(*ierr == MPI_SUCCESS) { - *request = tmp->add_f(); - } + if(*ierr == MPI_SUCCESS && tmp != nullptr) { + *request = tmp->c2f(); + } } void mpi_issend_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* comm, int* request, int* ierr) { MPI_Request tmp; + *request = MPI_FORTRAN_REQUEST_NULL; *ierr = MPI_Issend(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); - if(*ierr == MPI_SUCCESS) { - *request = tmp->add_f(); - } + if(*ierr == MPI_SUCCESS && tmp != nullptr) { + *request = tmp->c2f(); + } } void mpi_rsend_init_ (void* buf, int* count, int* datatype, int *dest, int* tag, int* comm, int* request, int* ierr) { MPI_Request tmp; + *request = MPI_FORTRAN_REQUEST_NULL; *ierr = MPI_Rsend_init(buf, *count, simgrid::smpi::Datatype::f2c(*datatype), *dest, *tag, simgrid::smpi::Comm::f2c(*comm), &tmp); - if(*ierr == MPI_SUCCESS) { - *request = tmp->add_f(); - } + if(*ierr == MPI_SUCCESS && tmp != nullptr) { + *request = tmp->c2f(); + } } void mpi_start_(int* request, int* ierr) { @@ -140,16 +150,13 @@ void mpi_start_(int* request, int* ierr) { *ierr = MPI_Start(&req); } -void mpi_startall_(int* count, int* requests, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *count); - for(i = 0; i < *count; i++) { +void mpi_startall_(int* count, int* requests, int* ierr) +{ + std::vector reqs(*count); + for (int i = 0; i < *count; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr = MPI_Startall(*count, reqs); - xbt_free(reqs); + *ierr = MPI_Startall(*count, reqs.data()); } void mpi_wait_(int* request, MPI_Status* status, int* ierr) { @@ -162,15 +169,13 @@ void mpi_wait_(int* request, MPI_Status* status, int* ierr) { } } -void mpi_waitany_(int* count, int* requests, int* index, MPI_Status* status, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *count); - for(i = 0; i < *count; i++) { +void mpi_waitany_(int* count, int* requests, int* index, MPI_Status* status, int* ierr) +{ + std::vector reqs(*count); + for (int i = 0; i < *count; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr = MPI_Waitany(*count, reqs, index, status); + *ierr = MPI_Waitany(*count, reqs.data(), index, status); if(*index!=MPI_UNDEFINED){ if(reqs[*index]==MPI_REQUEST_NULL){ simgrid::smpi::Request::free_f(requests[*index]); @@ -178,45 +183,37 @@ void mpi_waitany_(int* count, int* requests, int* index, MPI_Status* status, int } *index=*index+1; } - xbt_free(reqs); } -void mpi_waitall_(int* count, int* requests, MPI_Status* status, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *count); - for(i = 0; i < *count; i++) { +void mpi_waitall_(int* count, int* requests, MPI_Status* status, int* ierr) +{ + std::vector reqs(*count); + for (int i = 0; i < *count; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr = MPI_Waitall(*count, reqs, FORT_STATUSES_IGNORE(status)); - for(i = 0; i < *count; i++) { - if(reqs[i]==MPI_REQUEST_NULL){ - simgrid::smpi::Request::free_f(requests[i]); - requests[i]=MPI_FORTRAN_REQUEST_NULL; - } + *ierr = MPI_Waitall(*count, reqs.data(), FORT_STATUSES_IGNORE(status)); + for (int i = 0; i < *count; i++) { + if (reqs[i] == MPI_REQUEST_NULL) { + simgrid::smpi::Request::free_f(requests[i]); + requests[i] = MPI_FORTRAN_REQUEST_NULL; + } } - - xbt_free(reqs); } void mpi_waitsome_ (int* incount, int* requests, int *outcount, int *indices, MPI_Status* status, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *incount); - for(i = 0; i < *incount; i++) { + std::vector reqs(*incount); + for (int i = 0; i < *incount; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr = MPI_Waitsome(*incount, reqs, outcount, indices, status); - for(i=0;i<*outcount;i++){ + *ierr = MPI_Waitsome(*incount, reqs.data(), outcount, indices, status); + for (int i = 0; i < *outcount; i++) { if(reqs[indices[i]]==MPI_REQUEST_NULL){ simgrid::smpi::Request::free_f(requests[indices[i]]); requests[indices[i]]=MPI_FORTRAN_REQUEST_NULL; } + indices[i]++; } - xbt_free(reqs); } void mpi_test_ (int * request, int *flag, MPI_Status * status, int* ierr){ @@ -228,32 +225,28 @@ void mpi_test_ (int * request, int *flag, MPI_Status * status, int* ierr){ } } -void mpi_testall_ (int* count, int * requests, int *flag, MPI_Status * statuses, int* ierr){ - int i; - MPI_Request* reqs = xbt_new(MPI_Request, *count); - for(i = 0; i < *count; i++) { +void mpi_testall_(int* count, int* requests, int* flag, MPI_Status* statuses, int* ierr) +{ + std::vector reqs(*count); + for (int i = 0; i < *count; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr= MPI_Testall(*count, reqs, flag, FORT_STATUSES_IGNORE(statuses)); - for(i = 0; i < *count; i++) { + *ierr = MPI_Testall(*count, reqs.data(), flag, FORT_STATUSES_IGNORE(statuses)); + for (int i = 0; i < *count; i++) { if(reqs[i]==MPI_REQUEST_NULL){ simgrid::smpi::Request::free_f(requests[i]); requests[i]=MPI_FORTRAN_REQUEST_NULL; } } - xbt_free(reqs); } void mpi_testany_ (int* count, int* requests, int *index, int *flag, MPI_Status* status, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *count); - for(i = 0; i < *count; i++) { + std::vector reqs(*count); + for (int i = 0; i < *count; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); } - *ierr = MPI_Testany(*count, reqs, index, flag, FORT_STATUS_IGNORE(status)); + *ierr = MPI_Testany(*count, reqs.data(), index, flag, FORT_STATUS_IGNORE(status)); if(*index!=MPI_UNDEFINED){ if(reqs[*index]==MPI_REQUEST_NULL){ simgrid::smpi::Request::free_f(requests[*index]); @@ -261,26 +254,23 @@ void mpi_testany_ (int* count, int* requests, int *index, int *flag, MPI_Status* } *index=*index+1; } - xbt_free(reqs); } -void mpi_testsome_ (int* incount, int* requests, int* outcount, int* indices, MPI_Status* statuses, int* ierr) { - MPI_Request* reqs; - int i; - - reqs = xbt_new(MPI_Request, *incount); - for(i = 0; i < *incount; i++) { +void mpi_testsome_(int* incount, int* requests, int* outcount, int* indices, MPI_Status* statuses, int* ierr) +{ + std::vector reqs(*incount); + for (int i = 0; i < *incount; i++) { reqs[i] = simgrid::smpi::Request::f2c(requests[i]); indices[i]=0; } - *ierr = MPI_Testsome(*incount, reqs, outcount, indices, FORT_STATUSES_IGNORE(statuses)); - for(i=0;i<*incount;i++){ - if(indices[i] && reqs[indices[i]]==MPI_REQUEST_NULL){ + *ierr = MPI_Testsome(*incount, reqs.data(), outcount, indices, FORT_STATUSES_IGNORE(statuses)); + for (int i = 0; i < *incount; i++) { + if(reqs[indices[i]]==MPI_REQUEST_NULL){ simgrid::smpi::Request::free_f(requests[indices[i]]); requests[indices[i]]=MPI_FORTRAN_REQUEST_NULL; } + indices[i]++; } - xbt_free(reqs); } void mpi_probe_ (int* source, int* tag, int* comm, MPI_Status* status, int* ierr) {