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) {
