/* set communication */
act->comm.type = type;
act->comm.refcount = 1;
+ act->comm.src_data=NULL;
+ act->comm.dst_data=NULL;
+
#ifdef HAVE_LATENCY_BOUND_TRACKING
//initialize with unknown value
}
action->comm.refcount--;
if (action->comm.refcount > 0)
- return;
+ return;
XBT_DEBUG("Really free communication %p; refcount is now %d", action,
action->comm.refcount);
--smx_total_comms; // this creation was a pure waste
other_action->state = SIMIX_READY;
other_action->comm.type = SIMIX_COMM_READY;
- // other_action->comm.refcount--;
+ //other_action->comm.refcount--;
}
xbt_fifo_push(dst_proc->comms, other_action);
}
void smpi_mpi_send(void *buf, int count, MPI_Datatype datatype, int dst,
int tag, MPI_Comm comm)
{
- MPI_Request request;
+ MPI_Request request =
+ build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag,
+ comm, NON_PERSISTENT | SEND | RECV_DELETE);
- request = smpi_mpi_isend(buf, count, datatype, dst, tag, comm);
+ smpi_mpi_start(request);
smpi_mpi_wait(&request, MPI_STATUS_IGNORE);
+
}
void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
if(req->detached == 0) free(req->buf);
}
+
+
if(req->flags & NON_PERSISTENT) {
+ if(req->action &&
+ (req->action->state == SIMIX_DONE))
+ {
+ MPI_Request sender_request = (MPI_Request)SIMIX_comm_get_src_data(req->action);
+ if((sender_request!=MPI_REQUEST_NULL) &&
+ ( sender_request->detached ) &&
+ ( sender_request->flags & RECV_DELETE))
+ {
+ //we are in a receiver's wait from a detached send
+ //we have to clean the sender's side request here.... but only if done by a send, not an isend
+ //the request lives senderside for an isend. As detached is currently for send + isend, we use RECV_DELETE to separate them
+ //FIXME : see if just removing detached status for isend is also good
+ smpi_mpi_request_free(&sender_request);
+ }
+ }
smpi_mpi_request_free(request);
} else {
req->action = NULL;