Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
SMPI : add leak detection.
[simgrid.git] / src / smpi / mpi / smpi_request.cpp
index 93098dc..8467be6 100644 (file)
@@ -65,6 +65,7 @@ Request::Request(const void* buf, int count, MPI_Datatype datatype, int src, int
   nbc_requests_=nullptr;
   nbc_requests_size_=0;
   init_buffer(count);
+  this->add_f();
 }
 
 void Request::ref(){
@@ -90,6 +91,7 @@ void Request::unref(MPI_Request* request)
         Op::unref(&(*request)->op_);
 
       (*request)->print_request("Destroying");
+      F2C::free_f((*request)->c2f());
       delete *request;
       *request = MPI_REQUEST_NULL;
     }else{
@@ -118,7 +120,8 @@ bool Request::match_common(MPI_Request req, MPI_Request sender, MPI_Request rece
       receiver->real_src_ = sender->src_;
     if (receiver->tag_ == MPI_ANY_TAG)
       receiver->real_tag_ = sender->tag_;
-    if (receiver->real_size_ < sender->real_size_){
+    if (receiver->real_size_ < sender->real_size_ && ((receiver->flags_ & MPI_REQ_PROBE) == 0 )){
+      XBT_DEBUG("Truncating message - should not happen: receiver size : %zu < sender size : %zu", receiver->real_size_, sender->real_size_);
       receiver->truncated_ = true;
     }
     if (sender->detached_)
@@ -764,7 +767,7 @@ void Request::iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status*
   double maxrate      = smpi_cfg_iprobe_cpu_usage();
   auto request        = new Request(nullptr, 0, MPI_CHAR,
                              source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : comm->group()->actor(source)->get_pid(),
-                             simgrid::s4u::this_actor::get_pid(), tag, comm, MPI_REQ_PERSISTENT | MPI_REQ_RECV);
+                             simgrid::s4u::this_actor::get_pid(), tag, comm, MPI_REQ_PERSISTENT | MPI_REQ_RECV | MPI_REQ_PROBE);
   if (smpi_iprobe_sleep > 0) {
     /** Compute the number of flops we will sleep **/
     s4u::this_actor::exec_init(/*nsleeps: See comment above */ nsleeps *