First implementation of several PCM base functions
This commit was SVN r520.
Этот коммит содержится в:
родитель
1117e272d9
Коммит
b201977eab
29
src/mca/lam/pcm/base/pcm_base_close.c
Обычный файл
29
src/mca/lam/pcm/base/pcm_base_close.c
Обычный файл
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* $HEADER$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lam_config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "lam/constants.h"
|
||||||
|
#include "mca/mca.h"
|
||||||
|
#include "mca/lam/base/base.h"
|
||||||
|
#include "mca/lam/pcm/pcm.h"
|
||||||
|
|
||||||
|
|
||||||
|
int mca_pcm_base_close(void)
|
||||||
|
{
|
||||||
|
extern lam_list_t mca_pcm_base_modules_available;
|
||||||
|
|
||||||
|
/* Close all remaining available modules (may be one if this is a
|
||||||
|
LAM RTE program, or [possibly] multiple if this is laminfo) */
|
||||||
|
|
||||||
|
mca_base_modules_close(mca_pcm_base_output,
|
||||||
|
&mca_pcm_base_modules_available, NULL);
|
||||||
|
|
||||||
|
/* All done */
|
||||||
|
|
||||||
|
return LAM_SUCCESS;
|
||||||
|
}
|
51
src/mca/lam/pcm/base/pcm_base_open.c
Обычный файл
51
src/mca/lam/pcm/base/pcm_base_open.c
Обычный файл
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* $HEADER$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lam_config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "mca/mca.h"
|
||||||
|
#include "mca/lam/base/base.h"
|
||||||
|
#include "mca/lam/pcm/pcm.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following file was created by configure. It contains extern
|
||||||
|
* statements and the definition of an array of pointers to each
|
||||||
|
* module's public mca_base_module_t struct.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mca/lam/pcm/base/static-modules.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global variables
|
||||||
|
*/
|
||||||
|
int mca_pcm_base_output = -1;
|
||||||
|
mca_pcm_t mca_pcm;
|
||||||
|
lam_list_t mca_pcm_base_modules_available;
|
||||||
|
mca_pcm_base_module_t mca_pcm_base_selected_module;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function for finding and opening either all MCA modules, or the one
|
||||||
|
* that was specifically requested via a MCA parameter.
|
||||||
|
*/
|
||||||
|
int mca_pcm_base_open(void)
|
||||||
|
{
|
||||||
|
/* Open up all available modules */
|
||||||
|
|
||||||
|
if (LAM_SUCCESS !=
|
||||||
|
mca_base_modules_open("pcm", 0, mca_pcm_base_static_modules,
|
||||||
|
&mca_pcm_base_modules_available)) {
|
||||||
|
return LAM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All done */
|
||||||
|
|
||||||
|
return LAM_SUCCESS;
|
||||||
|
}
|
125
src/mca/lam/pcm/base/pcm_base_select.c
Обычный файл
125
src/mca/lam/pcm/base/pcm_base_select.c
Обычный файл
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* $HEADER$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lam_config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "lam/runtime/runtime.h"
|
||||||
|
#include "mca/mca.h"
|
||||||
|
#include "mca/lam/base/base.h"
|
||||||
|
#include "mca/lam/pcm/pcm.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function for selecting one module from all those that are
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* Call the query function on all available modules and get their
|
||||||
|
* priorities. Select the module with the highest priority. All
|
||||||
|
* other modules will be closed and unloaded. The selected module
|
||||||
|
* will have its initialization function invoked, and all of its
|
||||||
|
* function pointers saved.
|
||||||
|
*/
|
||||||
|
int mca_pcm_base_select(void)
|
||||||
|
{
|
||||||
|
int priority, best_priority;
|
||||||
|
lam_list_item_t *item;
|
||||||
|
mca_base_module_list_item_t *mli;
|
||||||
|
mca_pcm_base_module_t *module, *best_module;
|
||||||
|
mca_pcm_t *actions;
|
||||||
|
extern lam_list_t mca_pcm_base_modules_available;
|
||||||
|
|
||||||
|
/* Traverse the list of available modules; call their init
|
||||||
|
functions. */
|
||||||
|
|
||||||
|
best_priority = -1;
|
||||||
|
best_module = NULL;
|
||||||
|
for (item = lam_list_get_first(&mca_pcm_base_modules_available);
|
||||||
|
lam_list_get_end(&mca_pcm_base_modules_available) != item;
|
||||||
|
item = lam_list_get_next(item)) {
|
||||||
|
mli = (mca_base_module_list_item_t *) item;
|
||||||
|
module = (mca_pcm_base_module_t *) mli->mli_module;
|
||||||
|
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: querying %s module %s",
|
||||||
|
module->pcmm_version.mca_type_name,
|
||||||
|
module->pcmm_version.mca_module_name);
|
||||||
|
if (NULL == module->pcmm_query) {
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: no querying function; ignoring module");
|
||||||
|
} else {
|
||||||
|
if (MCA_SUCCESS != module->pcmm_query(&priority)) {
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: query returned failure");
|
||||||
|
} else {
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: query returned priority %d", priority);
|
||||||
|
if (priority > best_priority) {
|
||||||
|
best_priority = priority;
|
||||||
|
best_module = module;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finished querying all modules. Check for the bozo case. */
|
||||||
|
|
||||||
|
if (NULL == best_module) {
|
||||||
|
/* JMS Replace with show_help */
|
||||||
|
lam_abort(1, "No PCM module available. This shouldn't happen.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize all non-selected modules */
|
||||||
|
|
||||||
|
for (item = lam_list_get_first(&mca_pcm_base_modules_available);
|
||||||
|
lam_list_get_end(&mca_pcm_base_modules_available) != item;
|
||||||
|
item = lam_list_get_next(item)) {
|
||||||
|
mli = (mca_base_module_list_item_t *) item;
|
||||||
|
module = (mca_pcm_base_module_t *) mli->mli_module;
|
||||||
|
|
||||||
|
if (module != best_module) {
|
||||||
|
|
||||||
|
/* Finalize */
|
||||||
|
|
||||||
|
if (NULL != module->pcmm_finalize) {
|
||||||
|
|
||||||
|
/* Blatently ignore the return code (what would we do to
|
||||||
|
recover, anyway? This module is going away, so errors
|
||||||
|
don't matter anymore) */
|
||||||
|
|
||||||
|
module->pcmm_finalize();
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: module %s finalized",
|
||||||
|
module->pcmm_version.mca_module_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This base function closes, unloads, and removes from the
|
||||||
|
available list all unselected modules. The available list will
|
||||||
|
contain only the selected module. */
|
||||||
|
|
||||||
|
mca_base_modules_close(mca_pcm_base_output, &mca_pcm_base_modules_available,
|
||||||
|
(mca_base_module_t *) best_module);
|
||||||
|
|
||||||
|
/* Invoke init on the selected module */
|
||||||
|
|
||||||
|
actions = best_module->pcmm_init();
|
||||||
|
if (NULL == actions) {
|
||||||
|
/* JMS replace with show_help */
|
||||||
|
lam_abort(1, "PCM module init function returned NULL. This shouldn't happen.");
|
||||||
|
}
|
||||||
|
mca_pcm_base_selected_module = *best_module;
|
||||||
|
mca_pcm = *actions;
|
||||||
|
lam_output_verbose(10, mca_pcm_base_output,
|
||||||
|
"select: module %s initialized",
|
||||||
|
module->pcmm_version.mca_module_name);
|
||||||
|
|
||||||
|
/* All done */
|
||||||
|
|
||||||
|
return LAM_SUCCESS;
|
||||||
|
}
|
@ -423,7 +423,8 @@ typedef mca_pcm_1_0_0_t mca_pcm_t;
|
|||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
int mca_pcm_base_open(lam_cmd_line_t *cmd);
|
int mca_pcm_base_open(void);
|
||||||
|
int mca_pcm_base_select(void);
|
||||||
int mca_pcm_base_close(void);
|
int mca_pcm_base_close(void);
|
||||||
|
|
||||||
bool mca_pcm_base_is_checkpointable(void);
|
bool mca_pcm_base_is_checkpointable(void);
|
||||||
@ -437,8 +438,15 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global struct holding the selected module's function pointers
|
* Macros
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Globals
|
||||||
|
*/
|
||||||
|
extern int mca_pcm_base_output;
|
||||||
|
extern lam_list_t mca_pcm_base_modules_available;
|
||||||
|
extern mca_pcm_base_module_t mca_pcm_base_selected_module;
|
||||||
extern mca_pcm_t mca_pcm;
|
extern mca_pcm_t mca_pcm;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user