Hi Jeff,

request_get_status polls request->req_complete before calling
opal_progress. Ideally, it would check req_complete, call opal_progress,
and check req_complete one final time. This patch identically mirrors
the logic of
ompi_request_default_test in ompi/request/req_test.c.

We've discussed this patch on the mailing list previously. I think we
both agreed it was a good idea, but never made it around to being
applied.

Cheers,
Shaun

2009-09-14  Shaun Jackman  <sjack...@gmail.com>

        * ompi/mpi/c/request_get_status.c (MPI_Request_get_status):
        If opal_progress is called then check the status of the request
        before returning. opal_progress is called only once. This logic
        parallels MPI_Test (ompi_request_default_test).

--- ompi/mpi/c/request_get_status.c.orig        2008-11-04 12:56:27.000000000 
-0800
+++ ompi/mpi/c/request_get_status.c     2009-09-24 15:30:09.995850000 -0700
@@ -41,6 +41,10 @@
 int MPI_Request_get_status(MPI_Request request, int *flag,
                            MPI_Status *status) 
 {
+#if OMPI_ENABLE_PROGRESS_THREADS == 0
+    int do_it_once = 0;
+#endif
+
     MEMCHECKER(
         memchecker_request(&request);
     );
@@ -57,6 +61,9 @@
         }
     }

+#if OMPI_ENABLE_PROGRESS_THREADS == 0
+ recheck_request_status:
+#endif
     opal_atomic_mb();
     if( (request == MPI_REQUEST_NULL) || (request->req_state == 
OMPI_REQUEST_INACTIVE) ) {
         *flag = true;
@@ -78,9 +85,17 @@
         }
         return MPI_SUCCESS;
     }
-    *flag = false;
 #if OMPI_ENABLE_PROGRESS_THREADS == 0
-    opal_progress();
+    if( 0 == do_it_once ) {
+        /**
+         * If we run the opal_progress then check the status of the request 
before
+         * leaving. We will call the opal_progress only once per call.
+         */
+        opal_progress();
+        do_it_once++;
+        goto recheck_request_status;
+    }
 #endif
+    *flag = false;

2009-09-14  Shaun Jackman  <sjack...@gmail.com>

	* ompi/mpi/c/request_get_status.c (MPI_Request_get_status):
	If opal_progress is called then check the status of the request
	before returning. opal_progress is called only once. This logic
	parallels MPI_Test (ompi_request_default_test).

--- ompi/mpi/c/request_get_status.c.orig	2008-11-04 12:56:27.000000000 -0800
+++ ompi/mpi/c/request_get_status.c	2009-09-24 15:30:09.995850000 -0700
@@ -41,6 +41,10 @@
 int MPI_Request_get_status(MPI_Request request, int *flag,
                            MPI_Status *status) 
 {
+#if OMPI_ENABLE_PROGRESS_THREADS == 0
+    int do_it_once = 0;
+#endif
+
     MEMCHECKER(
         memchecker_request(&request);
     );
@@ -57,6 +61,9 @@
         }
     }

+#if OMPI_ENABLE_PROGRESS_THREADS == 0
+ recheck_request_status:
+#endif
     opal_atomic_mb();
     if( (request == MPI_REQUEST_NULL) || (request->req_state == OMPI_REQUEST_INACTIVE) ) {
         *flag = true;
@@ -78,9 +85,17 @@
         }
         return MPI_SUCCESS;
     }
-    *flag = false;
 #if OMPI_ENABLE_PROGRESS_THREADS == 0
-    opal_progress();
+    if( 0 == do_it_once ) {
+        /**
+         * If we run the opal_progress then check the status of the request before
+         * leaving. We will call the opal_progress only once per call.
+         */
+        opal_progress();
+        do_it_once++;
+        goto recheck_request_status;
+    }
 #endif
+    *flag = false;
     return MPI_SUCCESS;
 }

Reply via email to