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)
detached = 1;
request->buf = malloc(request->size);
memcpy(request->buf,oldbuf,request->size);
+ XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
+ } else {
+ XBT_DEBUG("Send request %p is not detached (buf: %p)",request,request->buf);
}
-
request->action =
SIMIX_req_comm_isend(mailbox, request->size, -1.0,
- request->buf, request->size, &match_send, request,
+ request->buf, request->size,
+ &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);
- finish_wait(request, status);
+ if ((*request)->action != NULL) { // this is not a detached send
+ SIMIX_req_comm_wait((*request)->action, -1.0);
+ finish_wait(request, status);
+ }
+ // FIXME for a detached send, finish_wait is not called:
}
int smpi_mpi_waitany(int count, MPI_Request requests[],