1
1
openmpi/src/mca/ptl/base/ptl_base_select.c

101 строка
3.1 KiB
C
Исходник Обычный вид История

/*
* $HEADER$
*/
#include "ompi_config.h"
#include "runtime/runtime.h"
#include "mca/mca.h"
#include "mca/base/base.h"
#include "mca/ptl/ptl.h"
#include "mca/ptl/base/base.h"
/**
* Function for weeding out ptl modules that don't want to run.
*
* Call the init function on all available modules to find out if they
* want to run. Select all modules that don't fail. Failing modules
* will be closed and unloaded. The selected modules will be returned
* to the caller in a ompi_list_t.
*/
int mca_ptl_base_select(bool *allow_multi_user_threads,
bool *have_hidden_threads)
{
int i, num_ptls;
bool user_threads, hidden_threads;
ompi_list_item_t *item;
mca_base_module_list_item_t *mli;
mca_ptl_base_module_t *module;
mca_ptl_t **actions;
mca_ptl_base_selected_module_t *sm;
/* Traverse the list of available modules; call their init
functions. */
for (item = ompi_list_get_first(&mca_ptl_base_modules_available);
ompi_list_get_end(&mca_ptl_base_modules_available) != item;
item = ompi_list_get_next(item)) {
mli = (mca_base_module_list_item_t *) item;
module = (mca_ptl_base_module_t *) mli->mli_module;
ompi_output_verbose(10, mca_ptl_base_output,
"select: initializing %s module %s",
module->ptlm_version.mca_type_name,
module->ptlm_version.mca_module_name);
if (NULL == module->ptlm_init) {
ompi_output_verbose(10, mca_ptl_base_output,
"select: no init function; ignoring module");
} else {
actions = module->ptlm_init(&num_ptls, &user_threads,
&hidden_threads);
/* If the module didn't initialize, unload it */
if (NULL == actions) {
ompi_output_verbose(10, mca_ptl_base_output,
"select: init returned failure");
mca_base_module_repository_release((mca_base_module_t *) module);
ompi_output_verbose(10, mca_ptl_base_output,
"select: module %s unloaded",
module->ptlm_version.mca_module_name);
}
/* Otherwise, it initialized properly. Save it. */
else {
*allow_multi_user_threads |= user_threads;
*have_hidden_threads |= hidden_threads;
ompi_output_verbose(10, mca_ptl_base_output,
"select: init returned success");
for (i = 0; i < num_ptls; ++i) {
sm = malloc(sizeof(mca_ptl_base_selected_module_t));
if (NULL == sm) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
OBJ_CONSTRUCT(sm, ompi_list_item_t);
sm->pbsm_module = module;
sm->pbsm_actions = actions[i];
ompi_list_append(&mca_ptl_base_modules_initialized,
(ompi_list_item_t*) sm);
}
free(actions);
}
}
}
/* Finished querying all modules. Check for the bozo case. */
if (0 == ompi_list_get_size(&mca_ptl_base_modules_initialized)) {
/* JMS Replace with show_help */
ompi_abort(1, "No ptl module available. This shouldn't happen.");
}
/* All done */
return OMPI_SUCCESS;
}