1
1

removing the second lock. By introducing a new function proc_find_and_add we can work with a single lock. Actually, this makes the stuff for the dynamic process management easier.

This commit was SVN r2740.
Этот коммит содержится в:
Edgar Gabriel 2004-09-17 10:10:24 +00:00
родитель 6653be59fd
Коммит 54bdb20351
2 изменённых файлов: 38 добавлений и 13 удалений

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

@ -19,7 +19,6 @@
static ompi_list_t ompi_proc_list;
static ompi_mutex_t ompi_proc_lock;
static ompi_mutex_t ompi_proc_lock2;
ompi_proc_t* ompi_proc_local_proc = NULL;
static void ompi_proc_construct(ompi_proc_t* proc);
@ -150,7 +149,7 @@ ompi_proc_t** ompi_proc_self(size_t* size)
ompi_proc_t * ompi_proc_find ( const ompi_process_name_t * name )
{
ompi_proc_t *proc;
ompi_proc_t *proc, *rproc=NULL;
ompi_ns_cmp_bitmask_t mask;
/* return the proc-struct which matches this jobid+process id */
@ -162,14 +161,43 @@ ompi_proc_t * ompi_proc_find ( 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))
{
rproc = proc;
break;
}
}
OMPI_THREAD_UNLOCK(&ompi_proc_lock);
return proc;
return rproc;
}
ompi_proc_t * ompi_proc_find_and_add ( const ompi_process_name_t * name )
{
ompi_proc_t *proc, *rproc=NULL;
ompi_ns_cmp_bitmask_t mask;
/* 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);
for(proc = (ompi_proc_t*)ompi_list_get_first(&ompi_proc_list);
proc != (ompi_proc_t*)ompi_list_get_end(&ompi_proc_list);
proc = (ompi_proc_t*)ompi_list_get_next(proc)) {
if (0 == ompi_name_server.compare(mask, &proc->proc_name, name))
{
rproc = proc;
break;
}
}
if ( NULL == rproc ) {
ompi_proc_t *tproc = OBJ_NEW(ompi_proc_t);
rproc = tproc;
rproc->proc_name = *name;
}
OMPI_THREAD_UNLOCK(&ompi_proc_lock);
return rproc;
}
int ompi_proc_get_namebuf ( ompi_proc_t **proclist, int proclistsize,
ompi_buffer_t buf)
{
@ -193,27 +221,18 @@ int ompi_proc_get_proclist (ompi_buffer_t buf, int proclistsize, ompi_proc_t ***
ompi_proc_t **plist=NULL;
ompi_process_name_t name;
OMPI_THREAD_LOCK(&ompi_proc_lock2);
/* 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 *));
if ( NULL == plist ) {
OMPI_THREAD_UNLOCK(&ompi_proc_lock2);
return OMPI_ERR_OUT_OF_RESOURCE;
}
for ( i=0; i<proclistsize; i++ ){
ompi_unpack(buf, &name, 1, OMPI_NAME);
plist[i] = ompi_proc_find ( &name);
if ( NULL == plist[i] ) {
ompi_proc_t *proc = OBJ_NEW(ompi_proc_t);
proc->proc_name = name;
plist[i] = proc;
}
plist[i] = ompi_proc_find_and_add ( &name);
}
*proclist = plist;
OMPI_THREAD_UNLOCK(&ompi_proc_lock2);
return OMPI_SUCCESS;
}

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

@ -67,6 +67,12 @@ static inline ompi_proc_t* ompi_proc_local(void)
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 );
/**
* INPUT: ompi_proc_t **proclist : list of process pointers
* INPUT: int proclistsize : lenght of the proclist array