Index: request_default.h =================================================================== --- request_default.h (revision 0) +++ request_default.h (revision 0) @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004-2007 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef OMPI_REQUEST_DEFAULT_H +#define OMPI_REQUEST_DEFAULT_H + +#include "ompi/request/request.h" + +BEGIN_C_DECLS + +/** Defaults implementations for all request completions + */ +int ompi_request_default_test( + ompi_request_t ** rptr, + int *completed, + ompi_status_public_t * status ); + +int ompi_request_default_test_any( + size_t count, + ompi_request_t ** requests, + int *index, + int *completed, + ompi_status_public_t * status); + +int ompi_request_default_test_all( + size_t count, + ompi_request_t ** requests, + int *completed, + ompi_status_public_t * statuses); + +int ompi_request_default_test_some( + size_t count, + ompi_request_t ** requests, + int * outcount, + int * indices, + ompi_status_public_t * statuses); + +int ompi_request_default_wait( + ompi_request_t ** req_ptr, + ompi_status_public_t * status); + +int ompi_request_default_wait_any( + size_t count, + ompi_request_t ** requests, + int *index, + ompi_status_public_t * status); + +int ompi_request_default_wait_all( + size_t count, + ompi_request_t ** requests, + ompi_status_public_t * statuses); + +int ompi_request_default_wait_some( + size_t count, + ompi_request_t ** requests, + int * outcount, + int * indices, + ompi_status_public_t * statuses); + +END_C_DECLS + +#endif + Index: req_test.c =================================================================== --- req_test.c (revision 16723) +++ req_test.c (working copy) @@ -20,11 +20,12 @@ #include "ompi_config.h" #include "ompi/constants.h" #include "ompi/request/request.h" +#include "ompi/request/request_default.h" #include "ompi/request/grequest.h" #include "ompi/mca/crcp/crcp.h" -int ompi_request_test( ompi_request_t ** rptr, +int ompi_request_default_test( ompi_request_t ** rptr, int *completed, ompi_status_public_t * status ) { @@ -91,7 +92,7 @@ return OMPI_SUCCESS; } -int ompi_request_test_any( +int ompi_request_default_test_any( size_t count, ompi_request_t ** requests, int *index, @@ -168,7 +169,7 @@ } -int ompi_request_test_all( +int ompi_request_default_test_all( size_t count, ompi_request_t ** requests, int *completed, @@ -263,7 +264,7 @@ } -int ompi_request_test_some( +int ompi_request_default_test_some( size_t count, ompi_request_t ** requests, int * outcount, Index: request.c =================================================================== --- request.c (revision 16723) +++ request.c (working copy) @@ -21,6 +21,7 @@ #include "opal/class/opal_object.h" #include "ompi/request/request.h" +#include "ompi/request/request_default.h" #include "ompi/constants.h" ompi_pointer_array_t ompi_request_f_to_c_table; @@ -31,8 +32,17 @@ ompi_request_t ompi_request_null; ompi_request_t ompi_request_empty; ompi_status_public_t ompi_status_empty; +ompi_request_fns_t ompi_request_functions = { + ompi_request_default_test, + ompi_request_default_test_any, + ompi_request_default_test_all, + ompi_request_default_test_some, + ompi_request_default_wait, + ompi_request_default_wait_any, + ompi_request_default_wait_all, + ompi_request_default_wait_some +}; - static void ompi_request_construct(ompi_request_t* req) { OMPI_REQUEST_INIT(req, false); Index: req_wait.c =================================================================== --- req_wait.c (revision 16723) +++ req_wait.c (working copy) @@ -20,12 +20,14 @@ #include "ompi_config.h" #include "ompi/constants.h" #include "ompi/request/request.h" +#include "ompi/request/request_default.h" #include "ompi/request/grequest.h" #include "opal/runtime/opal_cr.h" #include "ompi/mca/crcp/crcp.h" -int ompi_request_wait( + +int ompi_request_default_wait( ompi_request_t ** req_ptr, ompi_status_public_t * status) { @@ -71,7 +73,7 @@ } -int ompi_request_wait_any( +int ompi_request_default_wait_any( size_t count, ompi_request_t ** requests, int *index, @@ -204,7 +206,7 @@ } -int ompi_request_wait_all( size_t count, +int ompi_request_default_wait_all( size_t count, ompi_request_t ** requests, ompi_status_public_t * statuses ) { @@ -351,7 +353,7 @@ } -int ompi_request_wait_some( +int ompi_request_default_wait_some( size_t count, ompi_request_t ** requests, int * outcount, Index: request.h =================================================================== --- request.h (revision 16723) +++ request.h (working copy) @@ -65,7 +65,6 @@ OMPI_REQUEST_CANCELLED } ompi_request_state_t; - struct ompi_request_t; /* @@ -78,7 +77,6 @@ */ typedef int (*ompi_request_cancel_fn_t)(struct ompi_request_t* request, int flag); - /** * Forward declaration */ @@ -107,7 +105,7 @@ * Main top-level request struct definition */ struct ompi_request_t { - ompi_free_list_item_t super; /**< Base type */ + ompi_free_list_item_t super; /**< Base type */ ompi_request_type_t req_type; /**< Enum indicating the type of the request */ ompi_status_public_t req_status; /**< Completion status */ volatile bool req_complete; /**< Flag indicating wether request has completed */ @@ -164,65 +162,6 @@ } while (0); /** - * Globals used for tracking requests and request completion. - */ -OMPI_DECLSPEC extern ompi_pointer_array_t ompi_request_f_to_c_table; -OMPI_DECLSPEC extern size_t ompi_request_waiting; -OMPI_DECLSPEC extern size_t ompi_request_completed; -OMPI_DECLSPEC extern int32_t ompi_request_poll; -OMPI_DECLSPEC extern opal_mutex_t ompi_request_lock; -OMPI_DECLSPEC extern opal_condition_t ompi_request_cond; -OMPI_DECLSPEC extern ompi_request_t ompi_request_null; -OMPI_DECLSPEC extern ompi_request_t ompi_request_empty; -OMPI_DECLSPEC extern ompi_status_public_t ompi_status_empty; - - -/** - * Initialize the MPI_Request subsystem; invoked during MPI_INIT. - */ - -int ompi_request_init(void); - -/** - * Free a persistent request to a MPI_PROC_NULL peer (there's no - * freelist to put it back to, so we have to actually OBJ_RELEASE it). - */ - -OMPI_DECLSPEC int ompi_request_persistent_proc_null_free(ompi_request_t **request); - - -/** - * Shut down the MPI_Request subsystem; invoked during MPI_FINALIZE. - */ - -int ompi_request_finalize(void); - - -/** - * Cancel a pending request. - */ - -static inline int ompi_request_cancel(ompi_request_t* request) -{ - if (request->req_cancel != NULL) { - return request->req_cancel(request, true); - } - return OMPI_SUCCESS; -} - - -/** - * Free a request. - * - * @param request (INOUT) Pointer to request. - */ - -static inline int ompi_request_free(ompi_request_t** request) -{ - return (*request)->req_free(request); -} - -/** * Non-blocking test for request completion. * * @param request (IN) Array of requests @@ -233,11 +172,9 @@ * Note that upon completion, the request is freed, and the * request handle at index set to NULL. */ - -OMPI_DECLSPEC int ompi_request_test( ompi_request_t ** rptr, - int *completed, - ompi_status_public_t * status ); - +typedef int (*ompi_request_test_fn_t)(ompi_request_t ** rptr, + int *completed, + ompi_status_public_t * status ); /** * Non-blocking test for request completion. * @@ -251,14 +188,11 @@ * Note that upon completion, the request is freed, and the * request handle at index set to NULL. */ - -OMPI_DECLSPEC int ompi_request_test_any( - size_t count, - ompi_request_t ** requests, - int *index, - int *completed, - ompi_status_public_t * status); - +typedef 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. * @@ -273,15 +207,10 @@ * the requests array is not modified (no requests freed), unless all requests * have completed. */ - -OMPI_DECLSPEC int ompi_request_test_all( - size_t count, - ompi_request_t ** requests, - int *completed, - ompi_status_public_t * statuses); - - - +typedef 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 some of N requests to complete. * @@ -293,15 +222,11 @@ * @return OMPI_SUCCESS, OMPI_ERR_IN_STATUS or failure status. * */ - -OMPI_DECLSPEC int ompi_request_test_some( - size_t count, - ompi_request_t ** requests, - int * outcount, - int * indices, - ompi_status_public_t * statuses); - - +typedef int (*ompi_request_test_some_fn_t)(size_t count, + ompi_request_t ** requests, + int * outcount, + int * indices, + ompi_status_public_t * statuses); /** * Wait (blocking-mode) for one requests to complete. * @@ -310,11 +235,8 @@ * @return OMPI_SUCCESS or failure status. * */ - -OMPI_DECLSPEC int ompi_request_wait( - ompi_request_t ** req_ptr, - ompi_status_public_t * status); - +typedef int (*ompi_request_wait_fn_t)(ompi_request_t ** req_ptr, + ompi_status_public_t * status); /** * Wait (blocking-mode) for one of N requests to complete. * @@ -325,13 +247,10 @@ * @return OMPI_SUCCESS or failure status. * */ - -OMPI_DECLSPEC int ompi_request_wait_any( - size_t count, - ompi_request_t ** requests, - int *index, - ompi_status_public_t * status); - +typedef 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 all of N requests to complete. * @@ -341,13 +260,9 @@ * @return OMPI_SUCCESS or failure status. * */ - -OMPI_DECLSPEC int ompi_request_wait_all( - size_t count, - ompi_request_t ** requests, - ompi_status_public_t * statuses); - - +typedef int (*ompi_request_wait_all_fn_t)(size_t count, + ompi_request_t ** requests, + ompi_status_public_t * statuses); /** * Wait (blocking-mode) for some of N requests to complete. * @@ -359,14 +274,90 @@ * @return OMPI_SUCCESS, OMPI_ERR_IN_STATUS or failure status. * */ +typedef int (*ompi_request_wait_some_fn_t)(size_t count, + ompi_request_t ** requests, + int * outcount, + int * indices, + ompi_status_public_t * statuses); -OMPI_DECLSPEC int ompi_request_wait_some( - size_t count, - ompi_request_t ** requests, - int * outcount, - int * indices, - ompi_status_public_t * statuses); +/** + * Replaceable request functions + */ +typedef struct ompi_request_fns_t { + ompi_request_test_fn_t req_test; + ompi_request_test_any_fn_t req_test_any; + ompi_request_test_all_fn_t req_test_all; + ompi_request_test_some_fn_t req_test_some; + ompi_request_wait_fn_t req_wait; + ompi_request_wait_any_fn_t req_wait_any; + ompi_request_wait_all_fn_t req_wait_all; + ompi_request_wait_some_fn_t req_wait_some; +} ompi_request_fns_t; +/** + * Globals used for tracking requests and request completion. + */ +OMPI_DECLSPEC extern ompi_pointer_array_t ompi_request_f_to_c_table; +OMPI_DECLSPEC extern size_t ompi_request_waiting; +OMPI_DECLSPEC extern size_t ompi_request_completed; +OMPI_DECLSPEC extern int32_t ompi_request_poll; +OMPI_DECLSPEC extern opal_mutex_t ompi_request_lock; +OMPI_DECLSPEC extern opal_condition_t ompi_request_cond; +OMPI_DECLSPEC extern ompi_request_t ompi_request_null; +OMPI_DECLSPEC extern ompi_request_t ompi_request_empty; +OMPI_DECLSPEC extern ompi_status_public_t ompi_status_empty; +OMPI_DECLSPEC extern ompi_request_fns_t ompi_request_functions; + +/** + * Initialize the MPI_Request subsystem; invoked during MPI_INIT. + */ +int ompi_request_init(void); + +/** + * Free a persistent request to a MPI_PROC_NULL peer (there's no + * freelist to put it back to, so we have to actually OBJ_RELEASE it). + */ +OMPI_DECLSPEC int ompi_request_persistent_proc_null_free(ompi_request_t **request); + +/** + * Shut down the MPI_Request subsystem; invoked during MPI_FINALIZE. + */ +int ompi_request_finalize(void); + +/** + * Cancel a pending request. + */ +static inline int ompi_request_cancel(ompi_request_t* request) +{ + if (request->req_cancel != NULL) { + return request->req_cancel(request, true); + } + return OMPI_SUCCESS; +} + +/** + * Free a request. + * + * @param request (INOUT) Pointer to request. + */ +static inline int ompi_request_free(ompi_request_t** request) +{ + return (*request)->req_free(request); +} + +#define ompi_request_test (ompi_request_functions.req_test) +#define ompi_request_test_any (ompi_request_functions.req_test_any) +#define ompi_request_test_all (ompi_request_functions.req_test_all) +#define ompi_request_test_some (ompi_request_functions.req_test_some) +#define ompi_request_wait (ompi_request_functions.req_wait) +#define ompi_request_wait_any (ompi_request_functions.req_wait_any) +#define ompi_request_wait_all (ompi_request_functions.req_wait_all) +#define ompi_request_wait_some (ompi_request_functions.req_wait_some) + + +/** + * Wait a particular request for completion + */ static inline void ompi_request_wait_completion(ompi_request_t *req) { if(false == req->req_complete) {