1515 * Copyright (c) 2012 Oak Ridge National Labs. All rights reserved.
1616 * Copyright (c) 2016 Los Alamos National Security, LLC. All rights
1717 * reserved.
18+ * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
1819 * $COPYRIGHT$
1920 *
2021 * Additional copyrights may follow
@@ -87,6 +88,7 @@ int ompi_request_default_wait_any(size_t count,
8788 int rc = OMPI_SUCCESS ;
8889 ompi_request_t * request = NULL ;
8990 ompi_wait_sync_t sync ;
91+ int sync_sets = 0 , sync_unsets = 0 ;
9092
9193 WAIT_SYNC_INIT (& sync , 1 );
9294
@@ -108,6 +110,8 @@ int ompi_request_default_wait_any(size_t count,
108110 completed = i ;
109111 * index = i ;
110112 goto after_sync_wait ;
113+ } else {
114+ sync_sets ++ ;
111115 }
112116 }
113117
@@ -116,7 +120,8 @@ int ompi_request_default_wait_any(size_t count,
116120 if (MPI_STATUS_IGNORE != status ) {
117121 * status = ompi_status_empty ;
118122 }
119- WAIT_SYNC_RELEASE (& sync );
123+ /* No signal-in-flight can be in this case */
124+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
120125 return rc ;
121126 }
122127
@@ -138,8 +143,17 @@ int ompi_request_default_wait_any(size_t count,
138143 */
139144 if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
140145 * index = i ;
146+ } else {
147+ sync_unsets ++ ;
141148 }
142149 }
150+
151+ if ( sync_sets == sync_unsets ){
152+ /* set signalled flag so we won't
153+ * block in WAIT_SYNC_RELEASE
154+ */
155+ WAIT_SYNC_SIGNALLED (& sync );
156+ }
143157
144158 request = requests [* index ];
145159 assert ( REQUEST_COMPLETE (request ) );
@@ -361,7 +375,8 @@ int ompi_request_default_wait_some(size_t count,
361375 ompi_request_t * * rptr = NULL ;
362376 ompi_request_t * request = NULL ;
363377 ompi_wait_sync_t sync ;
364-
378+ size_t sync_sets = 0 , sync_unsets = 0 ;
379+
365380 WAIT_SYNC_INIT (& sync , 1 );
366381
367382 * outcount = 0 ;
@@ -384,12 +399,15 @@ int ompi_request_default_wait_some(size_t count,
384399 /* If the request is completed go ahead and mark it as such */
385400 assert ( REQUEST_COMPLETE (request ) );
386401 num_requests_done ++ ;
402+ } else {
403+ sync_sets ++ ;
387404 }
388405 }
389406
390407 if (num_requests_null_inactive == count ) {
391408 * outcount = MPI_UNDEFINED ;
392- WAIT_SYNC_RELEASE (& sync );
409+ /* nobody will signall us */
410+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
393411 return rc ;
394412 }
395413
@@ -418,9 +436,19 @@ int ompi_request_default_wait_some(size_t count,
418436 if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
419437 indices [num_requests_done ] = i ;
420438 num_requests_done ++ ;
439+ } else {
440+ /* request wasn't finished during this call */
441+ sync_unsets ++ ;
421442 }
422443 }
423444
445+ if ( sync_sets == sync_unsets ){
446+ /* nobody knows about us,
447+ * set signa-in-progress flag to false
448+ */
449+ WAIT_SYNC_SIGNALLED (& sync );
450+ }
451+
424452 WAIT_SYNC_RELEASE (& sync );
425453
426454 * outcount = num_requests_done ;
0 commit comments