📄 ns_proxy_component.c
字号:
/* -*- C -*- * * 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$ *//** @file: * * The Open MPI Name Server * * The Open MPI Name Server provides unique name ranges for processes * within the universe. Each universe will have one name server * running within the seed daemon. This is done to prevent the * inadvertent duplication of names. *//* * includes */#include "orte_config.h"#include "orte/orte_constants.h"#include "orte/util/proc_info.h"#include "opal/util/output.h"#include "opal/mca/mca.h"#include "opal/mca/base/mca_base_param.h"#include "orte/mca/errmgr/errmgr.h"#include "orte/mca/rml/rml.h"#include "ns_proxy.h"/* * Struct of function pointers that need to be initialized */mca_ns_base_component_t mca_ns_proxy_component = { { MCA_NS_BASE_VERSION_2_0_0, "proxy", /* MCA module name */ ORTE_MAJOR_VERSION, /* MCA module major version */ ORTE_MINOR_VERSION, /* MCA module minor version */ ORTE_RELEASE_VERSION, /* MCA module release version */ orte_ns_proxy_open, /* module open */ orte_ns_proxy_close /* module close */ }, { false /* checkpoint / restart */ }, orte_ns_proxy_init, /* module init */ orte_ns_proxy_finalize /* module shutdown */};/* * setup the function pointers for the module */static mca_ns_base_module_t orte_ns_proxy_module = { /* init */ orte_ns_proxy_module_init, /* cell functions */ orte_ns_proxy_create_cellid, orte_ns_proxy_get_cell_info, orte_ns_base_get_cellid_string, orte_ns_base_convert_cellid_to_string, orte_ns_base_convert_string_to_cellid, /** node functions */ orte_ns_proxy_create_nodeids, orte_ns_proxy_get_node_info, orte_ns_base_convert_nodeid_to_string, orte_ns_base_convert_string_to_nodeid, /* jobid functions */ orte_ns_proxy_create_jobid, orte_ns_proxy_get_job_descendants, orte_ns_proxy_get_job_children, orte_ns_proxy_get_root_job, orte_ns_proxy_get_parent_job, orte_ns_base_get_jobid_string, orte_ns_base_convert_jobid_to_string, orte_ns_base_convert_string_to_jobid, orte_ns_proxy_reserve_range, /* vpid functions */ orte_ns_base_get_vpid_string, orte_ns_base_convert_vpid_to_string, orte_ns_base_convert_string_to_vpid, /* name functions */ orte_ns_base_create_process_name, orte_ns_proxy_create_my_name, orte_ns_base_convert_string_to_process_name, orte_ns_base_get_proc_name_string, orte_ns_base_compare_fields, /* peer functions */ orte_ns_proxy_get_peers, /* tag server functions */ orte_ns_proxy_assign_rml_tag, /* data type functions */ orte_ns_proxy_define_data_type, /* diagnostic functions */ orte_ns_proxy_dump_cells, orte_ns_proxy_dump_jobs, orte_ns_proxy_dump_tags, orte_ns_proxy_dump_datatypes};/* * Whether or not we allowed this component to be selected */static bool initialized = false;/* constructor - used to initialize state of taglist instance */static void orte_ns_proxy_tagitem_construct(orte_ns_proxy_tagitem_t* tagitem){ tagitem->tag = ORTE_RML_TAG_MAX; tagitem->name = NULL;}/* destructor - used to free any resources held by instance */static void orte_ns_proxy_tagitem_destructor(orte_ns_proxy_tagitem_t* tagitem){ if (NULL != tagitem->name) { free(tagitem->name); }}/* define instance of opal_class_t */OBJ_CLASS_INSTANCE( orte_ns_proxy_tagitem_t, /* type name */ opal_object_t, /* parent "class" name */ orte_ns_proxy_tagitem_construct, /* constructor */ orte_ns_proxy_tagitem_destructor); /* destructor *//* constructor - used to initialize state of dtilist instance */static void orte_ns_proxy_dti_construct(orte_ns_proxy_dti_t* dti){ dti->id = ORTE_DSS_ID_MAX; dti->name = NULL;}/* destructor - used to free any resources held by instance */static void orte_ns_proxy_dti_destructor(orte_ns_proxy_dti_t* dti){ if (NULL != dti->name) { free(dti->name); }}/* define instance of opal_class_t */OBJ_CLASS_INSTANCE( orte_ns_proxy_dti_t, /* type name */ opal_object_t, /* parent "class" name */ orte_ns_proxy_dti_construct, /* constructor */ orte_ns_proxy_dti_destructor); /* destructor *//* * globals needed within proxy component */orte_ns_proxy_globals_t orte_ns_proxy;/* * Open the proxy component and obtain the name of my proxy. */int orte_ns_proxy_open(void){ int id, param; id = mca_base_param_register_int("ns", "proxy", "debug", NULL, 0); mca_base_param_lookup_int(id, &orte_ns_proxy.debug); id = mca_base_param_register_int("ns", "proxy", "maxsize", NULL, ORTE_NS_ARRAY_MAX_SIZE); mca_base_param_lookup_int(id, ¶m); orte_ns_proxy.max_size = (size_t)param; id = mca_base_param_register_int("ns", "proxy", "blocksize", NULL, ORTE_NS_ARRAY_BLOCK_SIZE); mca_base_param_lookup_int(id, ¶m); orte_ns_proxy.block_size = (size_t)param; return ORTE_SUCCESS;}/* * ditto for this one */int orte_ns_proxy_close(void){ return ORTE_SUCCESS;}mca_ns_base_module_t* orte_ns_proxy_init(int *priority){ orte_process_name_t name; int ret, rc; /* If we are NOT to host a proxy, then we want to be selected, so do all the setup and return the module */ /* opal_output(mca_ns_base_output, "ns_proxy: entered init\n"); */ if (NULL != orte_process_info.ns_replica_uri) { /* Return a module (choose an arbitrary, positive priority -- it's only relevant compared to other ns components). If we're not the seed, then we don't want to be selected, so return NULL. */ *priority = 10; /* define the proxy for us to use */ if(ORTE_SUCCESS != (ret = orte_rml.parse_uris(orte_process_info.ns_replica_uri, &name, NULL))) { ORTE_ERROR_LOG(ret); return NULL; } if(ORTE_SUCCESS != (ret = orte_dss.copy((void**)&orte_process_info.ns_replica, &name, ORTE_NAME))) { ORTE_ERROR_LOG(ret); return NULL; } /* initialize the cell info tracker */ if (ORTE_SUCCESS != (rc = orte_pointer_array_init(&(orte_ns_proxy.cells), (orte_std_cntr_t)orte_ns_proxy.block_size, (orte_std_cntr_t)orte_ns_proxy.max_size, (orte_std_cntr_t)orte_ns_proxy.block_size))) { ORTE_ERROR_LOG(rc); return NULL; } orte_ns_proxy.num_cells = 0; /* initialize the taglist */ if (ORTE_SUCCESS != (rc = orte_pointer_array_init(&(orte_ns_proxy.tags), (orte_std_cntr_t)orte_ns_proxy.block_size, (orte_std_cntr_t)orte_ns_proxy.max_size, (orte_std_cntr_t)orte_ns_proxy.block_size))) { ORTE_ERROR_LOG(rc); return NULL; } orte_ns_proxy.num_tags = 0; /* initialize the dtlist */ if (ORTE_SUCCESS != (rc = orte_pointer_array_init(&(orte_ns_proxy.dts), (orte_std_cntr_t)orte_ns_proxy.block_size, (orte_std_cntr_t)orte_ns_proxy.max_size, (orte_std_cntr_t)orte_ns_proxy.block_size))) { ORTE_ERROR_LOG(rc); return NULL; } orte_ns_proxy.num_dts = 0; /* setup the thread lock */ OBJ_CONSTRUCT(&orte_ns_proxy.mutex, opal_mutex_t); /* Return the module */ initialized = true; return &orte_ns_proxy_module; } else { return NULL; }}/* * module init function */int orte_ns_proxy_module_init(void){ return ORTE_SUCCESS;}/* * finalize routine */int orte_ns_proxy_finalize(void){ orte_ns_proxy_tagitem_t **tag; orte_ns_proxy_dti_t **dti; orte_std_cntr_t i; /* free all tracking storage, but only if this component was initialized */ if (initialized) { tag = (orte_ns_proxy_tagitem_t**)(orte_ns_proxy.tags)->addr; for (i=0; i < (orte_ns_proxy.tags)->size; i++) { if (NULL != tag[i]) OBJ_RELEASE(tag[i]); } OBJ_RELEASE(orte_ns_proxy.tags); dti = (orte_ns_proxy_dti_t**)(orte_ns_proxy.dts)->addr; for (i=0; i < (orte_ns_proxy.dts)->size; i++) { if (NULL != dti[i]) OBJ_RELEASE(dti[i]); } OBJ_RELEASE(orte_ns_proxy.dts); initialized = false; } /* All done */ return ORTE_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -