#include "mc/mc.h"
#include "xbt/replay.h"
#include <errno.h>
+#include "simix/smx_private.h"
#include "surf/surf.h"
{
MPI_Request request;
- void *old_buf;
+ void *old_buf = NULL;
request = xbt_new(s_smpi_mpi_request_t, 1);
request->comm = comm;
request->action = NULL;
request->flags = flags;
+ request->detached = 0;
#ifdef HAVE_TRACING
request->send = 0;
request->recv = 0;
void smpi_mpi_start(MPI_Request request)
{
smx_rdv_t mailbox;
- int detached = 0;
xbt_assert(!request->action,
"Cannot (re)start a non-finished communication");
// FIXME: SIMIX does not yet support non-contiguous datatypes
request->action = simcall_comm_irecv(mailbox, request->buf, &request->size, &match_recv, request);
} else {
+
+ int receiver = smpi_group_index(smpi_comm_group(request->comm), request->dst);
+/* if(receiver == MPI_UNDEFINED) {*/
+/* XBT_WARN("Trying to send a message to a wrong rank");*/
+/* return;*/
+/* }*/
print_request("New send", request);
if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) { // eager mode
- mailbox = smpi_process_remote_mailbox_small(
- smpi_group_index(smpi_comm_group(request->comm), request->dst));
+ mailbox = smpi_process_remote_mailbox_small(receiver);
}else{
XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf);
- mailbox = smpi_process_remote_mailbox(
- smpi_group_index(smpi_comm_group(request->comm), request->dst));
+ mailbox = smpi_process_remote_mailbox(receiver);
}
if (request->size < 64*1024 ) { //(FIXME: this limit should be configurable)
- void *oldbuf = request->buf;
- detached = 1;
- request->buf = malloc(request->size);
- if (oldbuf)
- memcpy(request->buf,oldbuf,request->size);
+ void *oldbuf = NULL;
+ if(request->old_type->has_subtype == 0){
+ oldbuf = request->buf;
+ request->detached = 1;
+ request->buf = malloc(request->size);
+ if (oldbuf)
+ memcpy(request->buf,oldbuf,request->size);
+ }
XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
}
&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);
+ request->detached);
#ifdef HAVE_TRACING
/* FIXME: detached sends are not traceable (request->action == NULL) */
if(req->flags & RECV) {
subtype->unserialize(req->buf, req->old_buf, req->size/smpi_datatype_size(datatype) , datatype->substruct);
}
- //FIXME: I am not sure that if the send is detached we have to free
- //the sender buffer thus I do it only for the reciever
- if(req->flags & RECV) free(req->buf);
+ if(req->detached == 0) free(req->buf);
}
if(req->flags & NON_PERSISTENT) {
if(request->action){
MPI_Request req = (MPI_Request)SIMIX_comm_get_src_data(request->action);
- *flag=true;
+ *flag = 1;
if(status != MPI_STATUS_IGNORE) {
status->MPI_SOURCE = req->src;
status->MPI_TAG = req->tag;
status->count = req->size;
}
}
- else *flag=false;
+ else *flag = 0;
smpi_mpi_request_free(&request);
return;
}
for(c = 0; c < count; c++) {
- if(MC_IS_ENABLED) {
+ if(MC_is_active()) {
smpi_mpi_wait(&requests[c], pstat);
index = c;
} else {
MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
count = 0;
+ count_dead = 0;
for(i = 0; i < incount; i++) {
if((requests[i] != MPI_REQUEST_NULL)) {
if(smpi_mpi_test(&requests[i], pstat)) {