return request;
}
+static void smpi_mpi_request_free_voidp(void* request)
+{
+ smpi_mpi_request_free(request);
+}
+
/* MPI Low level calls */
MPI_Request smpi_mpi_send_init(void *buf, int count, MPI_Datatype datatype,
int dst, int tag, MPI_Comm comm)
request->action =
SIMIX_req_comm_isend(mailbox, request->size, -1.0,
request->buf, request->size,
- &match_send,free, // a simple free is used to free the buffer
+ &match_send,
+ &smpi_mpi_request_free_voidp, // how to free the userdata if a detached send fails
request,
// detach if msg size < eager/rdv switch limit
detached);
void smpi_mpi_wait(MPI_Request * request, MPI_Status * status)
{
print_request("Waiting", *request);
- if ((*request)->action != NULL) {
-
- SIMIX_req_comm_wait((*request)->action, -1.0);
+ if ((*request)->action != NULL) { // this is not a detached send
+ SIMIX_req_comm_wait((*request)->action, -1.0);
+ finish_wait(request, status);
}
- finish_wait(request, status);
+ // FIXME for a detached send, finish_wait is not called:
}
int smpi_mpi_waitany(int count, MPI_Request requests[],