File: mca_base_components_select.c

package info (click to toggle)
openmpi 5.0.8-4
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 201,684 kB
  • sloc: ansic: 613,078; makefile: 42,353; sh: 11,194; javascript: 9,244; f90: 7,052; java: 6,404; perl: 5,179; python: 1,859; lex: 740; fortran: 61; cpp: 20; tcl: 12
file content (141 lines) | stat: -rw-r--r-- 5,143 bytes parent folder | download | duplicates (5)
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
136
137
138
139
140
141
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2015      Los Alamos National Security, LLC. All rights
 *                         reserved.
 * Copyright (c) 2015      Intel, Inc. All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

#include "opal_config.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_SYS_TYPES_H
#    include <sys/types.h>
#endif

#include "opal/class/opal_list.h"
#include "opal/constants.h"
#include "opal/mca/base/base.h"
#include "opal/mca/base/mca_base_component_repository.h"
#include "opal/mca/mca.h"
#include "opal/runtime/opal.h"
#include "opal/util/output.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,
                    int *priority_out)
{
    mca_base_component_list_item_t *cli = NULL;
    mca_base_component_t *component = NULL;
    mca_base_module_t *module = NULL;
    int priority = 0, best_priority = INT32_MIN;
    int rc;

    *best_module = NULL;
    *best_component = NULL;

    opal_output_verbose(MCA_BASE_VERBOSE_COMPONENT, 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.
     */
    OPAL_LIST_FOREACH (cli, components_available, mca_base_component_list_item_t) {
        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(MCA_BASE_VERBOSE_COMPONENT, 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(MCA_BASE_VERBOSE_COMPONENT, output_id,
                            "mca:base:select:(%5s) Querying component [%s]", type_name,
                            component->mca_component_name);

        rc = component->mca_query_component(&module, &priority);
        if (OPAL_ERR_FATAL == rc) {
            /* a fatal error was detected by this component - e.g., the
             * user specified a required element and the component could
             * not find it. In this case, we must not continue as we might
             * find some other component that could run, causing us to do
             * something the user didn't want */
            return rc;
        } else if (OPAL_SUCCESS != rc) {
            /* silently skip this component */
            continue;
        }

        /*
         * If no module was returned, then skip component
         */
        if (NULL == module) {
            opal_output_verbose(
                MCA_BASE_VERBOSE_COMPONENT, 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(MCA_BASE_VERBOSE_COMPONENT, 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;
        }
    }

    if (priority_out) {
        *priority_out = best_priority;
    }

    /*
     * Finished querying all components.
     * Make sure we found something in the process.
     */
    if (NULL == *best_component) {
        opal_output_verbose(MCA_BASE_VERBOSE_COMPONENT, output_id,
                            "mca:base:select:(%5s) No component selected!", type_name);
        /*
         * Still close the non-selected components
         */
        mca_base_components_close(0, /* Pass 0 to keep this from closing the output handle */
                                  components_available, NULL);
        return OPAL_ERR_NOT_FOUND;
    }

    opal_output_verbose(MCA_BASE_VERBOSE_COMPONENT, output_id,
                        "mca:base:select:(%5s) Selected component [%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));

    return OPAL_SUCCESS;
}