Submitted by: Rainer Keller v0.9
authorjsquyres
Wed Jul 27 23:44:37 2005 +0000 (2005-07-27)
branchv0.9
changeset 18044e29e2fb00154
parent 18043 0dbc132aa098
Submitted by: Rainer Keller
Reviewed by: Jeff Squyres and George Bosilca

(from r6611 and r6620 on the trunk)

r6611:
Any non-blocking P2P function should set the request to something else
then MPI_REQUEST_NULL, when passed a source/dest of MPI_PROC_NULL.

Introduce a new ompi_request_empty, which returns the
MPI_SOURCE=MPI_PROC_NULL, MPI_TAG=MPI_ANY_TAG, count=0 as specified by
the MPI-standard.

r6620:
See comment in file (src/request/request.c).
We need to reset the empty-request to the MPI_REQUEST_NULL.
src/mpi/c/bsend_init.c
src/mpi/c/ibsend.c
src/mpi/c/irecv.c
src/mpi/c/irsend.c
src/mpi/c/isend.c
src/mpi/c/issend.c
src/mpi/c/recv_init.c
src/mpi/c/rsend_init.c
src/mpi/c/send_init.c
src/mpi/c/ssend_init.c
src/request/request.c
src/request/request.h
     1.1 --- a/src/mpi/c/bsend_init.c	Fri Jul 15 14:04:30 2005 +0000
     1.2 +++ b/src/mpi/c/bsend_init.c	Wed Jul 27 23:44:37 2005 +0000
     1.3 @@ -37,7 +37,7 @@
     1.4  {
     1.5      int rc;
     1.6      if (dest == MPI_PROC_NULL) {
     1.7 -        *request = MPI_REQUEST_NULL;
     1.8 +        *request = &ompi_request_empty;
     1.9          return MPI_SUCCESS;
    1.10      }
    1.11      
     2.1 --- a/src/mpi/c/ibsend.c	Fri Jul 15 14:04:30 2005 +0000
     2.2 +++ b/src/mpi/c/ibsend.c	Wed Jul 27 23:44:37 2005 +0000
     2.3 @@ -38,7 +38,7 @@
     2.4  {
     2.5      int rc;
     2.6      if (dest == MPI_PROC_NULL) {
     2.7 -        *request = MPI_REQUEST_NULL;
     2.8 +        *request = &ompi_request_empty;
     2.9          return MPI_SUCCESS;
    2.10      }
    2.11  
     3.1 --- a/src/mpi/c/irecv.c	Fri Jul 15 14:04:30 2005 +0000
     3.2 +++ b/src/mpi/c/irecv.c	Wed Jul 27 23:44:37 2005 +0000
     3.3 @@ -37,7 +37,7 @@
     3.4  {
     3.5      int rc;
     3.6      if (source == MPI_PROC_NULL) {
     3.7 -        *request = MPI_REQUEST_NULL;
     3.8 +        *request = &ompi_request_empty;
     3.9          return OMPI_SUCCESS;
    3.10      }
    3.11  
     4.1 --- a/src/mpi/c/irsend.c	Fri Jul 15 14:04:30 2005 +0000
     4.2 +++ b/src/mpi/c/irsend.c	Wed Jul 27 23:44:37 2005 +0000
     4.3 @@ -37,7 +37,7 @@
     4.4  {
     4.5      int rc;
     4.6      if (dest == MPI_PROC_NULL) {
     4.7 -        *request = MPI_REQUEST_NULL;
     4.8 +        *request = &ompi_request_empty;
     4.9          return MPI_SUCCESS;
    4.10      }
    4.11  
     5.1 --- a/src/mpi/c/isend.c	Fri Jul 15 14:04:30 2005 +0000
     5.2 +++ b/src/mpi/c/isend.c	Wed Jul 27 23:44:37 2005 +0000
     5.3 @@ -37,7 +37,7 @@
     5.4  {
     5.5      int rc;
     5.6      if (dest == MPI_PROC_NULL) {
     5.7 -        *request = MPI_REQUEST_NULL;
     5.8 +        *request = &ompi_request_empty;
     5.9          return MPI_SUCCESS;
    5.10      }
    5.11  
     6.1 --- a/src/mpi/c/issend.c	Fri Jul 15 14:04:30 2005 +0000
     6.2 +++ b/src/mpi/c/issend.c	Wed Jul 27 23:44:37 2005 +0000
     6.3 @@ -38,7 +38,7 @@
     6.4  {
     6.5      int rc;
     6.6      if (dest == MPI_PROC_NULL) {
     6.7 -        *request = MPI_REQUEST_NULL;
     6.8 +        *request = &ompi_request_empty;
     6.9          return MPI_SUCCESS;
    6.10      }
    6.11  
     7.1 --- a/src/mpi/c/recv_init.c	Fri Jul 15 14:04:30 2005 +0000
     7.2 +++ b/src/mpi/c/recv_init.c	Wed Jul 27 23:44:37 2005 +0000
     7.3 @@ -37,7 +37,7 @@
     7.4  {
     7.5      int rc;
     7.6      if (source == MPI_PROC_NULL) { 
     7.7 -        *request = &ompi_request_null;
     7.8 +        *request = &ompi_request_empty;
     7.9          return MPI_SUCCESS;
    7.10      }
    7.11  
     8.1 --- a/src/mpi/c/rsend_init.c	Fri Jul 15 14:04:30 2005 +0000
     8.2 +++ b/src/mpi/c/rsend_init.c	Wed Jul 27 23:44:37 2005 +0000
     8.3 @@ -38,7 +38,7 @@
     8.4  {
     8.5      int rc;
     8.6      if (dest == MPI_PROC_NULL) {
     8.7 -        *request = MPI_REQUEST_NULL;
     8.8 +        *request = &ompi_request_empty;
     8.9          return MPI_SUCCESS;
    8.10      }
    8.11  
     9.1 --- a/src/mpi/c/send_init.c	Fri Jul 15 14:04:30 2005 +0000
     9.2 +++ b/src/mpi/c/send_init.c	Wed Jul 27 23:44:37 2005 +0000
     9.3 @@ -38,7 +38,7 @@
     9.4  {
     9.5      int rc;
     9.6      if (dest == MPI_PROC_NULL) {
     9.7 -        *request = MPI_REQUEST_NULL;
     9.8 +        *request = &ompi_request_empty;
     9.9          return MPI_SUCCESS;
    9.10      }
    9.11  
    10.1 --- a/src/mpi/c/ssend_init.c	Fri Jul 15 14:04:30 2005 +0000
    10.2 +++ b/src/mpi/c/ssend_init.c	Wed Jul 27 23:44:37 2005 +0000
    10.3 @@ -38,7 +38,7 @@
    10.4  {
    10.5      int rc;
    10.6      if (dest == MPI_PROC_NULL) {
    10.7 -        *request = MPI_REQUEST_NULL;
    10.8 +        *request = &ompi_request_empty;
    10.9          return MPI_SUCCESS;
   10.10      }
   10.11  
    11.1 --- a/src/request/request.c	Fri Jul 15 14:04:30 2005 +0000
    11.2 +++ b/src/request/request.c	Wed Jul 27 23:44:37 2005 +0000
    11.3 @@ -26,6 +26,7 @@
    11.4  OMPI_DECLSPEC ompi_mutex_t          ompi_request_lock;
    11.5  OMPI_DECLSPEC ompi_condition_t      ompi_request_cond;
    11.6  OMPI_DECLSPEC ompi_request_t        ompi_request_null;
    11.7 +OMPI_DECLSPEC ompi_request_t        ompi_request_empty;
    11.8  ompi_status_public_t  ompi_status_empty;
    11.9  
   11.10  
   11.11 @@ -53,6 +54,12 @@
   11.12      return OMPI_SUCCESS;
   11.13  }
   11.14  
   11.15 +static int ompi_request_empty_free(ompi_request_t** request)
   11.16 +{
   11.17 +    *request = &ompi_request_null;
   11.18 +    return OMPI_SUCCESS;
   11.19 +}
   11.20 +
   11.21  
   11.22  OBJ_CLASS_INSTANCE(
   11.23      ompi_request_t,
   11.24 @@ -67,6 +74,7 @@
   11.25      OBJ_CONSTRUCT(&ompi_request_lock, ompi_mutex_t);
   11.26      OBJ_CONSTRUCT(&ompi_request_cond, ompi_condition_t);
   11.27      OBJ_CONSTRUCT(&ompi_request_null, ompi_request_t);
   11.28 +    OBJ_CONSTRUCT(&ompi_request_empty, ompi_request_t);
   11.29  
   11.30      ompi_request_null.req_status.MPI_SOURCE = MPI_PROC_NULL;
   11.31      ompi_request_null.req_status.MPI_TAG = MPI_ANY_TAG;
   11.32 @@ -87,6 +95,36 @@
   11.33          return OMPI_ERR_REQUEST;
   11.34      }
   11.35  
   11.36 +    /* We need a way to distinguish between the user provided
   11.37 +     * MPI_REQUEST_NULL to MPI_Wait* and a non-active (MPI_PROC_NULL)
   11.38 +     * request passed to any P2P non-blocking function.
   11.39 +     *
   11.40 +     * The main difference to ompi_request_null is
   11.41 +     * req_state being OMPI_REQUEST_ACTIVE, so that MPI_Waitall
   11.42 +     * does not set the status to ompi_status_empty and the different
   11.43 +     * req_fini and req_free function, which resets the
   11.44 +     * request to MPI_REQUEST_NULL.
   11.45 +     * The req_cancel function need not be changed.
   11.46 +     */
   11.47 +    ompi_request_empty.req_status.MPI_SOURCE = MPI_PROC_NULL;
   11.48 +    ompi_request_empty.req_status.MPI_TAG = MPI_ANY_TAG;
   11.49 +    ompi_request_empty.req_status.MPI_ERROR = MPI_SUCCESS;
   11.50 +    ompi_request_empty.req_status._count = 0;
   11.51 +    ompi_request_empty.req_status._cancelled = 0;
   11.52 +
   11.53 +    ompi_request_empty.req_state = OMPI_REQUEST_ACTIVE;
   11.54 +    ompi_request_empty.req_complete = true;
   11.55 +    ompi_request_empty.req_type = OMPI_REQUEST_NULL;
   11.56 +    ompi_request_empty.req_fini = ompi_request_empty_free;
   11.57 +    ompi_request_empty.req_free = ompi_request_empty_free;
   11.58 +    ompi_request_empty.req_cancel = ompi_request_null_cancel;
   11.59 +    ompi_request_empty.req_f_to_c_index =
   11.60 +        ompi_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_empty);
   11.61 +
   11.62 +    if (1 != ompi_request_empty.req_f_to_c_index) {
   11.63 +        return OMPI_ERR_REQUEST;
   11.64 +    }
   11.65 +
   11.66      ompi_status_empty.MPI_SOURCE = MPI_ANY_SOURCE;
   11.67      ompi_status_empty.MPI_TAG = MPI_ANY_TAG;
   11.68      ompi_status_empty.MPI_ERROR = MPI_SUCCESS;
    12.1 --- a/src/request/request.h	Fri Jul 15 14:04:30 2005 +0000
    12.2 +++ b/src/request/request.h	Wed Jul 27 23:44:37 2005 +0000
    12.3 @@ -142,6 +142,7 @@
    12.4  OMPI_DECLSPEC extern ompi_condition_t      ompi_request_cond;
    12.5  OMPI_DECLSPEC extern int                   ompi_request_poll_iterations;
    12.6  OMPI_DECLSPEC extern ompi_request_t        ompi_request_null;
    12.7 +OMPI_DECLSPEC extern ompi_request_t        ompi_request_empty;
    12.8  OMPI_DECLSPEC extern ompi_status_public_t  ompi_status_empty;
    12.9  
   12.10