Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
memleaks --
[simgrid.git] / src / smpi / colls / alltoall-simple.c
index 90e1c72..1d813e4 100644 (file)
@@ -1,4 +1,4 @@
-#include "colls.h"
+#include "colls_private.h"
 
 /*****************************************************************************
 
 int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count,
                                     MPI_Datatype send_type,
                                     void *recv_buff, int recv_count,
-                                    MPI_Datatype recv_type,
-                                    MPI_Comm comm)
+                                    MPI_Datatype recv_type, MPI_Comm comm)
 {
-  int i, rank, size, nreqs, err, src, dst, tag = 101;
+  int i, rank, size, nreqs, src, dst, tag = COLL_TAG_ALLTOALL;
   char *psnd;
   char *prcv;
   MPI_Aint sndinc;
@@ -39,10 +38,10 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count,
   MPI_Status s, *statuses;
 
 
-  MPI_Comm_size(comm, &size);
-  MPI_Comm_rank(comm, &rank);
-  MPI_Type_extent(send_type, &sndinc);
-  MPI_Type_extent(recv_type, &rcvinc);
+  size = smpi_comm_size(comm);
+  rank = smpi_comm_rank(comm);
+  sndinc = smpi_datatype_get_extent(send_type);
+  rcvinc = smpi_datatype_get_extent(recv_type);
   sndinc *= send_count;
   rcvinc *= recv_count;
 
@@ -50,13 +49,8 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count,
 
   nreqs = 2 * (size - 1);
   if (nreqs > 0) {
-    req = (MPI_Request *) malloc(nreqs * sizeof(MPI_Request));
-    statuses = (MPI_Status *) malloc(nreqs * sizeof(MPI_Status));
-    if (!req || !statuses) {
-      free(req);
-      free(statuses);
-      return 0;
-    }
+    req = (MPI_Request *) xbt_malloc(nreqs * sizeof(MPI_Request));
+    statuses = (MPI_Status *) xbt_malloc(nreqs * sizeof(MPI_Status));
   } else {
     req = NULL;
     statuses = NULL;
@@ -66,7 +60,7 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count,
 
   psnd = ((char *) send_buff) + (rank * sndinc);
   prcv = ((char *) recv_buff) + (rank * rcvinc);
-  MPI_Sendrecv(psnd, send_count, send_type, rank, tag,
+  smpi_mpi_sendrecv(psnd, send_count, send_type, rank, tag,
                prcv, recv_count, recv_type, rank, tag, comm, &s);
 
 
@@ -82,42 +76,26 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count,
       continue;
     if (dst == rank)
       continue;
-    MPI_Recv_init(prcv + (src * rcvinc), recv_count, recv_type, src,
-                  tag, comm, preq++);
-    MPI_Send_init(psnd + (dst * sndinc), send_count, send_type, dst,
-                  tag, comm, qreq++);
+    *(preq++) = smpi_mpi_recv_init(prcv + (src * rcvinc), recv_count, recv_type, src,
+                  tag, comm);
+    *(qreq++) = smpi_mpi_send_init(psnd + (dst * sndinc), send_count, send_type, dst,
+                  tag, comm);
   }
 
   /* Start all the requests. */
 
-  err = MPI_Startall(nreqs, req);
+  smpi_mpi_startall(nreqs, req);
 
   /* Wait for them all. */
 
-  err = MPI_Waitall(nreqs, req, statuses);
+  smpi_mpi_waitall(nreqs, req, statuses);
 
-  if (err != MPI_SUCCESS) {
-    if (req)
-      free((char *) req);
-    return err;
-  }
-
-  for (i = 0, preq = req; i < nreqs; ++i, ++preq) {
-    err = MPI_Request_free(preq);
-    if (err != MPI_SUCCESS) {
-      if (req)
-        free((char *) req);
-      if (statuses)
-        free(statuses);
-      return err;
-    }
-  }
 
   /* All done */
-
+  for(i= 0;i<nreqs;i++)if(req[i])smpi_mpi_request_free(&req[i]);
   if (req)
-    free((char *) req);
+    xbt_free((char *) req);
   if (statuses)
-    free(statuses);
-  return (1);
+    xbt_free(statuses);
+  return MPI_SUCCESS;
 }