1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
* Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2013 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include "opal/runtime/opal.h"
#include "opal/class/opal_list.h"
#include "opal/util/output.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/mca/base/mca_base_component_repository.h"
#include "opal/constants.h"
int mca_base_select(const char *type_name, int output_id,
opal_list_t *components_available,
mca_base_module_t **best_module,
mca_base_component_t **best_component)
{
mca_base_component_list_item_t *cli = NULL;
mca_base_component_t *component = NULL;
mca_base_module_t *module = NULL;
opal_list_item_t *item = NULL;
int priority = 0, best_priority = INT32_MIN;
*best_module = NULL;
*best_component = NULL;
opal_output_verbose(10, output_id,
"mca:base:select: Auto-selecting %s components",
type_name);
/*
* Traverse the list of available components.
* For each call their 'query' functions to determine relative priority.
*/
for (item = opal_list_get_first(components_available);
item != opal_list_get_end(components_available);
item = opal_list_get_next(item) ) {
cli = (mca_base_component_list_item_t *) item;
component = (mca_base_component_t *) cli->cli_component;
/*
* If there is a query function then use it.
*/
if (NULL == component->mca_query_component) {
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) Skipping component [%s]. It does not implement a query function",
type_name, component->mca_component_name );
continue;
}
/*
* Query this component for the module and priority
*/
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) Querying component [%s]",
type_name, component->mca_component_name);
component->mca_query_component(&module, &priority);
/*
* If no module was returned, then skip component
*/
if (NULL == module) {
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) Skipping component [%s]. Query failed to return a module",
type_name, component->mca_component_name );
continue;
}
/*
* Determine if this is the best module we have seen by looking the priority
*/
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) Query of component [%s] set priority to %d",
type_name, component->mca_component_name, priority);
if (priority > best_priority) {
best_priority = priority;
*best_component = component;
*best_module = module;
}
}
/*
* Finished querying all components.
* Make sure we found something in the process.
*/
if (NULL == *best_component) {
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) No component selected!",
type_name);
/*
* Still close the non-selected components
*/
mca_base_components_close(output_id,
components_available,
NULL, false);
return OPAL_ERR_NOT_FOUND;
}
opal_output_verbose(5, output_id,
"mca:base:select:(%5s) Selected component [%s]",
type_name, (*best_component)->mca_component_name);
if (opal_profile) {
opal_output(0, "%s:%s", type_name, (*best_component)->mca_component_name);
}
/*
* Close the non-selected components
*/
mca_base_components_close(output_id,
components_available,
(mca_base_component_t *) (*best_component),
false);
return OPAL_SUCCESS;
}
|