1
1
Important note: please don't use these functions just yet - I'll let you know when they are ready for general use.

This commit was SVN r1607.
Этот коммит содержится в:
Ralph Castain 2004-07-09 01:59:50 +00:00
родитель 64fda9a437
Коммит 883f65b435
5 изменённых файлов: 275 добавлений и 11 удалений

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

@ -38,7 +38,7 @@
/*
* define maximum value for id's in any field
*/
#define OMPI_NAME_SERVICE_MAX = UINT32_MAX
#define OMPI_NAME_SERVICE_MAX UINT32_MAX
/*
* general typedefs & structures
@ -337,9 +337,7 @@ typedef ompi_process_id_t (*mca_ns_get_cellid_fn_t)(const ompi_process_name_t *n
* @retval +1 The indicated fields of the first provided name is greater than the same
* fields of the second provided name.
*
* There currently
* is no error indication that this function failed.
* Some means of returning a value indicative of an error will be devised in the future.
* The function returns a large negative value if there is an error.
*
* @code
* result = ompi_name_server.compare(bit_mask, &name1, &name2)

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

@ -7,5 +7,6 @@ include $(top_ompi_srcdir)/config/Makefile.options
noinst_LTLIBRARIES = libmca_ns_replica.la
libmca_ns_replica_la_SOURCES = \
ns_replica.h \
ns_replica.c \
ns_replica_module.c

265
src/mca/ns/replica/src/ns_replica.c Обычный файл
Просмотреть файл

@ -0,0 +1,265 @@
/*
* $HEADER$
*/
/** @file:
*
*/
#include "ompi_config.h"
#include "mca/mca.h"
#include "mca/ns/base/base.h"
#include "ns_replica.h"
/**
* globals
*/
/* constructor - used to initialize state of name instance */
static void ompi_name_construct(ompi_process_name_t* name)
{
name->cellid = 0;
name->jobid = 0;
name->vpid = 0;
}
/* destructor - used to free any resources held by instance */
static void ompi_name_destructor(ompi_process_name_t* name)
{
}
OBJ_CLASS_INSTANCE(
ompi_process_name_t, /* type name */
ompi_object_t, /* parent "class" name */
ompi_name_construct, /* constructor */
ompi_name_destructor); /* destructor */
/*
* functions
*/
ompi_process_id_t ns_replica_create_cellid(void)
{
if ((OMPI_NAME_SERVICE_MAX-1) < last_used_cellid) {
last_used_cellid = last_used_cellid + 1;
return(last_used_cellid);
} else {
return(0);
}
}
ompi_process_id_t ns_replica_create_jobid(void)
{
ompi_name_tracker_t *new;
if ((OMPI_NAME_SERVICE_MAX-1) < last_used_jobid) {
last_used_jobid = last_used_jobid + 1;
new = OBJ_NEW(ompi_name_tracker_t);
new->job = last_used_jobid;
new->last_used_vpid = 0;
ompi_list_append(&ompi_name_tracker, &new->item);
return(last_used_jobid);
} else {
return(0);
}
}
ompi_process_name_t* ns_replica_create_process_name(ompi_process_id_t cell,
ompi_process_id_t job, ompi_process_id_t vpid)
{
ompi_process_name_t *newname;
newname = OBJ_NEW(ompi_process_name_t);
if (NULL == newname) { /* got an error */
return(NULL);
}
newname->cellid = cell;
newname->jobid = job;
newname->vpid = vpid;
return(newname);
}
ompi_process_id_t ns_replica_reserve_range(ompi_process_id_t job, ompi_process_id_t range)
{
ompi_name_tracker_t *ptr;
ompi_process_id_t start;
for (ptr = (ompi_name_tracker_t*)ompi_list_get_first(&ompi_name_tracker);
ptr != (ompi_name_tracker_t*)ompi_list_get_end(&ompi_name_tracker);
ptr = (ompi_name_tracker_t*)ompi_list_get_next(ptr)) {
if (job == ptr->job) { /* found the specified job */
if ((OMPI_NAME_SERVICE_MAX-range-1) > ptr->last_used_vpid) { /* requested range available */
start = ptr->last_used_vpid + 1;
ptr->last_used_vpid = ptr->last_used_vpid + range;
return(start);
}
}
}
return(0);
}
int ns_replica_free_name(ompi_process_name_t* name)
{
return OMPI_SUCCESS;
}
char* ns_replica_get_proc_name_string(const ompi_process_name_t* name)
{
char *name_string;
int size;
if (NULL == name) { /* got an error */
return(NULL);
}
size = (3*sizeof(name->cellid)/4) + 3;
name_string = (char*)malloc(27*sizeof(char));
if (NULL == name_string) { /* got an error */
return(NULL);
}
sprintf(name_string, "%0x.%0x.%0x", name->cellid, name->jobid, name->vpid);
return(name_string);
}
char* ns_replica_get_vpid_string(const ompi_process_name_t* name)
{
char *name_string;
int size;
if (NULL == name) { /* got an error */
return(NULL);
}
size = 1 + sizeof(name->vpid)/4;
name_string = (char*)malloc(size*sizeof(char));
if (NULL == name_string) { /* got an error */
return(NULL);
}
sprintf(name_string, "%0x", name->vpid);
return(name_string);
}
char* ns_replica_get_jobid_string(const ompi_process_name_t* name)
{
char *name_string;
int size;
if (NULL == name) { /* got an error */
return(NULL);
}
size = 1 + sizeof(name->jobid);
name_string = (char*)malloc(size*sizeof(char));
if (NULL == name_string) { /* got an error */
return(NULL);
}
sprintf(name_string, "%0x", name->jobid);
return(name_string);
}
char* ns_replica_get_cellid_string(const ompi_process_name_t* name)
{
char *name_string;
int size;
if (NULL == name) { /* got an error */
return(NULL);
}
size = 1 + sizeof(name->cellid);
name_string = (char*)malloc(size*sizeof(char));
if (NULL == name_string) { /* got an error */
return(NULL);
}
sprintf(name_string, "%0x", name->cellid);
return(name_string);
}
ompi_process_id_t ns_replica_get_vpid(const ompi_process_name_t* name)
{
if (NULL == name) { /* got an error */
return(OMPI_NAME_SERVICE_MAX);
}
return(name->vpid);
}
ompi_process_id_t ns_replica_get_jobid(const ompi_process_name_t* name)
{
if (NULL == name) { /* got an error */
return(OMPI_NAME_SERVICE_MAX);
}
return(name->jobid);
}
ompi_process_id_t ns_replica_get_cellid(const ompi_process_name_t* name)
{
if (NULL == name) { /* got an error */
return(OMPI_NAME_SERVICE_MAX);
}
return(name->cellid);
}
int ns_replica_compare(ompi_ns_cmp_bitmask_t fields,
const ompi_process_name_t* name1,
const ompi_process_name_t* name2)
{
if ((fields <= 0) || (fields > 7) || NULL == name1 || NULL == name2) { /* got an error */
return(-100);
}
if (OMPI_NS_CMP_CELLID & fields) { /* check cellid field */
if (name1->cellid < name2->cellid) {
return(-1);
} else if (name1->cellid > name2->cellid) {
return(1);
}
}
/* get here if cellid's are equal, or cellid not being checked */
/* now check job id */
if (OMPI_NS_CMP_JOBID & fields) {
if (name1->jobid < name2->jobid) {
return(-1);
} else if (name1->jobid > name2->jobid) {
return(1);
}
}
/* get here if cellid's and jobid's are equal, or neither being checked,
* or cellid not checked and jobid's equal.
* now check vpid
*/
if (OMPI_NS_CMP_VPID & fields) {
if (name1->vpid < name2->vpid) {
return(-1);
} else if (name1->vpid > name2->vpid) {
return(1);
}
}
/* only way to get here is if all fields are being checked and are equal,
* or cellid not checked, but jobid and vpid equal,
* or cellid and jobid not checked, but vpid equal,
* only vpid being checked, and equal
* return that fact
*/
return(0);
}

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

@ -30,9 +30,9 @@ OBJ_CLASS_DECLARATION(ompi_name_tracker_t);
/*
* globals needed within component
*/
extern ompi_process_id_t max_used_cellid;
extern ompi_process_id_t max_used_jobid;
extern ompi_name_tracker_t ompi_name_tracker;
extern ompi_process_id_t last_used_cellid;
extern ompi_process_id_t last_used_jobid;
extern ompi_list_t ompi_name_tracker;
/*
* Module open / close

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

@ -87,7 +87,7 @@ OBJ_CLASS_INSTANCE(
*/
ompi_process_id_t last_used_cellid;
ompi_process_id_t last_used_jobid;
ompi_list_t name_tracker;
ompi_list_t ompi_name_tracker;
/*
* don't really need this function - could just put NULL in the above structure
@ -96,11 +96,11 @@ ompi_list_t name_tracker;
int
mca_ns_replica_open(void)
{
max_used_cellid = 0;
max_used_jobid = 0;
last_used_cellid = 0;
last_used_jobid = 0;
/* initialize the name tracker */
OBJ_CONSTRUCT(&name_tracker, ompi_list_t);
OBJ_CONSTRUCT(&ompi_name_tracker, ompi_list_t);
return OMPI_SUCCESS;
}