diff --git a/orte/util/attr.c b/orte/util/attr.c index dc28a00a00..5d23d288ee 100644 --- a/orte/util/attr.c +++ b/orte/util/attr.c @@ -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,150 +107,191 @@ 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) { - switch(key) { - case ORTE_APP_HOSTFILE: - return "APP-HOSTFILE"; - case ORTE_APP_ADD_HOSTFILE: - return "APP-ADD-HOSTFILE"; - case ORTE_APP_DASH_HOST: - return "APP-DASH-HOST"; - case ORTE_APP_ADD_HOST: - return "APP-ADD-HOST"; - case ORTE_APP_USER_CWD: - return "APP-USER-CWD"; - case ORTE_APP_SSNDIR_CWD: - return "APP-USE-SESSION-DIR-AS-CWD"; - case ORTE_APP_PRELOAD_BIN: - return "APP-PRELOAD-BIN"; - case ORTE_APP_PRELOAD_FILES: - return "APP-PRELOAD-FILES"; - case ORTE_APP_SSTORE_LOAD: - return "APP-SSTORE-LOAD"; - case ORTE_APP_RECOV_DEF: - return "APP-RECOVERY-DEFINED"; - case ORTE_APP_MAX_RESTARTS: - return "APP-MAX-RESTARTS"; - case ORTE_APP_MIN_NODES: - return "APP-MIN-NODES"; - case ORTE_APP_MANDATORY: - return "APP-NODES-MANDATORY"; - case ORTE_APP_MAX_PPN: - return "APP-MAX-PPN"; - case ORTE_APP_PREFIX_DIR: - return "APP-PREFIX-DIR"; + 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"; + case ORTE_APP_ADD_HOSTFILE: + return "APP-ADD-HOSTFILE"; + case ORTE_APP_DASH_HOST: + return "APP-DASH-HOST"; + case ORTE_APP_ADD_HOST: + return "APP-ADD-HOST"; + case ORTE_APP_USER_CWD: + return "APP-USER-CWD"; + case ORTE_APP_SSNDIR_CWD: + return "APP-USE-SESSION-DIR-AS-CWD"; + case ORTE_APP_PRELOAD_BIN: + return "APP-PRELOAD-BIN"; + case ORTE_APP_PRELOAD_FILES: + return "APP-PRELOAD-FILES"; + case ORTE_APP_SSTORE_LOAD: + return "APP-SSTORE-LOAD"; + case ORTE_APP_RECOV_DEF: + return "APP-RECOVERY-DEFINED"; + case ORTE_APP_MAX_RESTARTS: + return "APP-MAX-RESTARTS"; + case ORTE_APP_MIN_NODES: + return "APP-MIN-NODES"; + case ORTE_APP_MANDATORY: + return "APP-NODES-MANDATORY"; + case ORTE_APP_MAX_PPN: + return "APP-MAX-PPN"; + case ORTE_APP_PREFIX_DIR: + return "APP-PREFIX-DIR"; - case ORTE_NODE_USERNAME: - return "NODE-USERNAME"; - case ORTE_NODE_LAUNCH_ID: - return "NODE-LAUNCHID"; - case ORTE_NODE_HOSTID: - return "NODE-HOSTID"; - case ORTE_NODE_ALIAS: - return "NODE-ALIAS"; - case ORTE_NODE_SERIAL_NUMBER: - return "NODE-SERIAL-NUM"; + case ORTE_NODE_USERNAME: + return "NODE-USERNAME"; + case ORTE_NODE_LAUNCH_ID: + return "NODE-LAUNCHID"; + case ORTE_NODE_HOSTID: + return "NODE-HOSTID"; + case ORTE_NODE_ALIAS: + return "NODE-ALIAS"; + case ORTE_NODE_SERIAL_NUMBER: + return "NODE-SERIAL-NUM"; - case ORTE_JOB_LAUNCH_MSG_SENT: - return "JOB-LAUNCH-MSG-SENT"; - case ORTE_JOB_LAUNCH_MSG_RECVD: - return "JOB-LAUNCH-MSG-RECVD"; - case ORTE_JOB_MAX_LAUNCH_MSG_RECVD: - return "JOB-MAX-LAUNCH-MSG-RECVD"; - case ORTE_JOB_FILE_MAPS: - return "JOB-FILE-MAPS"; - case ORTE_JOB_CKPT_STATE: - return "JOB-CKPT-STATE"; - case ORTE_JOB_SNAPSHOT_REF: - return "JOB-SNAPSHOT-REF"; - case ORTE_JOB_SNAPSHOT_LOC: - return "JOB-SNAPSHOT-LOC"; - case ORTE_JOB_SNAPC_INIT_BAR: - return "JOB-SNAPC-INIT-BARRIER-ID"; - case ORTE_JOB_SNAPC_FINI_BAR: - return "JOB-SNAPC-FINI-BARRIER-ID"; - case ORTE_JOB_NUM_NONZERO_EXIT: - return "JOB-NUM-NONZERO-EXIT"; - case ORTE_JOB_FAILURE_TIMER_EVENT: - return "JOB-FAILURE-TIMER-EVENT"; - case ORTE_JOB_ABORTED_PROC: - return "JOB-ABORTED-PROC"; - case ORTE_JOB_MAPPER: - return "JOB-MAPPER"; - case ORTE_JOB_REDUCER: - return "JOB-REDUCER"; - case ORTE_JOB_COMBINER: - return "JOB-COMBINER"; - case ORTE_JOB_INDEX_ARGV: - return "JOB-INDEX-ARGV"; - case ORTE_JOB_NO_VM: - return "JOB-NO-VM"; - case ORTE_JOB_SPIN_FOR_DEBUG: - return "JOB-SPIN-FOR-DEBUG"; - case ORTE_JOB_CONTINUOUS_OP: - return "JOB-CONTINUOUS-OP"; - case ORTE_JOB_RECOVER_DEFINED: - return "JOB-RECOVERY-DEFINED"; - case ORTE_JOB_ENABLE_RECOVERY: - return "JOB-ENABLE-RECOVERY"; - case ORTE_JOB_NON_ORTE_JOB: - return "JOB-NON-ORTE-JOB"; - case ORTE_JOB_STDOUT_TARGET: - return "JOB-STDOUT-TARGET"; - case ORTE_JOB_POWER: - return "JOB-POWER"; - case ORTE_JOB_MAX_FREQ: - return "JOB-MAX_FREQ"; - case ORTE_JOB_MIN_FREQ: - return "JOB-MIN_FREQ"; - case ORTE_JOB_GOVERNOR: - return "JOB-FREQ-GOVERNOR"; - case ORTE_JOB_FAIL_NOTIFIED: - return "JOB-FAIL-NOTIFIED"; - case ORTE_JOB_TERM_NOTIFIED: - return "JOB-TERM-NOTIFIED"; - case ORTE_JOB_PEER_MODX_ID: - return "JOB-PEER-MODX-ID"; - case ORTE_JOB_INIT_BAR_ID: - return "JOB-INIT-BAR-ID"; - case ORTE_JOB_FINI_BAR_ID: - return "JOB-FINI-BAR-ID"; - case ORTE_JOB_FWDIO_TO_TOOL: - return "JOB-FWD-IO-TO-TOOL"; + case ORTE_JOB_LAUNCH_MSG_SENT: + return "JOB-LAUNCH-MSG-SENT"; + case ORTE_JOB_LAUNCH_MSG_RECVD: + return "JOB-LAUNCH-MSG-RECVD"; + case ORTE_JOB_MAX_LAUNCH_MSG_RECVD: + return "JOB-MAX-LAUNCH-MSG-RECVD"; + case ORTE_JOB_FILE_MAPS: + return "JOB-FILE-MAPS"; + case ORTE_JOB_CKPT_STATE: + return "JOB-CKPT-STATE"; + case ORTE_JOB_SNAPSHOT_REF: + return "JOB-SNAPSHOT-REF"; + case ORTE_JOB_SNAPSHOT_LOC: + return "JOB-SNAPSHOT-LOC"; + case ORTE_JOB_SNAPC_INIT_BAR: + return "JOB-SNAPC-INIT-BARRIER-ID"; + case ORTE_JOB_SNAPC_FINI_BAR: + return "JOB-SNAPC-FINI-BARRIER-ID"; + case ORTE_JOB_NUM_NONZERO_EXIT: + return "JOB-NUM-NONZERO-EXIT"; + case ORTE_JOB_FAILURE_TIMER_EVENT: + return "JOB-FAILURE-TIMER-EVENT"; + case ORTE_JOB_ABORTED_PROC: + return "JOB-ABORTED-PROC"; + case ORTE_JOB_MAPPER: + return "JOB-MAPPER"; + case ORTE_JOB_REDUCER: + return "JOB-REDUCER"; + case ORTE_JOB_COMBINER: + return "JOB-COMBINER"; + case ORTE_JOB_INDEX_ARGV: + return "JOB-INDEX-ARGV"; + case ORTE_JOB_NO_VM: + return "JOB-NO-VM"; + case ORTE_JOB_SPIN_FOR_DEBUG: + return "JOB-SPIN-FOR-DEBUG"; + case ORTE_JOB_CONTINUOUS_OP: + return "JOB-CONTINUOUS-OP"; + case ORTE_JOB_RECOVER_DEFINED: + return "JOB-RECOVERY-DEFINED"; + case ORTE_JOB_ENABLE_RECOVERY: + return "JOB-ENABLE-RECOVERY"; + case ORTE_JOB_NON_ORTE_JOB: + return "JOB-NON-ORTE-JOB"; + case ORTE_JOB_STDOUT_TARGET: + return "JOB-STDOUT-TARGET"; + case ORTE_JOB_POWER: + return "JOB-POWER"; + case ORTE_JOB_MAX_FREQ: + return "JOB-MAX_FREQ"; + case ORTE_JOB_MIN_FREQ: + return "JOB-MIN_FREQ"; + case ORTE_JOB_GOVERNOR: + return "JOB-FREQ-GOVERNOR"; + case ORTE_JOB_FAIL_NOTIFIED: + return "JOB-FAIL-NOTIFIED"; + case ORTE_JOB_TERM_NOTIFIED: + return "JOB-TERM-NOTIFIED"; + case ORTE_JOB_PEER_MODX_ID: + return "JOB-PEER-MODX-ID"; + case ORTE_JOB_INIT_BAR_ID: + return "JOB-INIT-BAR-ID"; + case ORTE_JOB_FINI_BAR_ID: + return "JOB-FINI-BAR-ID"; + case ORTE_JOB_FWDIO_TO_TOOL: + return "JOB-FWD-IO-TO-TOOL"; - case ORTE_PROC_NOBARRIER: - return "PROC-NOBARRIER"; - case ORTE_PROC_CPU_BITMAP: - return "PROC-CPU-BITMAP"; - case ORTE_PROC_HWLOC_LOCALE: - return "PROC-HWLOC-LOCALE"; - case ORTE_PROC_HWLOC_BOUND: - return "PROC-HWLOC-BOUND"; - case ORTE_PROC_PRIOR_NODE: - return "PROC-PRIOR-NODE"; - case ORTE_PROC_NRESTARTS: - return "PROC-NUM-RESTARTS"; - case ORTE_PROC_RESTART_TIME: - return "PROC-RESTART-TIME"; - case ORTE_PROC_FAST_FAILS: - return "PROC-FAST-FAILS"; - case ORTE_PROC_CKPT_STATE: - return "PROC-CKPT-STATE"; - case ORTE_PROC_SNAPSHOT_REF: - return "PROC-SNAPHOT-REF"; - case ORTE_PROC_SNAPSHOT_LOC: - return "PROC-SNAPSHOT-LOC"; - case ORTE_PROC_NODENAME: - return "PROC-NODENAME"; - case ORTE_PROC_CGROUP: - return "PROC-CGROUP"; - case ORTE_PROC_NBEATS: - return "PROC-NBEATS"; + case ORTE_PROC_NOBARRIER: + return "PROC-NOBARRIER"; + case ORTE_PROC_CPU_BITMAP: + return "PROC-CPU-BITMAP"; + case ORTE_PROC_HWLOC_LOCALE: + return "PROC-HWLOC-LOCALE"; + case ORTE_PROC_HWLOC_BOUND: + return "PROC-HWLOC-BOUND"; + case ORTE_PROC_PRIOR_NODE: + return "PROC-PRIOR-NODE"; + case ORTE_PROC_NRESTARTS: + return "PROC-NUM-RESTARTS"; + case ORTE_PROC_RESTART_TIME: + return "PROC-RESTART-TIME"; + case ORTE_PROC_FAST_FAILS: + return "PROC-FAST-FAILS"; + case ORTE_PROC_CKPT_STATE: + return "PROC-CKPT-STATE"; + case ORTE_PROC_SNAPSHOT_REF: + return "PROC-SNAPHOT-REF"; + case ORTE_PROC_SNAPSHOT_LOC: + return "PROC-SNAPSHOT-LOC"; + case ORTE_PROC_NODENAME: + return "PROC-NODENAME"; + case ORTE_PROC_CGROUP: + return "PROC-CGROUP"; + case ORTE_PROC_NBEATS: + return "PROC-NBEATS"; - default: - return "UNKNOWN-KEY"; + default: + return "UNKNOWN-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"; } diff --git a/orte/util/attr.h b/orte/util/attr.h index 7f424d8141..1cb22c13f6 100644 --- a/orte/util/attr.h +++ b/orte/util/attr.h @@ -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