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