All other layers to register their own print-attribute functions so we can maintain pretty-print capabilities as the attributes are extended.
Этот коммит содержится в:
родитель
37593b232d
Коммит
bb91517349
@ -19,13 +19,26 @@
|
||||
|
||||
#include "orte/util/attr.h"
|
||||
|
||||
#define MAX_CONVERTERS 5
|
||||
#define MAX_CONVERTER_PROJECT_LEN 10
|
||||
|
||||
typedef struct {
|
||||
int init;
|
||||
char project[MAX_CONVERTER_PROJECT_LEN];
|
||||
orte_attribute_key_t key_base;
|
||||
orte_attribute_key_t key_max;
|
||||
orte_attr2str_fn_t converter;
|
||||
} orte_attr_converter_t;
|
||||
|
||||
/* all default to NULL */
|
||||
static orte_attr_converter_t converters[MAX_CONVERTERS];
|
||||
|
||||
static int orte_attr_unload(orte_attribute_t *kv,
|
||||
void **data, opal_data_type_t type);
|
||||
|
||||
static int orte_attr_load(orte_attribute_t *kv,
|
||||
void *data, opal_data_type_t type);
|
||||
|
||||
|
||||
bool orte_get_attribute(opal_list_t *attributes,
|
||||
orte_attribute_key_t key,
|
||||
void **data, opal_data_type_t type)
|
||||
@ -94,8 +107,35 @@ void orte_remove_attribute(opal_list_t *attributes, orte_attribute_key_t key)
|
||||
}
|
||||
}
|
||||
|
||||
int orte_attr_register(const char *project,
|
||||
orte_attribute_key_t key_base,
|
||||
orte_attribute_key_t key_max,
|
||||
orte_attr2str_fn_t converter)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < MAX_CONVERTERS ; ++i) {
|
||||
if (0 == converters[i].init) {
|
||||
converters[i].init = 1;
|
||||
strncpy(converters[i].project, project, MAX_CONVERTER_PROJECT_LEN);
|
||||
converters[i].project[MAX_CONVERTER_PROJECT_LEN-1] = '\0';
|
||||
converters[i].key_base = key_base;
|
||||
converters[i].key_max = key_max;
|
||||
converters[i].converter = converter;
|
||||
return ORTE_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return ORTE_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
const char *orte_attr_key_to_str(orte_attribute_key_t key)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (ORTE_ATTR_KEY_BASE < key &&
|
||||
key < ORTE_ATTR_KEY_MAX) {
|
||||
/* belongs to ORTE, so we handle it */
|
||||
switch(key) {
|
||||
case ORTE_APP_HOSTFILE:
|
||||
return "APP-HOSTFILE";
|
||||
@ -240,6 +280,20 @@ const char *orte_attr_key_to_str(orte_attribute_key_t key)
|
||||
}
|
||||
}
|
||||
|
||||
/* see if one of the converters can handle it */
|
||||
for (i = 0 ; i < MAX_CONVERTERS ; ++i) {
|
||||
if (0 != converters[i].init) {
|
||||
if (converters[i].key_base < key &&
|
||||
key < converters[i].key_max) {
|
||||
return converters[i].converter(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* get here if nobody know what to do */
|
||||
return "UNKNOWN-KEY";
|
||||
}
|
||||
|
||||
|
||||
static int orte_attr_load(orte_attribute_t *kv,
|
||||
void *data, opal_data_type_t type)
|
||||
|
@ -19,6 +19,9 @@
|
||||
#define ORTE_ATTR_LOCAL true // for local use only
|
||||
#define ORTE_ATTR_GLOBAL false // include when sending this object
|
||||
|
||||
/* define the mininum value of the ORTE keys just in
|
||||
* case someone someday puts a layer underneath us */
|
||||
#define ORTE_ATTR_KEY_BASE 0
|
||||
|
||||
/*** ATTRIBUTE FLAGS - never sent anywwhere ***/
|
||||
typedef uint8_t orte_app_context_flags_t;
|
||||
@ -160,7 +163,7 @@ typedef uint16_t orte_proc_flags_t;
|
||||
|
||||
#define ORTE_PROC_MAX_KEY 400
|
||||
|
||||
#define ORTE_MAX_ATTR_KEY 1000
|
||||
#define ORTE_ATTR_KEY_MAX 1000
|
||||
|
||||
|
||||
/*** FLAG OPS ***/
|
||||
@ -181,5 +184,16 @@ ORTE_DECLSPEC int orte_set_attribute(opal_list_t *attributes, orte_attribute_key
|
||||
/* Remove the named attribute from a list */
|
||||
ORTE_DECLSPEC void orte_remove_attribute(opal_list_t *attributes, orte_attribute_key_t key);
|
||||
|
||||
/*
|
||||
* Register a handler for converting attr keys to strings
|
||||
*
|
||||
* Handlers will be invoked by orte_attr_key_to_str to return the appropriate value.
|
||||
*/
|
||||
typedef char* (*orte_attr2str_fn_t)(int key);
|
||||
|
||||
ORTE_DECLSPEC int orte_attr_register(const char *project,
|
||||
orte_attribute_key_t key_base,
|
||||
orte_attribute_key_t key_max,
|
||||
orte_attr2str_fn_t converter);
|
||||
|
||||
#endif
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user