Fix ticket #1267
With help from Brian, modify the ompi/proc/proc.c code to be more thread-safe. Remove the list operations from the ompi_proc_t constructor and destructor. Insert list appends to ompi_proc_init and ompi_proc_find_and_add as required, and protect those with thread locks. Let only the ompi_proc_finalize function actually remove objects from the ompi_proc_list. Cleanup a few places where functions might return without unlocking a thread. Ensure the ompi_proc_world also does an OBJ_RETAIN so that the reference count on any subsequently released object is correct. This commit was SVN r18816.
Этот коммит содержится в:
@ -73,10 +73,6 @@ void ompi_proc_construct(ompi_proc_t* proc)
|
|||||||
|
|
||||||
/* initialize this pointer to NULL */
|
/* initialize this pointer to NULL */
|
||||||
proc->proc_hostname = NULL;
|
proc->proc_hostname = NULL;
|
||||||
|
|
||||||
OPAL_THREAD_LOCK(&ompi_proc_lock);
|
|
||||||
opal_list_append(&ompi_proc_list, (opal_list_item_t*)proc);
|
|
||||||
OPAL_THREAD_UNLOCK(&ompi_proc_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -91,9 +87,6 @@ void ompi_proc_destruct(ompi_proc_t* proc)
|
|||||||
/* DO NOT FREE THE HOSTNAME FIELD AS THIS POINTS
|
/* DO NOT FREE THE HOSTNAME FIELD AS THIS POINTS
|
||||||
* TO AN AREA ALLOCATED/FREE'D ELSEWHERE
|
* TO AN AREA ALLOCATED/FREE'D ELSEWHERE
|
||||||
*/
|
*/
|
||||||
OPAL_THREAD_LOCK(&ompi_proc_lock);
|
|
||||||
opal_list_remove_item(&ompi_proc_list, (opal_list_item_t*)proc);
|
|
||||||
OPAL_THREAD_UNLOCK(&ompi_proc_lock);
|
|
||||||
OBJ_DESTRUCT(&proc->proc_lock);
|
OBJ_DESTRUCT(&proc->proc_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +101,8 @@ int ompi_proc_init(void)
|
|||||||
/* create proc structures and find self */
|
/* create proc structures and find self */
|
||||||
for( i = 0; i < orte_process_info.num_procs; i++ ) {
|
for( i = 0; i < orte_process_info.num_procs; i++ ) {
|
||||||
ompi_proc_t *proc = OBJ_NEW(ompi_proc_t);
|
ompi_proc_t *proc = OBJ_NEW(ompi_proc_t);
|
||||||
|
opal_list_append(&ompi_proc_list, (opal_list_item_t*)proc);
|
||||||
|
|
||||||
proc->proc_name.jobid = ORTE_PROC_MY_NAME->jobid;
|
proc->proc_name.jobid = ORTE_PROC_MY_NAME->jobid;
|
||||||
proc->proc_name.vpid = i;
|
proc->proc_name.vpid = i;
|
||||||
if (i == ORTE_PROC_MY_NAME->vpid) {
|
if (i == ORTE_PROC_MY_NAME->vpid) {
|
||||||
@ -165,19 +160,14 @@ int ompi_proc_set_arch(void)
|
|||||||
|
|
||||||
int ompi_proc_finalize (void)
|
int ompi_proc_finalize (void)
|
||||||
{
|
{
|
||||||
ompi_proc_t *proc, *nextproc, *endproc;
|
ompi_proc_t *proc;
|
||||||
|
|
||||||
proc = (ompi_proc_t*)opal_list_get_first(&ompi_proc_list);
|
/* remove all procs from list and destroy */
|
||||||
nextproc = (ompi_proc_t*)opal_list_get_next(proc);
|
while (NULL != (proc = (ompi_proc_t*) opal_list_remove_first(&ompi_proc_list))) {
|
||||||
endproc = (ompi_proc_t*)opal_list_get_end(&ompi_proc_list);
|
|
||||||
|
|
||||||
OBJ_RELEASE(proc);
|
|
||||||
while ( nextproc != endproc ) {
|
|
||||||
proc = nextproc;
|
|
||||||
nextproc = (ompi_proc_t *)opal_list_get_next(proc);
|
|
||||||
OBJ_RELEASE(proc);
|
OBJ_RELEASE(proc);
|
||||||
}
|
}
|
||||||
OBJ_DESTRUCT(&ompi_proc_list);
|
OBJ_DESTRUCT(&ompi_proc_list);
|
||||||
|
OBJ_DESTRUCT(&ompi_proc_lock);
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -210,6 +200,7 @@ ompi_proc_t** ompi_proc_world(size_t *size)
|
|||||||
/* allocate an array */
|
/* allocate an array */
|
||||||
procs = (ompi_proc_t**) malloc(count * sizeof(ompi_proc_t*));
|
procs = (ompi_proc_t**) malloc(count * sizeof(ompi_proc_t*));
|
||||||
if (NULL == procs) {
|
if (NULL == procs) {
|
||||||
|
OPAL_THREAD_UNLOCK(&ompi_proc_lock);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,6 +210,7 @@ ompi_proc_t** ompi_proc_world(size_t *size)
|
|||||||
proc != (ompi_proc_t*)opal_list_get_end(&ompi_proc_list);
|
proc != (ompi_proc_t*)opal_list_get_end(&ompi_proc_list);
|
||||||
proc = (ompi_proc_t*)opal_list_get_next(proc)) {
|
proc = (ompi_proc_t*)opal_list_get_next(proc)) {
|
||||||
if (OPAL_EQUAL == orte_util_compare_name_fields(mask, &proc->proc_name, &my_name)) {
|
if (OPAL_EQUAL == orte_util_compare_name_fields(mask, &proc->proc_name, &my_name)) {
|
||||||
|
OBJ_RETAIN(proc);
|
||||||
procs[count++] = proc;
|
procs[count++] = proc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,6 +384,7 @@ ompi_proc_find_and_add(const orte_process_name_t * name, bool* isnew)
|
|||||||
*isnew = true;
|
*isnew = true;
|
||||||
rproc = OBJ_NEW(ompi_proc_t);
|
rproc = OBJ_NEW(ompi_proc_t);
|
||||||
if (NULL != rproc) {
|
if (NULL != rproc) {
|
||||||
|
opal_list_append(&ompi_proc_list, (opal_list_item_t*)proc);
|
||||||
rproc->proc_name = *name;
|
rproc->proc_name = *name;
|
||||||
}
|
}
|
||||||
/* caller had better fill in the rest of the proc, or there's
|
/* caller had better fill in the rest of the proc, or there's
|
||||||
|
Ссылка в новой задаче
Block a user