1
1
openmpi/orte/mca/oob/base/oob_base_select.c
2015-06-23 20:59:57 -07:00

158 строки
6.3 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2012-2013 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#include "orte/constants.h"
#include <stdio.h>
#include <string.h>
#include "orte/mca/mca.h"
#include "opal/util/output.h"
#include "opal/mca/base/base.h"
#include "orte/util/show_help.h"
#include "orte/runtime/orte_globals.h"
#include "orte/mca/oob/oob.h"
#include "orte/mca/oob/base/base.h"
/**
* Function for selecting all runnable modules from those that are
* available.
*
* Call the init function on all available modules.
*/
int orte_oob_base_select(void)
{
mca_base_component_list_item_t *cli, *cmp, *c2;
mca_oob_base_component_t *component, *c3;
bool added;
int i, rc;
/* Query all available components and ask if their transport is available */
OPAL_LIST_FOREACH(cli, &orte_oob_base_framework.framework_components, mca_base_component_list_item_t) {
component = (mca_oob_base_component_t *) cli->cli_component;
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: checking available component %s",
component->oob_base.mca_component_name);
/* If there's no query function, skip it */
if (NULL == component->available) {
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Skipping component [%s]. It does not implement a query function",
component->oob_base.mca_component_name );
continue;
}
/* Query the component */
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Querying component [%s]",
component->oob_base.mca_component_name);
rc = component->available();
/* If the component is not available, then skip it as
* it has no available interfaces
*/
if (ORTE_SUCCESS != rc && ORTE_ERR_FORCE_SELECT != rc) {
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Skipping component [%s] - no available interfaces",
component->oob_base.mca_component_name );
continue;
}
/* if it fails to startup, then skip it */
if (ORTE_SUCCESS != component->startup()) {
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Skipping component [%s] - failed to startup",
component->oob_base.mca_component_name );
continue;
}
if (ORTE_ERR_FORCE_SELECT == rc) {
/* this component shall be the *only* component allowed
* for use, so shutdown and remove any prior ones */
while (NULL != (cmp = (mca_base_component_list_item_t*)opal_list_remove_first(&orte_oob_base.actives))) {
c3 = (mca_oob_base_component_t *) cmp->cli_component;
if (NULL != c3->shutdown) {
c3->shutdown();
}
OBJ_RELEASE(cmp);
}
c2 = OBJ_NEW(mca_base_component_list_item_t);
c2->cli_component = (mca_base_component_t*)component;
opal_list_append(&orte_oob_base.actives, &c2->super);
break;
}
/* record it, but maintain priority order */
added = false;
OPAL_LIST_FOREACH(cmp, &orte_oob_base.actives, mca_base_component_list_item_t) {
c3 = (mca_oob_base_component_t *) cmp->cli_component;
if (c3->priority > component->priority) {
continue;
}
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Inserting component");
c2 = OBJ_NEW(mca_base_component_list_item_t);
c2->cli_component = (mca_base_component_t*)component;
opal_list_insert_pos(&orte_oob_base.actives,
&cmp->super, &c2->super);
added = true;
break;
}
if (!added) {
/* add to end */
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Adding component to end");
c2 = OBJ_NEW(mca_base_component_list_item_t);
c2->cli_component = (mca_base_component_t*)component;
opal_list_append(&orte_oob_base.actives, &c2->super);
}
}
if (0 == opal_list_get_size(&orte_oob_base.actives) &&
!orte_standalone_operation) {
/* no support available means we really cannot run unless
* we are a singleton */
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Init failed to return any available transports");
orte_show_help("help-oob-base.txt", "no-interfaces-avail", true);
return ORTE_ERR_SILENT;
}
/* provide them an index so we can track their usability in a bitmap */
i=0;
OPAL_LIST_FOREACH(cmp, &orte_oob_base.actives, mca_base_component_list_item_t) {
c3 = (mca_oob_base_component_t *) cmp->cli_component;
c3->idx = i++;
}
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Found %d active transports",
(int)opal_list_get_size(&orte_oob_base.actives));
return ORTE_SUCCESS;
}