1
1
openmpi/orte/mca/rml/base/rml_base_components.c
Wesley Bland 84be81df95 Standardize the initialization of the EPOCH's.
Everyone will be starting at MIN anyway (until we implement restart of course)
so there's no reason to set the epoch to INVALID and then immediately reset them
to MIN. This way there's less room to make mistakes later.

This commit was SVN r24829.
2011-06-28 14:20:33 +00:00

278 строки
8.3 KiB
C

/*
* Copyright (c) 2004-2011 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include "opal/mca/mca.h"
#include "opal/mca/base/mca_base_component_repository.h"
#include "opal/util/output.h"
#include "orte/mca/rml/rml.h"
#if !ORTE_DISABLE_FULL_SUPPORT
#endif
#include "orte/mca/rml/base/base.h"
/* The following file was created by configure. It contains extern
* statements and the definition of an array of pointers to each
* component's public mca_base_component_t struct. */
#include "orte/mca/rml/base/static-components.h"
orte_rml_module_t orte_rml = {
NULL,
NULL,
NULL,
NULL,
NULL,
orte_rml_base_null_send,
orte_rml_base_null_send_nb,
orte_rml_base_null_send_buffer,
orte_rml_base_null_send_buffer_nb,
orte_rml_base_null_recv,
orte_rml_base_null_recv_nb,
orte_rml_base_null_recv_buffer,
orte_rml_base_null_recv_buffer_nb,
orte_rml_base_null_recv_cancel,
NULL,
NULL,
NULL
};
int orte_rml_base_output = -1;
opal_list_t orte_rml_base_subscriptions;
opal_list_t orte_rml_base_components;
orte_rml_component_t *orte_rml_component = NULL;
static bool component_open_called = false;
static bool opened = false;
static bool selected = false;
/* instantiate the msg_pkt object */
static void msg_pkt_constructor(orte_msg_packet_t *pkt)
{
pkt->sender.jobid = ORTE_JOBID_INVALID;
pkt->sender.vpid = ORTE_VPID_INVALID;
pkt->sender.epoch = ORTE_EPOCH_MIN;
pkt->buffer = NULL;
}
static void msg_pkt_destructor(orte_msg_packet_t *pkt)
{
pkt->sender.jobid = ORTE_JOBID_INVALID;
pkt->sender.vpid = ORTE_VPID_INVALID;
pkt->sender.epoch = ORTE_EPOCH_INVALID;
if (NULL != pkt->buffer) {
OBJ_RELEASE(pkt->buffer);
}
}
OBJ_CLASS_INSTANCE(orte_msg_packet_t,
opal_list_item_t,
msg_pkt_constructor,
msg_pkt_destructor);
int
orte_rml_base_open(void)
{
int ret;
if (opened) {
return ORTE_SUCCESS;
}
opened = true;
/* Initialize globals */
OBJ_CONSTRUCT(&orte_rml_base_components, opal_list_t);
OBJ_CONSTRUCT(&orte_rml_base_subscriptions, opal_list_t);
/*
* Which RML Wrapper component to use, if any
* - NULL or "" = No wrapper
* - ow. select that specific wrapper component
*/
mca_base_param_reg_string_name("rml", "wrapper",
"Use a Wrapper component around the selected RML component",
false, false,
NULL, NULL);
/* register parameters */
orte_rml_base_output = opal_output_open(NULL);
/* Open up all available components */
ret = mca_base_components_open("rml",
orte_rml_base_output,
mca_rml_base_static_components,
&orte_rml_base_components,
true);
component_open_called = true;
return ret;
}
int
orte_rml_base_select(void)
{
opal_list_item_t *item;
int selected_priority = -1;
orte_rml_component_t *selected_component = NULL;
orte_rml_module_t *selected_module = NULL;
int wrapper_priority = -1;
orte_rml_component_t *wrapper_component = NULL;
orte_rml_module_t *wrapper_module = NULL;
char *rml_wrapper = NULL;
bool return_silent=false;
if (selected) {
return ORTE_SUCCESS;
}
selected = true;
mca_base_param_reg_string_name("rml", "wrapper",
"Use a Wrapper component around the selected RML component",
false, false,
NULL, &rml_wrapper);
for (item = opal_list_get_first(&orte_rml_base_components);
item != opal_list_get_end(&orte_rml_base_components) ;
item = opal_list_get_next(item)) {
mca_base_component_list_item_t *cli;
orte_rml_component_t* component;
cli = (mca_base_component_list_item_t *) item;
component = (orte_rml_component_t *) cli->cli_component;
opal_output_verbose(10, orte_rml_base_output,
"orte_rml_base_select: initializing %s component %s",
component->rml_version.mca_type_name,
component->rml_version.mca_component_name);
if (NULL == component->rml_init) {
opal_output_verbose(10, orte_rml_base_output,
"orte_rml_base_select: no init function; ignoring component");
} else {
int priority = 0;
orte_rml_module_t* module = component->rml_init(&priority);
if (NULL == module) {
opal_output_verbose(10, orte_rml_base_output,
"orte_rml_base_select: init returned failure");
if (priority < 0) {
return_silent = true;
}
continue;
}
if(NULL != rml_wrapper &&
/* If this is a wrapper component then save it for later */
RML_SELECT_WRAPPER_PRIORITY >= priority) {
if( 0 == strncmp(component->rml_version.mca_component_name,
rml_wrapper,
strlen(rml_wrapper) ) ) {
wrapper_priority = priority;
wrapper_component = component;
wrapper_module = module;
}
} else if (priority > selected_priority) {
/* Otherwise this is a normal module and subject to normal selection */
if (NULL != selected_module && NULL != selected_module->finalize) {
selected_module->finalize();
}
selected_priority = priority;
selected_component = component;
selected_module = module;
}
}
}
/*
* Unload all components that were not selected
*/
item = opal_list_get_first(&orte_rml_base_components);
while (item != opal_list_get_end(&orte_rml_base_components)) {
opal_list_item_t* next = opal_list_get_next(item);
orte_rml_component_t* component;
mca_base_component_list_item_t *cli;
cli = (mca_base_component_list_item_t *) item;
component = (orte_rml_component_t *) cli->cli_component;
/* Keep it if it is the wrapper component */
if (NULL != wrapper_component &&
component == wrapper_component) {
item = next;
continue;
}
/* Not the selected component */
if (component != selected_component) {
opal_output_verbose(10, orte_rml_base_output,
"orte_rml_base_select: module %s unloaded",
component->rml_version.mca_component_name);
mca_base_component_repository_release((mca_base_component_t *) component);
opal_list_remove_item(&orte_rml_base_components, item);
OBJ_RELEASE(item);
}
item = next;
}
/* setup reference to selected module */
if (NULL != selected_module) {
orte_rml = *selected_module;
orte_rml_component = selected_component;
}
/* If a wrapper component was requested then
* Make sure it can switch out the selected module
*/
if( NULL != wrapper_component) {
wrapper_component->rml_init(NULL);
}
if( NULL != rml_wrapper ) {
free(rml_wrapper);
}
if (NULL == selected_component) {
if (return_silent) {
return ORTE_ERR_SILENT;
}
return ORTE_ERROR;
}
return ORTE_SUCCESS;
}
int
orte_rml_base_close(void)
{
/* shutdown any remaining opened components */
if (component_open_called) {
mca_base_components_close(orte_rml_base_output,
&orte_rml_base_components, NULL);
}
OBJ_DESTRUCT(&orte_rml_base_components);
OBJ_DESTRUCT(&orte_rml_base_subscriptions);
return ORTE_SUCCESS;
}