Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fixed buggy implementation of MPI_Waitsome
[simgrid.git] / src / smpi / smpi_base.c
index 333c590..0143935 100644 (file)
@@ -130,6 +130,7 @@ int smpi_mpi_test(MPI_Request* request, MPI_Status* status) {
   int flag = data && data->complete == 1;
 
   if(flag) {
+    SIMIX_communication_destroy((*request)->pair);
     finish_wait(request, status);
   }
   return flag;
@@ -145,6 +146,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int* index, MPI_Status*
     if(requests[i] != MPI_REQUEST_NULL) {
       data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair);
       if(data != MPI_REQUEST_NULL && data->complete == 1) {
+        SIMIX_communication_destroy(requests[i]->pair);
         finish_wait(&requests[i], status);
         *index = i;
         flag = 1;
@@ -163,6 +165,8 @@ void smpi_mpi_wait(MPI_Request* request, MPI_Status* status) {
   // data is null if receiver waits before sender enters the rdv
   if(data == MPI_REQUEST_NULL || data->complete == 0) {
     SIMIX_network_wait((*request)->pair, -1.0);
+  } else {
+    SIMIX_communication_destroy((*request)->pair);
   }
   finish_wait(request, status);
 }
@@ -181,6 +185,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status* status) {
         data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair);
         if(data != MPI_REQUEST_NULL && data->complete == 1) {
           index = i;
+          SIMIX_communication_destroy(requests[index]->pair); // always succeeds (but cleans the simix layer)
           break;
         }
       }
@@ -238,10 +243,11 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int* indices, MPI_Sta
   int i, count;
 
   count = 0;
-  for(i = 0; i < count; i++) {
+  for(i = 0; i < incount; i++) {
     if(requests[i] != MPI_REQUEST_NULL) {
       data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair);
       if(data != MPI_REQUEST_NULL && data->complete == 1) {
+        SIMIX_communication_destroy(requests[i]->pair);
         finish_wait(&requests[i], status != MPI_STATUS_IGNORE ? &status[i] : MPI_STATUS_IGNORE);
         indices[count] = i;
         count++;