Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix a memory leak happening with smpi_replay
[simgrid.git] / src / smpi / smpi_base.c
index b3c0351..5192ca3 100644 (file)
@@ -5,7 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
-#include "xbt/time.h"
+#include "xbt/virtu.h"
 #include "mc/mc.h"
 #include "xbt/replay.h"
 #include <errno.h>
 #include "mc/mc.h"
 #include "xbt/replay.h"
 #include <errno.h>
@@ -178,9 +178,10 @@ void smpi_mpi_start(MPI_Request request)
       if(request->old_type->has_subtype == 0){
         oldbuf = request->buf;
         request->detached = 1;
       if(request->old_type->has_subtype == 0){
         oldbuf = request->buf;
         request->detached = 1;
-        request->buf = malloc(request->size);
-        if (oldbuf)
+        if (oldbuf){
+          request->buf = malloc(request->size);
           memcpy(request->buf,oldbuf,request->size);
           memcpy(request->buf,oldbuf,request->size);
+        }
       }
       XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
     }
       }
       XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
     }
@@ -306,6 +307,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
 {
   MPI_Request req = *request;
   // if we have a sender, we should use its data, and not the data from the receive
 {
   MPI_Request req = *request;
   // if we have a sender, we should use its data, and not the data from the receive
+  //FIXME : mail fail if req->action has already been freed, the pointer being invalid
   if((req->action)&&
      (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG))
     req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action);
   if((req->action)&&
      (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG))
     req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action);
@@ -313,7 +315,10 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
   if(status != MPI_STATUS_IGNORE) {
     status->MPI_SOURCE = req->src;
     status->MPI_TAG = req->tag;
   if(status != MPI_STATUS_IGNORE) {
     status->MPI_SOURCE = req->src;
     status->MPI_TAG = req->tag;
+    //if((*request)->action && ((MPI_Request)SIMIX_comm_get_src_data((*request)->action))->size == (*request)->size)
     status->MPI_ERROR = MPI_SUCCESS;
     status->MPI_ERROR = MPI_SUCCESS;
+    //else status->MPI_ERROR = MPI_ERR_TRUNCATE;
+    // this handles the case were size in receive differs from size in send
     // FIXME: really this should just contain the count of receive-type blocks,
     // right?
     status->count = req->size;
     // FIXME: really this should just contain the count of receive-type blocks,
     // right?
     status->count = req->size;
@@ -518,12 +523,13 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
   return index;
 }
 
   return index;
 }
 
-void smpi_mpi_waitall(int count, MPI_Request requests[],
+int smpi_mpi_waitall(int count, MPI_Request requests[],
                       MPI_Status status[])
 {
   int  index, c;
   MPI_Status stat;
   MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
                       MPI_Status status[])
 {
   int  index, c;
   MPI_Status stat;
   MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
+  int retvalue=MPI_SUCCESS;
   //tag invalid requests in the set
   for(c = 0; c < count; c++) {
     if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){
   //tag invalid requests in the set
   for(c = 0; c < count; c++) {
     if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){
@@ -548,10 +554,12 @@ void smpi_mpi_waitall(int count, MPI_Request requests[],
        }
       if(status != MPI_STATUSES_IGNORE) {
         memcpy(&status[index], pstat, sizeof(*pstat));
        }
       if(status != MPI_STATUSES_IGNORE) {
         memcpy(&status[index], pstat, sizeof(*pstat));
+        if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS;
 
       }
     }
   }
 
       }
     }
   }
+  return retvalue;
 }
 
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
 }
 
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,