1
1

fix for deadlock in connect/accept

This commit was SVN r3315.
Этот коммит содержится в:
Tim Woodall 2004-10-25 19:52:37 +00:00
родитель de49778184
Коммит 088c97b14e
4 изменённых файлов: 37 добавлений и 11 удалений

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

@ -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