1
1

Merge pull request #3901 from Zzzoom/nbc_remove_progress_lock

coll/libnbc: demote progress_lock to regular flag
Этот коммит содержится в:
Gilles Gouaillardet 2017-07-25 09:24:08 +09:00 коммит произвёл GitHub
родитель 4a14cc33f3 1767b218fb
Коммит e054f870a8
2 изменённых файлов: 24 добавлений и 25 удалений

Просмотреть файл

@ -75,7 +75,6 @@ struct ompi_coll_libnbc_component_t {
opal_free_list_t requests;
opal_list_t active_requests;
int32_t active_comms;
opal_atomic_lock_t progress_lock; /* protect from recursive calls */
opal_mutex_t lock; /* protect access to the active_requests list */
};
typedef struct ompi_coll_libnbc_component_t ompi_coll_libnbc_component_t;

Просмотреть файл

@ -39,6 +39,7 @@ const char *mca_coll_libnbc_component_version_string =
static int libnbc_priority = 10;
static bool libnbc_in_progress = false; /* protect from recursive calls */
bool libnbc_ibcast_skip_dt_decision = true;
@ -102,8 +103,6 @@ libnbc_open(void)
a non-blocking collective started */
mca_coll_libnbc_component.active_comms = 0;
opal_atomic_init(&mca_coll_libnbc_component.progress_lock, OPAL_ATOMIC_UNLOCKED);
return OMPI_SUCCESS;
}
@ -263,37 +262,38 @@ ompi_coll_libnbc_progress(void)
ompi_coll_libnbc_request_t* request, *next;
int res;
/* return if invoked recursively */
if (opal_atomic_trylock(&mca_coll_libnbc_component.progress_lock)) return 0;
/* process active requests, and use mca_coll_libnbc_component.lock to access the
* mca_coll_libnbc_component.active_requests list */
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
OPAL_LIST_FOREACH_SAFE(request, next, &mca_coll_libnbc_component.active_requests,
ompi_coll_libnbc_request_t) {
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
res = NBC_Progress(request);
if( NBC_CONTINUE != res ) {
/* done, remove and complete */
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
opal_list_remove_item(&mca_coll_libnbc_component.active_requests,
&request->super.super.super);
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
/* return if invoked recursively */
if (!libnbc_in_progress) {
libnbc_in_progress = true;
if( OMPI_SUCCESS == res || NBC_OK == res || NBC_SUCCESS == res ) {
request->super.req_status.MPI_ERROR = OMPI_SUCCESS;
OPAL_LIST_FOREACH_SAFE(request, next, &mca_coll_libnbc_component.active_requests,
ompi_coll_libnbc_request_t) {
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
res = NBC_Progress(request);
if( NBC_CONTINUE != res ) {
/* done, remove and complete */
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
opal_list_remove_item(&mca_coll_libnbc_component.active_requests,
&request->super.super.super);
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
if( OMPI_SUCCESS == res || NBC_OK == res || NBC_SUCCESS == res ) {
request->super.req_status.MPI_ERROR = OMPI_SUCCESS;
}
else {
request->super.req_status.MPI_ERROR = res;
}
ompi_request_complete(&request->super, true);
}
else {
request->super.req_status.MPI_ERROR = res;
}
ompi_request_complete(&request->super, true);
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
}
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
libnbc_in_progress = false;
}
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
opal_atomic_unlock(&mca_coll_libnbc_component.progress_lock);
return 0;
}