28 #ifndef OMPI_REQUEST_H
29 #define OMPI_REQUEST_H
31 #include "ompi_config.h"
33 #include "ompi/class/ompi_free_list.h"
35 #include "opal/threads/condition.h"
36 #include "ompi/constants.h"
37 #include "ompi/runtime/params.h"
52 #include "request_dbg.h"
59 typedef int (*ompi_request_free_fn_t)(
struct ompi_request_t** rptr);
71 typedef int (*ompi_request_complete_fn_t)(
struct ompi_request_t* request);
111 void *req_complete_cb_data;
119 bool req_any_source_pending;
132 #define PREDEFINED_REQUEST_PAD (sizeof(void*) * 32)
147 #define OMPI_REQUEST_INIT(request, persistent) \
149 (request)->req_complete = false; \
150 (request)->req_state = OMPI_REQUEST_INACTIVE; \
151 (request)->req_persistent = (persistent); \
169 #define OMPI_REQUEST_FINI(request) \
171 (request)->req_state = OMPI_REQUEST_INVALID; \
172 if (MPI_UNDEFINED != (request)->req_f_to_c_index) { \
173 opal_pointer_array_set_item(&ompi_request_f_to_c_table, \
174 (request)->req_f_to_c_index, NULL); \
175 (request)->req_f_to_c_index = MPI_UNDEFINED; \
328 OMPI_DECLSPEC
extern size_t ompi_request_waiting;
329 OMPI_DECLSPEC
extern size_t ompi_request_completed;
330 OMPI_DECLSPEC
extern size_t ompi_request_failed;
331 OMPI_DECLSPEC
extern int32_t ompi_request_poll;
373 return (*request)->req_free(request);
376 #define ompi_request_test (ompi_request_functions.req_test)
377 #define ompi_request_test_any (ompi_request_functions.req_test_any)
378 #define ompi_request_test_all (ompi_request_functions.req_test_all)
379 #define ompi_request_test_some (ompi_request_functions.req_test_some)
380 #define ompi_request_wait (ompi_request_functions.req_wait)
381 #define ompi_request_wait_any (ompi_request_functions.req_wait_any)
382 #define ompi_request_wait_all (ompi_request_functions.req_wait_all)
383 #define ompi_request_wait_some (ompi_request_functions.req_wait_some)
385 #if OPAL_ENABLE_FT_MPI
406 ompi_request_completed++;
408 if( OPAL_UNLIKELY(MPI_SUCCESS != request->
req_status.MPI_ERROR) ) {
409 ompi_request_failed++;
411 if(with_signal && ompi_request_waiting) {
415 opal_condition_broadcast(&ompi_request_cond);
426 #if OMPI_ENABLE_PROGRESS_THREADS
432 ompi_request_waiting++;
434 #if OPAL_ENABLE_FT_MPI
439 if( ompi_ftmpi_enabled ) {
440 if( !ompi_request_state_ok(req) ) {
445 opal_condition_wait(&ompi_request_cond, &ompi_request_lock);
447 ompi_request_waiting--;
466 #if defined(__sparc) && SIZEOF_SIZE_T == 8
467 #define OMPI_STATUS_SET(outstat, instat) \
469 if (((ulong)(outstat)) & 0x7) { \
471 for(_i=0; _i<(int)(sizeof(ompi_status_public_t)/sizeof(int)); _i++) { \
472 ((int *)(outstat))[_i] = ((int *)(instat))[_i]; \
475 *(outstat) = *(instat); \
478 #define OMPI_STATUS_SET_COUNT(outcount, incount) \
480 if (((ulong)(outcount)) & 0x7) { \
481 ((int *)(outcount))[0] = ((int *)(incount))[0]; \
482 ((int *)(outcount))[1] = ((int *)(incount))[1]; \
484 *(outcount) = *(incount); \
488 #define OMPI_STATUS_SET(outstat, instat) (*(outstat) = *(instat))
489 #define OMPI_STATUS_SET_COUNT(outcount, incount) (*(outcount) = *(incount))
int(* ompi_request_wait_fn_t)(ompi_request_t **req_ptr, ompi_status_public_t *status)
Wait (blocking-mode) for one requests to complete.
Definition: request.h:256
int(* ompi_request_test_any_fn_t)(size_t count, ompi_request_t **requests, int *index, int *completed, ompi_status_public_t *status)
Non-blocking test for request completion.
Definition: request.h:206
volatile ompi_request_state_t req_state
enum indicate state of the request
Definition: request.h:105
ompi_free_list_item_t super
Base type.
Definition: request.h:101
union ompi_mpi_object_t ompi_mpi_object_t
Union for holding several different MPI pointer types on the request.
ompi_status_public_t req_status
Completion status.
Definition: request.h:103
dynamic pointer array
Definition: opal_pointer_array.h:45
Definition: condition.h:49
#define PREDEFINED_REQUEST_PAD
Padded struct to maintain back compatibiltiy.
Definition: request.h:132
int(* ompi_request_test_some_fn_t)(size_t count, ompi_request_t **requests, int *outcount, int *indices, ompi_status_public_t *statuses)
Non-blocking test for some of N requests to complete.
Definition: request.h:240
int(* ompi_request_wait_all_fn_t)(size_t count, ompi_request_t **requests, ompi_status_public_t *statuses)
Wait (blocking-mode) for all of N requests to complete.
Definition: request.h:287
OMPI_DECLSPEC int ompi_request_persistent_proc_null_free(ompi_request_t **request)
Free a persistent request to a MPI_PROC_NULL peer (there's no freelist to put it back to...
Definition: request.c:88
ompi_request_type_t req_type
Enum indicating the type of the request.
Definition: request.h:102
struct ompi_request_t ompi_request_t
Convenience typedef.
Definition: request.h:125
Definition: mutex_unix.h:53
static bool opal_progress_spin(volatile bool *complete)
Progress until flag is true or poll iterations completed.
Definition: opal_progress.h:188
bool req_persistent
flag indicating if the this is a persistent request
Definition: request.h:106
ompi_mpi_object_t req_mpi_object
Pointer to MPI object that created this request.
Definition: request.h:112
See opal_bitmap.h for an explanation of why there is a split between OPAL and ORTE for this generic c...
OMPI_DECLSPEC opal_pointer_array_t ompi_request_f_to_c_table
Globals used for tracking requests and request completion.
Definition: request.c:32
int req_tag
Tag associated with this request.
Definition: request.h:118
BEGIN_C_DECLS OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_request_t)
Request class.
Union for holding several different MPI pointer types on the request.
Definition: request.h:91
#define OPAL_THREAD_LOCK(mutex)
Lock a mutex if opal_using_threads() says that multiple threads may be active in the process...
Definition: mutex.h:223
#define OPAL_THREAD_UNLOCK(mutex)
Unlock a mutex if opal_using_threads() says that multiple threads may be active in the process...
Definition: mutex.h:309
Definition: request.h:134
static int ompi_request_cancel(ompi_request_t *request)
Cancel a pending request.
Definition: request.h:358
Back-end structure for MPI_File.
Definition: file.h:42
static int ompi_request_complete(ompi_request_t *request, bool with_signal)
Signal or mark a request as complete.
Definition: request.h:399
volatile bool req_complete
Flag indicating wether request has completed.
Definition: request.h:104
int req_peer
Peer rank that this request is associated with.
Definition: request.h:117
Definition: ompi_free_list.h:62
int ompi_request_init(void)
Initialize the MPI_Request subsystem; invoked during MPI_INIT.
Definition: request.c:105
int(* ompi_request_test_all_fn_t)(size_t count, ompi_request_t **requests, int *completed, ompi_status_public_t *statuses)
Non-blocking test for request completion.
Definition: request.h:225
int ompi_request_finalize(void)
Shut down the MPI_Request subsystem; invoked during MPI_FINALIZE.
Definition: request.c:184
int req_f_to_c_index
Index in Fortran <-> C translation array.
Definition: request.h:107
Replaceable request functions.
Definition: request.h:313
static int ompi_request_free(ompi_request_t **request)
Free a request.
Definition: request.h:371
ompi_request_cancel_fn_t req_cancel
Optional function to cancel the request.
Definition: request.h:109
ompi_request_free_fn_t req_free
Called by free.
Definition: request.h:108
int(* ompi_request_wait_any_fn_t)(size_t count, ompi_request_t **requests, int *index, ompi_status_public_t *status)
Wait (blocking-mode) for one of N requests to complete.
Definition: request.h:271
struct ompi_request_fns_t ompi_request_fns_t
Replaceable request functions.
ompi_request_complete_fn_t req_complete_cb
Called when the request is MPI completed.
Definition: request.h:110
int(* ompi_request_test_fn_t)(ompi_request_t **rptr, int *completed, ompi_status_public_t *status)
Non-blocking test for request completion.
Definition: request.h:190
Definition: communicator.h:118
int(* ompi_request_wait_some_fn_t)(size_t count, ompi_request_t **requests, int *outcount, int *indices, ompi_status_public_t *statuses)
Wait (blocking-mode) for some of N requests to complete.
Definition: request.h:304
Main top-level request struct definition.
Definition: request.h:100
static void ompi_request_wait_completion(ompi_request_t *req)
Wait a particular request for completion.
Definition: request.h:423