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