/*@ MPI_Testsome - Tests for some given requests to complete Input Parameters: + incount - length of array_of_requests (integer) - array_of_requests - array of requests (array of handles) Output Parameters: + outcount - number of completed requests (integer) . array_of_indices - array of indices of operations that completed (array of integers) - array_of_statuses - array of status objects for operations that completed (array of Status). May be 'MPI_STATUSES_IGNORE'. Notes: While it is possible to list a request handle more than once in the 'array_of_requests', such an action is considered erroneous and may cause the program to unexecpectedly terminate or produce incorrect results. .N ThreadSafe .N waitstatus .N Fortran .N Errors .N MPI_SUCCESS .N MPI_ERR_IN_STATUS @*/ int MPI_Testsome(int incount, MPI_Request array_of_requests[], int *outcount, int array_of_indices[], MPI_Status array_of_statuses[]) { MPIR_Request *request_ptr_array[MPIR_REQUEST_PTR_ARRAY_SIZE]; MPIR_Request **request_ptrs = request_ptr_array; MPI_Status *status_ptr; int i; int n_inactive; int proc_failure = FALSE; int rc = MPI_SUCCESS; int mpi_errno = MPI_SUCCESS; MPIR_CHKLMEM_DECL(1); MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_TESTSOME); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(VCI_GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPIR_FUNC_TERSE_REQUEST_ENTER(MPID_STATE_MPI_TESTSOME); /* Check the arguments */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_ERRTEST_COUNT(incount, mpi_errno); if (incount != 0) { MPIR_ERRTEST_ARGNULL(array_of_requests, "array_of_requests", mpi_errno); MPIR_ERRTEST_ARGNULL(array_of_indices, "array_of_indices", mpi_errno); /* NOTE: MPI_STATUSES_IGNORE != NULL */ MPIR_ERRTEST_ARGNULL(array_of_statuses, "array_of_statuses", mpi_errno); } MPIR_ERRTEST_ARGNULL(outcount, "outcount", mpi_errno); for (i = 0; i < incount; i++) { MPIR_ERRTEST_ARRAYREQUEST_OR_NULL(array_of_requests[i], i, mpi_errno); } } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ *outcount = 0; /* Convert MPI request handles to a request object pointers */ if (incount > MPIR_REQUEST_PTR_ARRAY_SIZE) { MPIR_CHKLMEM_MALLOC_ORJUMP(request_ptrs, MPIR_Request **, incount * sizeof(MPIR_Request *), mpi_errno, "request pointers", MPL_MEM_OBJECT); }
/*@ MPI_Testany - Tests for completion of any previdously initiated requests Input Parameters: + count - list length (integer) - array_of_requests - array of requests (array of handles) Output Parameters: + indx - index of operation that completed, or 'MPI_UNDEFINED' if none completed (integer) . flag - true if one of the operations is complete (logical) - status - status object (Status). May be 'MPI_STATUS_IGNORE'. Notes: While it is possible to list a request handle more than once in the 'array_of_requests', such an action is considered erroneous and may cause the program to unexecpectedly terminate or produce incorrect results. .N ThreadSafe .N waitstatus .N Fortran .N Errors .N MPI_SUCCESS @*/ int MPI_Testany(int count, MPI_Request array_of_requests[], int *indx, int *flag, MPI_Status * status) { MPIR_Request *request_ptr_array[MPIR_REQUEST_PTR_ARRAY_SIZE]; MPIR_Request **request_ptrs = request_ptr_array; int i; int n_inactive; int last_disabled_anysource = -1; int first_nonnull = count; int mpi_errno = MPI_SUCCESS; MPIR_CHKLMEM_DECL(1); MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_TESTANY); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(VCI_GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPIR_FUNC_TERSE_REQUEST_ENTER(MPID_STATE_MPI_TESTANY); /* Check the arguments */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_ERRTEST_COUNT(count, mpi_errno); if (count != 0) { MPIR_ERRTEST_ARGNULL(array_of_requests, "array_of_requests", mpi_errno); /* NOTE: MPI_STATUS_IGNORE != NULL */ MPIR_ERRTEST_ARGNULL(status, "status", mpi_errno); } MPIR_ERRTEST_ARGNULL(indx, "indx", mpi_errno); MPIR_ERRTEST_ARGNULL(flag, "flag", mpi_errno); for (i = 0; i < count; i++) { MPIR_ERRTEST_ARRAYREQUEST_OR_NULL(array_of_requests[i], i, mpi_errno); } } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ /* Convert MPI request handles to a request object pointers */ if (count > MPIR_REQUEST_PTR_ARRAY_SIZE) { MPIR_CHKLMEM_MALLOC_ORJUMP(request_ptrs, MPIR_Request **, count * sizeof(MPIR_Request *), mpi_errno, "request pointers", MPL_MEM_OBJECT); }
/*@ MPI_Start - Initiates a communication with a persistent request handle Input Parameters: . request - communication request (handle) .N ThreadSafe .N Fortran .N Errors .N MPI_SUCCESS .N MPI_ERR_REQUEST @*/ int MPI_Start(MPI_Request * request) { MPIR_Request *request_ptr = NULL; int mpi_errno = MPI_SUCCESS; MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_START); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPIR_FUNC_TERSE_REQUEST_ENTER(MPID_STATE_MPI_START); /* Validate handle parameters needing to be converted */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_ERRTEST_ARGNULL(request, "request", mpi_errno); MPIR_ERRTEST_REQUEST(*request, mpi_errno); } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ /* Convert MPI request handle to a request object pointer */ MPIR_Request_get_ptr(*request, request_ptr); /* Validate object pointers if error checking is enabled */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_Request_valid_ptr(request_ptr, mpi_errno); if (mpi_errno) goto fn_fail; MPIR_ERRTEST_PERSISTENT(request_ptr, mpi_errno); MPIR_ERRTEST_PERSISTENT_ACTIVE(request_ptr, mpi_errno); } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ mpi_errno = MPID_Startall(1, &request_ptr); if (mpi_errno != MPI_SUCCESS) goto fn_fail; /* ... end of body of routine ... */ fn_exit: MPIR_FUNC_TERSE_REQUEST_EXIT(MPID_STATE_MPI_START); MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ #ifdef HAVE_ERROR_CHECKING { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**mpi_start", "**mpi_start %p", request); } #endif mpi_errno = MPIR_Err_return_comm(NULL, FCNAME, mpi_errno); goto fn_exit; /* --END ERROR HANDLING-- */ }
/*@ MPI_Test - Tests for the completion of a request Input Parameters: . request - MPI request (handle) Output Parameters: + flag - true if operation completed (logical) - status - status object (Status). May be 'MPI_STATUS_IGNORE'. .N ThreadSafe .N waitstatus .N Fortran .N FortranStatus .N Errors .N MPI_SUCCESS .N MPI_ERR_REQUEST .N MPI_ERR_ARG @*/ int MPI_Test(MPI_Request * request, int *flag, MPI_Status * status) { int mpi_errno = MPI_SUCCESS; MPIR_Request *request_ptr = NULL; MPIR_Comm *comm_ptr = NULL; MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_TEST); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(VNI_GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPIR_FUNC_TERSE_REQUEST_ENTER(MPID_STATE_MPI_TEST); /* Validate parameters, especially handles needing to be converted */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { MPIR_ERRTEST_ARGNULL(request, "request", mpi_errno); MPIR_ERRTEST_REQUEST_OR_NULL(*request, mpi_errno); } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ MPIR_Request_get_ptr(*request, request_ptr); /* Validate parameters and objects (post conversion) */ #ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { if (*request != MPI_REQUEST_NULL) { /* Validate request_ptr */ MPIR_Request_valid_ptr(request_ptr, mpi_errno); if (mpi_errno) goto fn_fail; } MPIR_ERRTEST_ARGNULL(flag, "flag", mpi_errno); /* NOTE: MPI_STATUS_IGNORE != NULL */ MPIR_ERRTEST_ARGNULL(status, "status", mpi_errno); } MPID_END_ERROR_CHECKS; } #endif /* HAVE_ERROR_CHECKING */ /* ... body of routine ... */ /* MPIR_Test may free request_ptr, so make a copy of comm_ptr before calling MPIR_Test. * comm_ptr will be used later at fn_fail when MPIR_Test returns an error. */ if (request_ptr) comm_ptr = request_ptr->comm; mpi_errno = MPIR_Test(request, flag, status); if (mpi_errno) goto fn_fail; /* ... end of body of routine ... */ fn_exit: MPIR_FUNC_TERSE_REQUEST_EXIT(MPID_STATE_MPI_TEST); MPID_THREAD_CS_EXIT(VNI_GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ #ifdef HAVE_ERROR_CHECKING { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**mpi_test", "**mpi_test %p %p %p", request, flag, status); } #endif mpi_errno = MPIR_Err_return_comm(comm_ptr, FCNAME, mpi_errno); goto fn_exit; /* --END ERROR HANDLING-- */ }