From 48c8d55b6d175afd1a4d972a68a55214f96e49de Mon Sep 17 00:00:00 2001 From: Ralph Castain Date: Sun, 8 Aug 2004 17:29:45 +0000 Subject: [PATCH] Update the name server functions. Added the converter from string to process name, fixed a few other things. This commit was SVN r1965. --- src/mca/ns/base/base.h | 2 + src/mca/ns/base/ns_base_local_fns.c | 113 +++++++++++++----- src/mca/ns/ns.h | 80 ++++++++----- src/mca/ns/replica/src/ns_replica.c | 12 +- src/mca/ns/replica/src/ns_replica.h | 9 +- src/mca/ns/replica/src/ns_replica_component.c | 8 +- 6 files changed, 157 insertions(+), 67 deletions(-) diff --git a/src/mca/ns/base/base.h b/src/mca/ns/base/base.h index 5d0f29a13b..cf46688f5d 100644 --- a/src/mca/ns/base/base.h +++ b/src/mca/ns/base/base.h @@ -35,6 +35,8 @@ extern "C" { mca_ns_base_jobid_t job, mca_ns_base_vpid_t vpid); + ompi_process_name_t* ns_base_convert_string_to_process_name(const char* name); + char* ns_base_get_proc_name_string(const ompi_process_name_t* name); char* ns_base_get_vpid_string(const ompi_process_name_t* name); diff --git a/src/mca/ns/base/ns_base_local_fns.c b/src/mca/ns/base/ns_base_local_fns.c index d1a8e3a3be..4aafebce0f 100644 --- a/src/mca/ns/base/ns_base_local_fns.c +++ b/src/mca/ns/base/ns_base_local_fns.c @@ -4,6 +4,9 @@ /** @file: * */ +#include +#include +#include #include "ompi_config.h" #include "util/output.h" @@ -23,6 +26,12 @@ ompi_process_name_t* ns_base_create_process_name(mca_ns_base_cellid_t cell, { ompi_process_name_t *newname; + if (MCA_NS_BASE_CELLID_MAX < cell || + MCA_NS_BASE_JOBID_MAX < job || + MCA_NS_BASE_VPID_MAX < vpid) { + return(NULL); + } + newname = OBJ_NEW(ompi_process_name_t); if (NULL == newname) { /* got an error */ return(NULL); @@ -38,39 +47,97 @@ ompi_process_name_t* ns_base_create_process_name(mca_ns_base_cellid_t cell, char* ns_base_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); + if (0 > asprintf(&name_string, "%0X.%0X.%0X", name->cellid, name->jobid, name->vpid)) { + return NULL; } - sprintf(name_string, "%0x.%0x.%0x", name->cellid, name->jobid, name->vpid); return(name_string); } +ompi_process_name_t* ns_base_convert_string_to_process_name(const char* name) +{ + char *temp, *token; + mca_ns_base_cellid_t cell; + mca_ns_base_jobid_t job; + mca_ns_base_vpid_t vpid; + unsigned long int tmpint; + + const char delimiters[] = "."; + ompi_process_name_t *return_code; + + return_code = NULL; + + /* check for NULL string - error */ + if (NULL == name) { + return NULL; + } + + temp = strdup(name); + token = strtok(temp, delimiters); /* get first field -> cellid */ + + /* convert to largest possible unsigned int - unsigned long long is only supported + * in C99, so we have to use unsigned long for backward compatibility - then + * check to ensure it is within range of cellid_t before casting */ + + tmpint = strtoul(token, NULL, 16); + if (MCA_NS_BASE_CELLID_MAX >= tmpint) { + cell = (mca_ns_base_cellid_t)tmpint; + } else { + goto CLEANUP; + } + + token = strtok(NULL, delimiters); /* get second field -> jobid */ + + /* convert to largest possible unsigned int - then + * check to ensure it is within range of jobid_t before casting */ + + tmpint = strtoul(token, NULL, 16); + if (MCA_NS_BASE_JOBID_MAX >= tmpint) { + job = (mca_ns_base_jobid_t)tmpint; + } else { + goto CLEANUP; + } + + token = strtok(NULL, delimiters); /* get third field -> vpid */ + + /* convert to largest possible unsigned int then + * check to ensure it is within range of vpid_t before casting */ + + tmpint = strtoul(token, NULL, 16); + if (MCA_NS_BASE_VPID_MAX >= tmpint) { + vpid = (mca_ns_base_vpid_t)tmpint; + } else { + goto CLEANUP; + } + + return_code = ns_base_create_process_name(cell, job, vpid); + + CLEANUP: + if (temp) { + free(temp); + } + + return return_code; +} + char* ns_base_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); + if (0 > asprintf(&name_string, "%0X", name->vpid)) { + return NULL; } - sprintf(name_string, "%0x", name->vpid); return(name_string); } @@ -78,19 +145,15 @@ char* ns_base_get_vpid_string(const ompi_process_name_t* name) char* ns_base_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); + if (0 > asprintf(&name_string, "%0X", name->jobid)) { + return NULL; } - sprintf(name_string, "%0x", name->jobid); return(name_string); } @@ -98,19 +161,15 @@ char* ns_base_get_jobid_string(const ompi_process_name_t* name) char* ns_base_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); + if (0 > asprintf(&name_string, "%0X", name->cellid)) { + return NULL; } - sprintf(name_string, "%0x", name->cellid); return(name_string); } @@ -118,7 +177,7 @@ char* ns_base_get_cellid_string(const ompi_process_name_t* name) mca_ns_base_vpid_t ns_base_get_vpid(const ompi_process_name_t* name) { if (NULL == name) { /* got an error */ - return(OMPI_NAME_SERVICE_MAX); + return(MCA_NS_BASE_VPID_MAX); } return(name->vpid); @@ -128,7 +187,7 @@ mca_ns_base_vpid_t ns_base_get_vpid(const ompi_process_name_t* name) mca_ns_base_jobid_t ns_base_get_jobid(const ompi_process_name_t* name) { if (NULL == name) { /* got an error */ - return(OMPI_NAME_SERVICE_MAX); + return(MCA_NS_BASE_JOBID_MAX); } return(name->jobid); @@ -137,7 +196,7 @@ mca_ns_base_jobid_t ns_base_get_jobid(const ompi_process_name_t* name) mca_ns_base_cellid_t ns_base_get_cellid(const ompi_process_name_t* name) { if (NULL == name) { /* got an error */ - return(OMPI_NAME_SERVICE_MAX); + return(MCA_NS_BASE_CELLID_MAX); } return(name->cellid); diff --git a/src/mca/ns/ns.h b/src/mca/ns/ns.h index 8b69c69907..fd15b6f665 100644 --- a/src/mca/ns/ns.h +++ b/src/mca/ns/ns.h @@ -39,7 +39,9 @@ /* * define maximum value for id's in any field */ -#define OMPI_NAME_SERVICE_MAX UINT32_MAX +#define MCA_NS_BASE_CELLID_MAX UINT32_MAX +#define MCA_NS_BASE_JOBID_MAX UINT32_MAX +#define MCA_NS_BASE_VPID_MAX UINT32_MAX /* * general typedefs & structures @@ -90,14 +92,16 @@ typedef struct ompi_ns_msg_buffer_t ompi_ns_msg_buffer_t; * Create a new cell id. * The create_cellid() function allocates a new cell id for use by the caller. * The function checks to find the next available cell id, reserves it, and returns that - * number. No memory for names is allocated by this process. + * number. No memory for names is allocated by this process. The range of answers is from + * 1 to MCA_NS_BASE_CELLID_MAX-1 (zero is reserved for the seed name and cannot therefore be + * allocated). * * @param None - * @retval cellid The ompi_process_id_t value of the allocated cell id. There currently - * is no error indication that a cell id could not be allocated - this represents a very unlikely + * @retval cellid The numerical value of the allocated cell id. A value of + * MCA_NS_BASE_CELLID_MAX indicates + * that an error occurred - this represents a very unlikely * event meaning that the system ran out of cell id's. This probably indicates * an error in the calling program as the number of available cell id's is extremely large. - * Some means of returning a value indicative of an error will be devised in the future. * * @code * new_cellid = ompi_name_server.create_cellid() @@ -109,18 +113,21 @@ typedef mca_ns_base_cellid_t (*mca_ns_base_module_create_cellid_fn_t)(void); * Create a new job id. * The create_jobid() function allocates a new job id for use by the caller. * The function checks to find the next available job id, reserves it, and returns that - * number. No memory for names is allocated by this process. + * number. No memory for names is allocated by this process. The range of answers is from + * 1 to MCA_NS_BASE_JOBID_MAX-1 (zero is reserved for the seed name and cannot therefore be + * allocated). + * * The 0 job id is reserved for daemons within the system and will not be allocated. * Developers should therefore assume that the daemon job id is automatically allocated * and proceed to request names against it. * * @param None - * @retval jobid The ompi_process_id_t value of the allocated job id. There currently - * is no error indication that a job id could not be allocated - this represents a very unlikely + * @retval jobid The numerical value of the allocated job id. A value of + * MCA_NS_BASE_JOBID_MAX indicates + * that an error occurred - this represents a very unlikely * event meaning that the system ran out of job id's. This probably indicates * an error in the calling program as the number of available job id's is extremely large. - * Some means of returning a value indicative of an error will be devised in the future. * * @code * new_jobid = ompi_name_server.create_jobid() @@ -155,6 +162,25 @@ typedef mca_ns_base_jobid_t (*mca_ns_base_module_create_jobid_fn_t)(void); typedef ompi_process_name_t* (*mca_ns_base_module_create_proc_name_fn_t)(mca_ns_base_cellid_t cell, mca_ns_base_jobid_t job, mca_ns_base_vpid_t vpid); +/** + * Convert a string representation to a process name. + * The convert_string_to_process_name() function converts a string representation of a process + * name into an Open MPI name structure. The string must be of the proper form - i.e., it + * must be in the form "cellid.jobid.vpid", where each field is expressed in hexadecimal form. + * + * @param *name_string A character string representation of a process name. + * + * @retval *name Pointer to an ompi_process_name_t structure containing the name. + * @retval NULL Indicates an error, probably due to inability to allocate memory for + * the name structure. + * + * @code + * name = ompi_name_server.convert_string_to_process_name(name_string); + * @endcode + */ +typedef ompi_process_name_t* (*mca_ns_base_module_convert_string_to_process_name_fn_t)(const char* name); + + /** * Reserve a range of process id's. * The reserve_range() function reserves a range of vpid's for the given jobid. @@ -166,9 +192,8 @@ typedef ompi_process_name_t* (*mca_ns_base_module_create_proc_name_fn_t)(mca_ns_ * next available process id and assign range-number of sequential id's to the caller. * These id's will be reserved - i.e., they cannot be assigned to any subsequent caller. * - * @retval startid The starting value of the reserved range of vpid's. At this time, - * no means for returning an error condition is available. This will be rectified in the - * near future. + * @retval startid The starting value of the reserved range of vpid's. A value of MCA_NS_BASE_VPID_MAX + * indicates that an error occurred. * * @code * starting_procid = ompi_name_server.reserve_range(jobid, range) @@ -290,15 +315,15 @@ typedef char* (*mca_ns_base_module_get_jobid_string_fn_t)(const ompi_process_nam typedef char* (*mca_ns_base_module_get_cellid_string_fn_t)(const ompi_process_name_t *name); /** - * Get the virtual process id as an ompi_process_id_t value. - * The get_vpid() function returns the vpid in an ompi_process_id_t representation - + * Get the virtual process id as a numeric value. + * The get_vpid() function returns the vpid in a numeric representation - * i.e., in an integer form. * * @param *name A pointer to the name structure containing the name. * - * @retval vpid The vpid field of the 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. + * @retval vpid The vpid field of the provided name. + * @retval MCA_NS_BASE_VPID_MAX Indicates that an error occurred - in this case, that + * the name variable provided was NULL. * * @code * vpid = ompi_name_server.get_vpid(&name) @@ -307,15 +332,15 @@ typedef char* (*mca_ns_base_module_get_cellid_string_fn_t)(const ompi_process_na typedef mca_ns_base_vpid_t (*mca_ns_base_module_get_vpid_fn_t)(const ompi_process_name_t *name); /** - * Get the job id as an ompi_process_id_t value. - * The get_jobid() function returns the job id in an ompi_process_id_t representation - + * Get the job id as a numeric value. + * The get_jobid() function returns the job id in a numeric representation - * i.e., in an integer form. * * @param *name A pointer to the name structure containing the name. * - * @retval jobid The job id field of the 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. + * @retval jobid The job id field of the provided name. + * @retval MCA_NS_BASE_JOBID_MAX Indicates that an error occurred - in this case, that + * the name variable provided was NULL. * * @code * jobid = ompi_name_server.get_jobid(&name) @@ -324,15 +349,15 @@ typedef mca_ns_base_vpid_t (*mca_ns_base_module_get_vpid_fn_t)(const ompi_proces typedef mca_ns_base_jobid_t (*mca_ns_base_module_get_jobid_fn_t)(const ompi_process_name_t *name); /** - * Get the cell id as an ompi_process_id_t value. - * The get_cellid() function returns the cell id in an ompi_process_id_t representation - + * Get the cell id as a numberic value. + * The get_cellid() function returns the cell id in a numeric representation - * i.e., in an integer form. * * @param *name A pointer to the name structure containing the name. * - * @retval cellid The cell id field of the 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. + * @retval cellid The cell id field of the provided name. + * @retval MCA_NS_BASE_CELLID_MAX Indicates that an error occurred - in this case, that + * the name variable provided was NULL. * * @code * cellid = ompi_name_server.get_cellid(&name) @@ -378,6 +403,7 @@ struct mca_ns_base_module_1_0_0_t { mca_ns_base_module_create_cellid_fn_t create_cellid; mca_ns_base_module_create_jobid_fn_t create_jobid; mca_ns_base_module_create_proc_name_fn_t create_process_name; + mca_ns_base_module_convert_string_to_process_name_fn_t convert_string_to_process_name; mca_ns_base_module_reserve_range_fn_t reserve_range; mca_ns_base_module_free_name_fn_t free_name; mca_ns_base_module_get_proc_name_string_fn_t get_proc_name_string; diff --git a/src/mca/ns/replica/src/ns_replica.c b/src/mca/ns/replica/src/ns_replica.c index f18b306254..89b1c6832c 100644 --- a/src/mca/ns/replica/src/ns_replica.c +++ b/src/mca/ns/replica/src/ns_replica.c @@ -22,11 +22,11 @@ mca_ns_base_cellid_t ns_replica_create_cellid(void) { - if ((OMPI_NAME_SERVICE_MAX-1) >= mca_ns_replica_last_used_cellid) { + if ((MCA_NS_BASE_CELLID_MAX-2) >= mca_ns_replica_last_used_cellid) { mca_ns_replica_last_used_cellid = mca_ns_replica_last_used_cellid + 1; return(mca_ns_replica_last_used_cellid); } else { - return(0); + return MCA_NS_BASE_CELLID_MAX; } } @@ -34,7 +34,7 @@ mca_ns_base_jobid_t ns_replica_create_jobid(void) { mca_ns_replica_name_tracker_t *new; - if ((OMPI_NAME_SERVICE_MAX-1) >= mca_ns_replica_last_used_jobid) { + if ((MCA_NS_BASE_JOBID_MAX-2) >= mca_ns_replica_last_used_jobid) { mca_ns_replica_last_used_jobid = mca_ns_replica_last_used_jobid + 1; new = OBJ_NEW(mca_ns_replica_name_tracker_t); new->job = mca_ns_replica_last_used_jobid; @@ -42,7 +42,7 @@ mca_ns_base_jobid_t ns_replica_create_jobid(void) ompi_list_append(&mca_ns_replica_name_tracker, &new->item); return(mca_ns_replica_last_used_jobid); } else { - return(0); + return MCA_NS_BASE_JOBID_MAX; } } @@ -56,14 +56,14 @@ mca_ns_base_vpid_t ns_replica_reserve_range(mca_ns_base_jobid_t job, mca_ns_base ptr != (mca_ns_replica_name_tracker_t*)ompi_list_get_end(&mca_ns_replica_name_tracker); ptr = (mca_ns_replica_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 */ + if ((MCA_NS_BASE_VPID_MAX-range-2) >= 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); + return MCA_NS_BASE_VPID_MAX; } diff --git a/src/mca/ns/replica/src/ns_replica.h b/src/mca/ns/replica/src/ns_replica.h index c26fa8c78f..fa193c367e 100644 --- a/src/mca/ns/replica/src/ns_replica.h +++ b/src/mca/ns/replica/src/ns_replica.h @@ -6,6 +6,7 @@ #ifndef NS_REPLICA_H #define NS_REPLICA_H +#include #include "ompi_config.h" #include "include/types.h" @@ -34,6 +35,7 @@ OBJ_CLASS_DECLARATION(mca_ns_replica_name_tracker_t); extern mca_ns_base_cellid_t mca_ns_replica_last_used_cellid; extern mca_ns_base_jobid_t mca_ns_replica_last_used_jobid; extern ompi_list_t mca_ns_replica_name_tracker; +extern pthread_t *mca_ns_replica_thread; /* * Module open / close @@ -51,11 +53,10 @@ int mca_ns_replica_finalize(void); /* * oob interface */ +/* +void *mca_ns_replica_recv_thread(void*); -mca_oob_callback_fn_t mca_ns_replica_recv(int status, const ompi_process_name_t *sender, - const struct iovec *msg, size_t count, - void *cbdata); - +*/ /* * Implementation of create_cellid(). */ diff --git a/src/mca/ns/replica/src/ns_replica_component.c b/src/mca/ns/replica/src/ns_replica_component.c index 3793e1b0ef..e126925be2 100644 --- a/src/mca/ns/replica/src/ns_replica_component.c +++ b/src/mca/ns/replica/src/ns_replica_component.c @@ -54,6 +54,7 @@ static mca_ns_base_module_t mca_ns_replica = { ns_replica_create_cellid, ns_replica_create_jobid, ns_base_create_process_name, + ns_base_convert_string_to_process_name, ns_replica_reserve_range, ns_replica_free_name, ns_base_get_proc_name_string, @@ -167,7 +168,7 @@ int mca_ns_replica_finalize(void) return OMPI_SUCCESS; } - +/* mca_oob_callback_fn_t mca_ns_replica_recv(int status, const ompi_process_name_t *sender, const struct iovec *msg, size_t count, void *cbdata) @@ -177,9 +178,9 @@ mca_oob_callback_fn_t mca_ns_replica_recv(int status, const ompi_process_name_t struct iovec reply; int i; - for (i=0; iiov_base; - if (OMPI_NS_CREATE_CELLID == cmd->command) { /* got create_cellid command */ + if (OMPI_NS_CREATE_CELLID == cmd->command) { got create_cellid command tmp1 = ompi_name_server.create_cellid(); answer.command = cmd->command; answer.buflen = sizeof(tmp1); @@ -192,3 +193,4 @@ mca_oob_callback_fn_t mca_ns_replica_recv(int status, const ompi_process_name_t } return OMPI_SUCCESS; } +*/