/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #include "orte_config.h" #include "include/orte_constants.h" #include "opal/util/output.h" #include "mca/mca.h" #include "mca/base/base.h" #include "mca/pls/base/base.h" #include "mca/ns/ns.h" #include "mca/gpr/gpr.h" #include "mca/soh/soh_types.h" #include "mca/errmgr/errmgr.h" #include "mca/schema/schema.h" /** * Set the process pid in the job segment and indicate the state * as being launched. */ int orte_pls_base_set_proc_pid(const orte_process_name_t* name, pid_t pid) { orte_gpr_value_t* values[1]; orte_gpr_value_t value; orte_gpr_keyval_t kv_pid = {{OBJ_CLASS(orte_gpr_keyval_t),0},ORTE_PROC_PID_KEY,ORTE_PID}; orte_gpr_keyval_t kv_state = {{OBJ_CLASS(orte_gpr_keyval_t),0},ORTE_PROC_STATE_KEY,ORTE_PROC_STATE}; orte_gpr_keyval_t* keyvals[2]; size_t i; int rc; if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&value.segment, name->jobid))) { ORTE_ERROR_LOG(rc); return rc; } if(ORTE_SUCCESS != (rc = orte_schema.get_proc_tokens(&value.tokens, &value.num_tokens, (orte_process_name_t*)name))) { ORTE_ERROR_LOG(rc); free(value.segment); return rc; } kv_pid.value.pid = pid; kv_state.value.proc_state = ORTE_PROC_STATE_LAUNCHED; keyvals[0] = &kv_pid; keyvals[1] = &kv_state; value.keyvals = keyvals; value.cnt = 2; value.addr_mode = ORTE_GPR_OVERWRITE; values[0] = &value; rc = orte_gpr.put(1, values); if(ORTE_SUCCESS != rc) { ORTE_ERROR_LOG(rc); } free(value.segment); for(i=0; ijobid))) { ORTE_ERROR_LOG(rc); return rc; } if(ORTE_SUCCESS != (rc = orte_schema.get_proc_tokens(&tokens, &num_tokens, (orte_process_name_t*)name))) { free(segment); ORTE_ERROR_LOG(rc); return rc; } keys[0] = ORTE_PROC_PID_KEY; keys[1] = NULL; rc = orte_gpr.get( ORTE_GPR_KEYS_OR|ORTE_GPR_TOKENS_OR, segment, tokens, keys, &num_values, &values ); if(rc != ORTE_SUCCESS) { free(segment); return rc; } if(0 == num_values) { rc = ORTE_ERR_NOT_FOUND; ORTE_ERROR_LOG(rc); goto cleanup; } if(1 != num_values || values[0]->cnt != 1) { rc = ORTE_ERR_NOT_FOUND; ORTE_ERROR_LOG(rc); goto cleanup; } *pid = values[0]->keyvals[0]->value.pid; cleanup: if(NULL != values) { for(i=0; ikeyvals[0]->value.pid; } } *num_pids = num_values; if(NULL != values) { for(i=0; ikeyvals[0]->value.pid; } } *num_pids = num_values; cleanup: if(NULL != values) { for(i=0; i