diff --git a/src/mca/pml/teg/src/pml_teg_wait.c b/src/mca/pml/teg/src/pml_teg_wait.c index 3c50fa4b5a..ab2fbfaeb0 100644 --- a/src/mca/pml/teg/src/pml_teg_wait.c +++ b/src/mca/pml/teg/src/pml_teg_wait.c @@ -59,11 +59,53 @@ int mca_pml_teg_wait( } -int mca_pml_teg_waitall( +int mca_pml_teg_wait_all( int count, - lam_request_t** request, - lam_status_public_t* status) + lam_request_t** requests, + lam_status_public_t* statuses) { + int completed, i; + + /* + * acquire lock and test for completion - if all requests are not completed + * pend on condition variable until a request completes + */ + lam_mutex_lock(&mca_pml_teg.teg_request_lock); + mca_pml_teg.teg_request_waiting++; + do { + completed = 0; + for(i=0; ireq_mpi_done == true) { + completed++; + continue; + } + } + if(completed != count) + lam_condition_wait(&mca_pml_teg.teg_request_cond, &mca_pml_teg.teg_request_lock); + } while (completed != count); + mca_pml_teg.teg_request_waiting--; + lam_mutex_unlock(&mca_pml_teg.teg_request_lock); + + /* + * fill out completion status and free request if required + */ + for(i=0; ireq_status; + } + if (false == pml_request->req_persistent) { + /* return request to pool */ + mca_pml_teg_free(&requests[i]); + } + } return LAM_SUCCESS; } diff --git a/src/mpi/c/waitall.c b/src/mpi/c/waitall.c index 379f766fb1..63c04c9ca7 100644 --- a/src/mpi/c/waitall.c +++ b/src/mpi/c/waitall.c @@ -5,13 +5,29 @@ #include #include "mpi.h" +#include "runtime/runtime.h" #include "mpi/c/bindings.h" +#include "mca/pml/pml.h" #if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES #pragma weak MPI_Waitall = PMPI_Waitall #endif -int MPI_Waitall(int count, MPI_Request *array_of_requests, - MPI_Status *array_of_statuses) { - return MPI_SUCCESS; + +int MPI_Waitall(int count, MPI_Request *requests, MPI_Status *statuses) +{ + int index; + if ( MPI_PARAM_CHECK ) { + int rc = MPI_SUCCESS; + if (lam_mpi_finalized) { + rc = MPI_ERR_INTERN; + } else if (requests == NULL) { + rc = MPI_ERR_REQUEST; + } + if (rc != MPI_SUCCESS) { + return rc; + } + } + return mca_pml.pml_wait_all(count, requests, statuses); } +