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
@@ -107,6 +108,10 @@ int ompi_request_default_wait_any(size_t count,
107108 assert (REQUEST_COMPLETE (request ));
108109 completed = i ;
109110 * index = i ;
111+ /* set signalled flag so we won't
112+ * block in WAIT_SYNC_RELEASE
113+ */
114+ WAIT_SYNC_SIGNALLED (& sync );
110115 goto after_sync_wait ;
111116 }
112117 }
@@ -116,7 +121,8 @@ int ompi_request_default_wait_any(size_t count,
116121 if (MPI_STATUS_IGNORE != status ) {
117122 * status = ompi_status_empty ;
118123 }
119- WAIT_SYNC_RELEASE (& sync );
124+ /* No signal-in-flight can be in this case */
125+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
120126 return rc ;
121127 }
122128
@@ -361,7 +367,8 @@ int ompi_request_default_wait_some(size_t count,
361367 ompi_request_t * * rptr = NULL ;
362368 ompi_request_t * request = NULL ;
363369 ompi_wait_sync_t sync ;
364-
370+ size_t sync_sets = 0 , sync_unsets = 0 ;
371+
365372 WAIT_SYNC_INIT (& sync , 1 );
366373
367374 * outcount = 0 ;
@@ -384,12 +391,15 @@ int ompi_request_default_wait_some(size_t count,
384391 /* If the request is completed go ahead and mark it as such */
385392 assert ( REQUEST_COMPLETE (request ) );
386393 num_requests_done ++ ;
394+ } else {
395+ sync_sets ++ ;
387396 }
388397 }
389398
390399 if (num_requests_null_inactive == count ) {
391400 * outcount = MPI_UNDEFINED ;
392- WAIT_SYNC_RELEASE (& sync );
401+ /* nobody will signall us */
402+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
393403 return rc ;
394404 }
395405
@@ -418,9 +428,19 @@ int ompi_request_default_wait_some(size_t count,
418428 if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
419429 indices [num_requests_done ] = i ;
420430 num_requests_done ++ ;
431+ } else {
432+ /* request wasn't finished during this call */
433+ sync_unsets ++ ;
421434 }
422435 }
423436
437+ if ( sync_sets == sync_unsets ){
438+ /* nobody knows about us,
439+ * set signa-in-progress flag to false
440+ */
441+ WAIT_SYNC_SIGNALLED (& sync );
442+ }
443+
424444 WAIT_SYNC_RELEASE (& sync );
425445
426446 * outcount = num_requests_done ;
0 commit comments