static int store_pointer(const orte_process_name_t *proc, opal_value_t *kv) { int i; job_data_t *jtable, *jtab; proc_data_t *proc_data; opal_value_t *k2; OPAL_OUTPUT_VERBOSE((5, orte_db_base.output, "%s db:hash:store: storing pointer of key %s for proc %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), kv->key, ORTE_NAME_PRINT(proc))); /* get the job data object for this proc */ jtable = NULL; for (i=0; i < job_data.size; i++) { if (NULL == (jtab = (job_data_t*)opal_pointer_array_get_item(&job_data, i))) { continue; } if (jtab->jobid == proc->jobid) { jtable = jtab; break; } } if (NULL == jtable) { /* need to add an entry for this job */ jtable = OBJ_NEW(job_data_t); jtable->jobid = proc->jobid; opal_pointer_array_add(&job_data, jtable); } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_orte_proc(jtable->data, proc->vpid))) { /* unrecoverable error */ return ORTE_ERR_OUT_OF_RESOURCE; } /* see if we already have this key in the data - means we are updating * a pre-existing value */ if (NULL != (k2 = lookup_keyval(proc_data, kv->key))) { opal_list_remove_item(&proc_data->data, &k2->super); OBJ_RELEASE(k2); } opal_list_append(&proc_data->data, &kv->super); return ORTE_SUCCESS; }
static int store_pointer(const opal_identifier_t *uid, opal_value_t *kv) { proc_data_t *proc_data; opal_value_t *k2; opal_identifier_t id; /* data must have an assigned scope */ if (OPAL_SCOPE_UNDEF == kv->scope) { return OPAL_ERR_BAD_PARAM; } /* to protect alignment, copy the data across */ memcpy(&id, uid, sizeof(opal_identifier_t)); /* we are at the bottom of the store priorities, so * if this fell to us, we store it */ opal_output_verbose(1, opal_db_base_framework.framework_output, "db:hash:store storing data for proc %" PRIu64 " for scope %d", id, (int)kv->scope); /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_opal_proc(&hash_data, id))) { /* unrecoverable error */ OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:store: storing key %s[%s] for proc %" PRIu64 " unrecoverably failed", kv->key, opal_dss.lookup_data_type(kv->type), id)); return OPAL_ERR_OUT_OF_RESOURCE; } /* see if we already have this key in the data - means we are updating * a pre-existing value */ k2 = lookup_keyval(proc_data, kv->key); OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:store: %s pointer of key %s[%s] for proc %" PRIu64 "", (NULL == k2 ? "storing" : "updating"), kv->key, opal_dss.lookup_data_type(kv->type), id)); if (NULL != k2) { opal_list_remove_item(&proc_data->data, &k2->super); OBJ_RELEASE(k2); } kv->scope |= OPAL_SCOPE_REFER; // mark that this value was stored by reference and doesn't belong to us opal_list_append(&proc_data->data, &kv->super); return OPAL_SUCCESS; }
static int fetch_pointer(const opal_identifier_t *uid, const char *key, void **data, opal_data_type_t type) { proc_data_t *proc_data; opal_value_t *kv; opal_identifier_t id; /* to protect alignment, copy the data across */ memcpy(&id, uid, sizeof(opal_identifier_t)); OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:fetch_pointer: searching for key %s on proc %" PRIu64 "", (NULL == key) ? "NULL" : key, id)); /* if the key is NULL, that is an error */ if (NULL == key) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_opal_proc(&hash_data, id))) { /* look elsewhere */ return OPAL_ERR_TAKE_NEXT_OPTION; } /* find the value */ if (NULL == (kv = lookup_keyval(proc_data, key))) { /* let them look globally for it */ return OPAL_ERR_TAKE_NEXT_OPTION; } switch (type) { case OPAL_STRING: if (OPAL_STRING != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = kv->data.string; break; case OPAL_UINT64: if (OPAL_UINT64 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.uint64; break; case OPAL_UINT32: if (OPAL_UINT32 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.uint32; break; case OPAL_UINT16: if (OPAL_UINT16 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.uint16; break; case OPAL_INT: if (OPAL_INT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.integer; break; case OPAL_UINT: if (OPAL_UINT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.uint; break; case OPAL_BYTE_OBJECT: if (OPAL_BYTE_OBJECT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.bo; break; case OPAL_FLOAT: if (OPAL_FLOAT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } *data = &kv->data.fval; break; default: OPAL_ERROR_LOG(OPAL_ERR_NOT_SUPPORTED); return OPAL_ERR_NOT_SUPPORTED; } return OPAL_SUCCESS; }
static int fetch(const opal_identifier_t *uid, const char *key, void **data, opal_data_type_t type) { proc_data_t *proc_data; opal_value_t *kv; opal_byte_object_t *boptr; opal_identifier_t id; /* to protect alignment, copy the data across */ memcpy(&id, uid, sizeof(opal_identifier_t)); OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:fetch: searching for key %s[%s] on proc %" PRIu64 "", (NULL == key) ? "NULL" : key, opal_dss.lookup_data_type(type), id)); /* if the key is NULL, that is an error */ if (NULL == key) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_opal_proc(&hash_data, id))) { /* maybe they can find it elsewhere */ OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db_hash:fetch data for proc %" PRIu64 " not found", id)); return OPAL_ERR_TAKE_NEXT_OPTION; } /* find the value */ if (NULL == (kv = lookup_keyval(proc_data, key))) { /* let them look globally for it */ OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db_hash:fetch key %s for proc %" PRIu64 " not found", (NULL == key) ? "NULL" : key, id)); return OPAL_ERR_TAKE_NEXT_OPTION; } /* do the copy and check the type */ switch (type) { case OPAL_STRING: if (OPAL_STRING != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } if (NULL != kv->data.string) { *data = strdup(kv->data.string); } else { *data = NULL; } break; case OPAL_UINT64: if (OPAL_UINT64 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint64, 8); break; case OPAL_UINT32: if (OPAL_UINT32 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint32, 4); break; case OPAL_UINT16: if (OPAL_UINT16 != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint16, 2); break; case OPAL_INT: if (OPAL_INT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.integer, sizeof(int)); break; case OPAL_UINT: if (OPAL_UINT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint, sizeof(unsigned int)); break; case OPAL_FLOAT: if (OPAL_FLOAT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.fval, sizeof(float)); break; case OPAL_BYTE_OBJECT: if (OPAL_BYTE_OBJECT != kv->type) { return OPAL_ERR_TYPE_MISMATCH; } boptr = (opal_byte_object_t*)malloc(sizeof(opal_byte_object_t)); if (NULL != kv->data.bo.bytes && 0 < kv->data.bo.size) { boptr->bytes = (uint8_t *) malloc(kv->data.bo.size); memcpy(boptr->bytes, kv->data.bo.bytes, kv->data.bo.size); boptr->size = kv->data.bo.size; } else { boptr->bytes = NULL; boptr->size = 0; } *data = boptr; break; default: OPAL_ERROR_LOG(OPAL_ERR_NOT_SUPPORTED); return OPAL_ERR_NOT_SUPPORTED; } return OPAL_SUCCESS; }
static int store(const opal_identifier_t *uid, opal_scope_t scope, const char *key, const void *data, opal_data_type_t type) { proc_data_t *proc_data; opal_value_t *kv; opal_byte_object_t *boptr; opal_identifier_t id; /* data must have an assigned scope */ if (OPAL_SCOPE_UNDEF == scope) { return OPAL_ERR_BAD_PARAM; } /* to protect alignment, copy the data across */ memcpy(&id, uid, sizeof(opal_identifier_t)); /* we are at the bottom of the store priorities, so * if this fell to us, we store it */ opal_output_verbose(1, opal_db_base_framework.framework_output, "db:hash:store storing data for proc %" PRIu64 " for scope %d", id, (int)scope); /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_opal_proc(&hash_data, id))) { /* unrecoverable error */ OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:store: storing key %s[%s] for proc %" PRIu64 " unrecoverably failed", key, opal_dss.lookup_data_type(type), id)); return OPAL_ERR_OUT_OF_RESOURCE; } /* see if we already have this key in the data - means we are updating * a pre-existing value */ kv = lookup_keyval(proc_data, key); OPAL_OUTPUT_VERBOSE((5, opal_db_base_framework.framework_output, "db:hash:store: %s key %s[%s] for proc %" PRIu64 "", (NULL == kv ? "storing" : "updating"), key, opal_dss.lookup_data_type(type), id)); if (NULL != kv) { opal_list_remove_item(&proc_data->data, &kv->super); OBJ_RELEASE(kv); } kv = OBJ_NEW(opal_value_t); kv->key = strdup(key); kv->scope = scope; opal_list_append(&proc_data->data, &kv->super); /* the type could come in as an OPAL one (e.g., OPAL_VPID). Since * the value is an OPAL definition, it cannot cover OPAL data * types, so convert to the underlying OPAL type */ switch (type) { case OPAL_STRING: kv->type = OPAL_STRING; if (NULL != data) { kv->data.string = strdup( (const char *) data); } else { kv->data.string = NULL; } break; case OPAL_UINT64: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_UINT64; kv->data.uint64 = *(uint64_t*)(data); break; case OPAL_UINT32: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_UINT32; kv->data.uint32 = *(uint32_t*)data; break; case OPAL_UINT16: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_UINT16; kv->data.uint16 = *(uint16_t*)(data); break; case OPAL_INT: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_INT; kv->data.integer = *(int*)(data); break; case OPAL_UINT: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_UINT; kv->data.uint = *(unsigned int*)(data); break; case OPAL_FLOAT: if (NULL == data) { OPAL_ERROR_LOG(OPAL_ERR_BAD_PARAM); return OPAL_ERR_BAD_PARAM; } kv->type = OPAL_FLOAT; kv->data.fval = *(float*)(data); break; case OPAL_BYTE_OBJECT: kv->type = OPAL_BYTE_OBJECT; boptr = (opal_byte_object_t*)data; if (NULL != boptr && NULL != boptr->bytes && 0 < boptr->size) { kv->data.bo.bytes = (uint8_t *) malloc(boptr->size); memcpy(kv->data.bo.bytes, boptr->bytes, boptr->size); kv->data.bo.size = boptr->size; } else { kv->data.bo.bytes = NULL; kv->data.bo.size = 0; } break; default: OPAL_ERROR_LOG(OPAL_ERR_NOT_SUPPORTED); return OPAL_ERR_NOT_SUPPORTED; } return OPAL_SUCCESS; }
static int fetch_pointer(const orte_process_name_t *proc, const char *key, void **data, opal_data_type_t type) { int i; job_data_t *jtable, *jtab; proc_data_t *proc_data; opal_value_t *kv; OPAL_OUTPUT_VERBOSE((5, orte_db_base.output, "%s db:hash:fetch_pointer: searching for key %s on proc %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (NULL == key) ? "NULL" : key, ORTE_NAME_PRINT(proc))); /* if the key is NULL, that is an error */ if (NULL == key) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); return ORTE_ERR_BAD_PARAM; } /* get the job data object for this proc */ jtable = NULL; for (i=0; i < job_data.size; i++) { if (NULL == (jtab = (job_data_t*)opal_pointer_array_get_item(&job_data, i))) { continue; } if (jtab->jobid == proc->jobid) { jtable = jtab; break; } } if (NULL == jtable) { /* eventually, we will fetch this data - but for now, this * is simply an error */ return ORTE_ERR_NOT_FOUND; } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_orte_proc(jtable->data, proc->vpid))) { /* unrecoverable error */ return ORTE_ERR_OUT_OF_RESOURCE; } /* find the value */ if (NULL == (kv = lookup_keyval(proc_data, key))) { /* again, we eventually will attempt to fetch the data - for * now, just report it as an error */ return ORTE_ERR_NOT_FOUND; } switch (type) { case OPAL_STRING: if (OPAL_STRING != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = kv->data.string; break; case ORTE_VPID: case OPAL_UINT32: if (OPAL_UINT32 != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = &kv->data.uint32; break; case OPAL_UINT16: if (OPAL_UINT16 != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = &kv->data.uint16; break; case OPAL_INT: if (OPAL_INT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = &kv->data.integer; break; case OPAL_UINT: if (OPAL_UINT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = &kv->data.uint; break; case OPAL_BYTE_OBJECT: if (OPAL_BYTE_OBJECT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = &kv->data.bo; break; default: ORTE_ERROR_LOG(ORTE_ERR_NOT_SUPPORTED); return ORTE_ERR_NOT_SUPPORTED; } return ORTE_SUCCESS; }
static int store(const orte_process_name_t *proc, const char *key, const void *data, opal_data_type_t type) { int i; job_data_t *jtable, *jtab; proc_data_t *proc_data; opal_value_t *kv; opal_byte_object_t *boptr; OPAL_OUTPUT_VERBOSE((5, orte_db_base.output, "%s db:hash:store: storing key %s data type %d for proc %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), key, (int)type, ORTE_NAME_PRINT(proc))); /* get the job data object for this proc */ jtable = NULL; for (i=0; i < job_data.size; i++) { if (NULL == (jtab = (job_data_t*)opal_pointer_array_get_item(&job_data, i))) { continue; } if (jtab->jobid == proc->jobid) { jtable = jtab; break; } } if (NULL == jtable) { /* need to add an entry for this job */ jtable = OBJ_NEW(job_data_t); jtable->jobid = proc->jobid; opal_pointer_array_add(&job_data, jtable); } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_orte_proc(jtable->data, proc->vpid))) { /* unrecoverable error */ return ORTE_ERR_OUT_OF_RESOURCE; } /* see if we already have this key in the data - means we are updating * a pre-existing value */ if (NULL != (kv = lookup_keyval(proc_data, key))) { opal_list_remove_item(&proc_data->data, &kv->super); OBJ_RELEASE(kv); } kv = OBJ_NEW(opal_value_t); kv->key = strdup(key); opal_list_append(&proc_data->data, &kv->super); /* the type could come in as an ORTE one (e.g., ORTE_VPID). Since * the value is an OPAL definition, it cannot cover ORTE data * types, so convert to the underlying OPAL type */ switch (type) { case OPAL_STRING: kv->type = OPAL_STRING; kv->data.string = strdup( (const char *) data); break; case ORTE_VPID: case OPAL_UINT32: kv->type = OPAL_UINT32; kv->data.uint32 = *(uint32_t*)data; break; case OPAL_UINT16: kv->type = OPAL_UINT16; kv->data.uint16 = *(uint16_t*)(data); break; case OPAL_INT: kv->type = OPAL_INT; kv->data.integer = *(int*)(data); break; case OPAL_UINT: kv->type = OPAL_UINT; kv->data.uint = *(unsigned int*)(data); break; case OPAL_BYTE_OBJECT: kv->type = OPAL_BYTE_OBJECT; boptr = (opal_byte_object_t*)data; kv->data.bo.bytes = (uint8_t *) malloc(boptr->size); memcpy(kv->data.bo.bytes, boptr->bytes, boptr->size); kv->data.bo.size = boptr->size; break; default: ORTE_ERROR_LOG(ORTE_ERR_NOT_SUPPORTED); return ORTE_ERR_NOT_SUPPORTED; } return ORTE_SUCCESS; }
static int store(const gds_identifier_t *uid, gds_scope_t scope, const char *key, const void *data, gds_data_type_t type) { proc_data_t *proc_data; gds_value_t *kv; gds_byte_object_t *boptr; gds_identifier_t id; /* data must have an assigned scope */ if (GDS_SCOPE_UNDEF == scope) { return GDS_ERR_BAD_PARAM; } /* to protect alignment, copy the data across */ memcpy(&id, uid, sizeof(gds_identifier_t)); /* we are at the bottom of the store priorities, so * if this fell to us, we store it */ gds_output_verbose(1, gds_gdstor_base_framework.framework_output, "gdstor:hash:store storing data for proc %" PRIu64 " for scope %d", id, (int)scope); /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_gds_proc(&hash_data, id))) { /* unrecoverable error */ GDS_OUTPUT_VERBOSE((5, gds_gdstor_base_framework.framework_output, "gdstor:hash:store: storing key %s[%s] for proc %" PRIu64 " unrecoverably failed", key, gds_dss.lookup_data_type(type), id)); return GDS_ERR_OUT_OF_RESOURCE; } /* see if we already have this key in the data - means we are updating * a pre-existing value */ kv = lookup_keyval(proc_data, key); #if GDS_ENABLE_DEBUG char *_data_type = gds_dss.lookup_data_type(type); GDS_OUTPUT_VERBOSE((5, gds_gdstor_base_framework.framework_output, "gdstor:hash:store: %s key %s[%s] for proc %" PRIu64 "", (NULL == kv ? "storing" : "updating"), key, _data_type, id)); free (_data_type); #endif if (NULL != kv) { gds_list_remove_item(&proc_data->data, &kv->super); OBJ_RELEASE(kv); } kv = OBJ_NEW(gds_value_t); kv->key = strdup(key); kv->scope = scope; gds_list_append(&proc_data->data, &kv->super); /* the type could come in as an GDS one (e.g., GDS_VPID). Since * the value is an GDS definition, it cannot cover GDS data * types, so convert to the underlying GDS type */ switch (type) { case GDS_STRING: kv->type = GDS_STRING; if (NULL != data) { kv->data.string = strdup( (const char *) data); } else { kv->data.string = NULL; } break; case GDS_UINT64: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_UINT64; /* to avoid alignment issues */ memcpy(&kv->data.uint64, data, 8); break; case GDS_UINT32: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_UINT32; /* to avoid alignment issues */ memcpy(&kv->data.uint32, data, 4); break; case GDS_UINT16: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_UINT16; /* to avoid alignment issues */ memcpy(&kv->data.uint16, data, 2); break; case GDS_INT: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_INT; /* to avoid alignment issues */ memcpy(&kv->data.integer, data, sizeof(int)); break; case GDS_UINT: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_UINT; /* to avoid alignment issues */ memcpy(&kv->data.uint, data, sizeof(unsigned int)); break; case GDS_FLOAT: if (NULL == data) { GDS_ERROR_LOG(GDS_ERR_BAD_PARAM); return GDS_ERR_BAD_PARAM; } kv->type = GDS_FLOAT; memcpy(&kv->data.fval, data, sizeof(float)); break; case GDS_BYTE_OBJECT: kv->type = GDS_BYTE_OBJECT; boptr = (gds_byte_object_t*)data; if (NULL != boptr && NULL != boptr->bytes && 0 < boptr->size) { kv->data.bo.bytes = (uint8_t *) malloc(boptr->size); memcpy(kv->data.bo.bytes, boptr->bytes, boptr->size); kv->data.bo.size = boptr->size; } else { kv->data.bo.bytes = NULL; kv->data.bo.size = 0; } break; default: GDS_ERROR_LOG(GDS_ERR_NOT_SUPPORTED); return GDS_ERR_NOT_SUPPORTED; } return GDS_SUCCESS; }
static int fetch(const orte_process_name_t *proc, const char *key, void **data, opal_data_type_t type) { int i; job_data_t *jtable, *jtab; proc_data_t *proc_data; opal_value_t *kv; opal_byte_object_t *boptr; OPAL_OUTPUT_VERBOSE((5, orte_db_base.output, "%s db:hash:fetch: searching for key %s[%s] on proc %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), (NULL == key) ? "NULL" : key, opal_dss.lookup_data_type(type), ORTE_NAME_PRINT(proc))); /* if the key is NULL, that is an error */ if (NULL == key) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); return ORTE_ERR_BAD_PARAM; } /* get the job data object for this proc */ jtable = NULL; for (i=0; i < job_data.size; i++) { if (NULL == (jtab = (job_data_t*)opal_pointer_array_get_item(&job_data, i))) { continue; } if (jtab->jobid == proc->jobid) { jtable = jtab; break; } } if (NULL == jtable) { /* eventually, we will fetch this data - but for now, this * is simply an error */ return ORTE_ERR_NOT_FOUND; } /* lookup the proc data object for this proc */ if (NULL == (proc_data = lookup_orte_proc(jtable->data, proc->vpid))) { /* unrecoverable error */ return ORTE_ERR_OUT_OF_RESOURCE; } /* find the value */ if (NULL == (kv = lookup_keyval(proc_data, key))) { /* again, we eventually will attempt to fetch the data - for * now, just report it as an error */ return ORTE_ERR_NOT_FOUND; } /* do the copy and check the type */ switch (type) { case OPAL_STRING: if (OPAL_STRING != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } *data = strdup(kv->data.string); break; case ORTE_VPID: case OPAL_UINT32: if (OPAL_UINT32 != kv->type && ORTE_VPID != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint32, 4); break; case OPAL_UINT16: if (OPAL_UINT16 != kv->type && ORTE_NODE_RANK != kv->type && ORTE_LOCAL_RANK != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint16, 2); break; case OPAL_INT: if (OPAL_INT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.integer, sizeof(int)); break; case OPAL_UINT: if (OPAL_UINT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } memcpy(*data, &kv->data.uint, sizeof(unsigned int)); break; case OPAL_BYTE_OBJECT: if (OPAL_BYTE_OBJECT != kv->type) { return ORTE_ERR_TYPE_MISMATCH; } boptr = (opal_byte_object_t*)malloc(sizeof(opal_byte_object_t)); boptr->bytes = malloc(kv->data.bo.size); memcpy(boptr->bytes, kv->data.bo.bytes, kv->data.bo.size); boptr->size = kv->data.bo.size; *data = boptr; break; default: ORTE_ERROR_LOG(ORTE_ERR_NOT_SUPPORTED); return ORTE_ERR_NOT_SUPPORTED; } return ORTE_SUCCESS; }