fix for deadlock in connect/accept
This commit was SVN r3315.
Этот коммит содержится в:
родитель
de49778184
Коммит
088c97b14e
@ -223,10 +223,12 @@ ompi_process_name_t *ompi_comm_get_rport (ompi_process_name_t *port, int send_fi
|
||||
int rc;
|
||||
ompi_process_name_t *rport, tbuf;
|
||||
ompi_proc_t *rproc=NULL;
|
||||
bool isnew = false;
|
||||
|
||||
if ( send_first ) {
|
||||
ompi_buffer_t sbuf;
|
||||
|
||||
rproc = ompi_proc_find_and_add(port, &isnew);
|
||||
ompi_buffer_init(&sbuf, sizeof(ompi_process_name_t));
|
||||
ompi_pack(sbuf, &(proc->proc_name), 1, OMPI_NAME);
|
||||
rc = mca_oob_send_packed(port, sbuf, tag, 0);
|
||||
@ -240,11 +242,12 @@ ompi_process_name_t *ompi_comm_get_rport (ompi_process_name_t *port, int send_fi
|
||||
rc = mca_oob_recv_packed(MCA_OOB_NAME_ANY, &rbuf, &tag);
|
||||
ompi_unpack(rbuf, &tbuf, 1, OMPI_NAME);
|
||||
ompi_buffer_free(rbuf);
|
||||
|
||||
rproc = ompi_proc_find_and_add(&tbuf);
|
||||
rproc = ompi_proc_find_and_add(&tbuf, &isnew);
|
||||
rport = &(rproc->proc_name);
|
||||
|
||||
}
|
||||
|
||||
if(isnew)
|
||||
mca_pml.pml_add_procs(&rproc, 1);
|
||||
return rport;
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "mca/gpr/base/base.h"
|
||||
#include "mca/ns/ns.h"
|
||||
#include "mca/ns/base/base.h"
|
||||
#include "mca/pml/pml.h"
|
||||
#include "mca/base/mca_base_module_exchange.h"
|
||||
#include "runtime/runtime.h"
|
||||
|
||||
@ -187,6 +188,12 @@ static void mca_base_modex_registry_callback(
|
||||
void* cbdata)
|
||||
{
|
||||
ompi_list_item_t* item;
|
||||
ompi_proc_t** new_procs = NULL;
|
||||
size_t new_proc_count = 0;
|
||||
|
||||
if(ompi_list_get_size(&msg->data)) {
|
||||
new_procs = malloc(sizeof(ompi_proc_t*) * ompi_list_get_size(&msg->data));
|
||||
}
|
||||
|
||||
/* process the callback */
|
||||
while((item = ompi_list_remove_first(&msg->data)) != NULL) {
|
||||
@ -201,6 +208,7 @@ static void mca_base_modex_registry_callback(
|
||||
mca_base_component_t component;
|
||||
void* bptr;
|
||||
int32_t bsize;
|
||||
bool isnew = false;
|
||||
|
||||
/* transfer ownership of registry object to buffer and unpack */
|
||||
ompi_buffer_init_preallocated(&buffer, value->object, value->object_size);
|
||||
@ -212,9 +220,13 @@ static void mca_base_modex_registry_callback(
|
||||
* Lookup the process.
|
||||
*/
|
||||
ompi_unpack(buffer, &proc_name, 1, OMPI_NAME);
|
||||
proc = ompi_proc_find_and_add(&proc_name);
|
||||
proc = ompi_proc_find_and_add(&proc_name, &isnew);
|
||||
if(NULL == proc)
|
||||
continue;
|
||||
if(isnew) {
|
||||
new_procs[new_proc_count] = proc;
|
||||
new_proc_count++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Lookup the modex data structure.
|
||||
@ -277,6 +289,13 @@ static void mca_base_modex_registry_callback(
|
||||
/* release buffer */
|
||||
ompi_buffer_free(buffer);
|
||||
OMPI_THREAD_UNLOCK(&proc->proc_lock);
|
||||
|
||||
/* update the pml/ptls with new proc */
|
||||
}
|
||||
|
||||
if(NULL != new_procs) {
|
||||
mca_pml.pml_add_procs(new_procs, new_proc_count);
|
||||
free(new_procs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,11 +170,12 @@ ompi_proc_t * ompi_proc_find ( const ompi_process_name_t * name )
|
||||
}
|
||||
|
||||
|
||||
ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t * name )
|
||||
ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t * name, bool* isnew )
|
||||
{
|
||||
ompi_proc_t *proc, *rproc=NULL;
|
||||
ompi_ns_cmp_bitmask_t mask;
|
||||
|
||||
fprintf(stderr, "ompi_proc_find_and_add\n");
|
||||
/* return the proc-struct which matches this jobid+process id */
|
||||
mask = OMPI_NS_CMP_CELLID | OMPI_NS_CMP_JOBID | OMPI_NS_CMP_VPID;
|
||||
OMPI_THREAD_LOCK(&ompi_proc_lock);
|
||||
@ -183,6 +184,7 @@ ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t * name )
|
||||
proc = (ompi_proc_t*)ompi_list_get_next(proc)) {
|
||||
if (0 == ompi_name_server.compare(mask, &proc->proc_name, name))
|
||||
{
|
||||
*isnew = false;
|
||||
rproc = proc;
|
||||
break;
|
||||
}
|
||||
@ -193,9 +195,7 @@ ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t * name )
|
||||
ompi_proc_t *tproc = OBJ_NEW(ompi_proc_t);
|
||||
rproc = tproc;
|
||||
rproc->proc_name = *name;
|
||||
|
||||
/* downcall into pml to notify ptls of new proc */
|
||||
mca_pml.pml_add_procs(&rproc,1);
|
||||
*isnew = true;
|
||||
}
|
||||
return rproc;
|
||||
}
|
||||
@ -222,7 +222,8 @@ int ompi_proc_get_proclist (ompi_buffer_t buf, int proclistsize, ompi_proc_t ***
|
||||
int i;
|
||||
ompi_proc_t **plist=NULL;
|
||||
ompi_process_name_t name;
|
||||
|
||||
bool isnew = false;
|
||||
|
||||
/* do not free plist *ever*, since it is used in the remote group structure
|
||||
of a communicator */
|
||||
plist = (ompi_proc_t **) calloc (proclistsize, sizeof (ompi_proc_t *));
|
||||
@ -232,7 +233,10 @@ int ompi_proc_get_proclist (ompi_buffer_t buf, int proclistsize, ompi_proc_t ***
|
||||
|
||||
for ( i=0; i<proclistsize; i++ ){
|
||||
ompi_unpack(buf, &name, 1, OMPI_NAME);
|
||||
plist[i] = ompi_proc_find_and_add ( &name);
|
||||
plist[i] = ompi_proc_find_and_add ( &name, &isnew );
|
||||
if(isnew) {
|
||||
mca_pml.pml_add_procs(&plist[i], 1);
|
||||
}
|
||||
}
|
||||
*proclist = plist;
|
||||
|
||||
|
@ -72,7 +72,7 @@ ompi_proc_t * ompi_proc_find ( const ompi_process_name_t* name );
|
||||
* Returns the proc instance for a given name. If process is not known,
|
||||
* we add it to the process list.
|
||||
*/
|
||||
ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t* name );
|
||||
ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t* name, bool* isnew );
|
||||
|
||||
/**
|
||||
* INPUT: ompi_proc_t **proclist : list of process pointers
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user