1
1
openmpi/orte/mca/oob/base/oob_base_select.c
Ralph Castain 956aab03a7 Track the origin of a message so it can be passed across transports
Refs trac:4184

This commit was SVN r30433.

The following Trac tickets were found above:
  Ticket 4184 --> https://svn.open-mpi.org/trac/ompi/ticket/4184
2014-01-26 21:09:26 +00:00

134 строки
5.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$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#include "orte/constants.h"
#include <stdio.h>
#include <string.h>
#include "opal/mca/mca.h"
#include "opal/util/output.h"
#include "opal/mca/base/base.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;
/* 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);
/* If the component is not available, then skip it as
* it has no available interfaces
*/
if (!component->available()) {
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;
}
/* 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)) {
/* no support available means we really cannot run */
opal_output_verbose(5, orte_oob_base_framework.framework_output,
"mca:oob:select: Init failed to return any available transports");
return ORTE_ERR_NOT_AVAILABLE;
}
/* 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;
}