c10bbfded6
* Include a 'demo' component that shows some of the features. * Currently has hooks for: - MPI_Initialized - top, bottom - MPI_Init_thread - top, bottom - MPI_Finalized - top, bottom - MPI_Init - top (pre-opal_init), top (post-opal_init), error, bottom - MPI_Finalize - top, bottom * Other places in ompi can 'register' to hook into any one of these places by passing back a component structure filled with function pointers. * Add a `MCA_BASE_COMPONENT_FLAG_REQUIRED` flag to the MCA structure that is checked by the `hook` framework. If a required, static component has been excluded then the `hook` framework will fail to initialize. - See note in `opal/mca/mca.h` as to why this is checked in the `hook` framework and not in `opal/mca/base/mca_base_component_find.c` Signed-off-by: Joshua Hursey <jhursey@us.ibm.com>
108 строки
3.4 KiB
C
108 строки
3.4 KiB
C
/*
|
|
* Copyright (c) 2017 IBM Corporation. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "ompi_config.h"
|
|
|
|
#include "hook_demo.h"
|
|
|
|
static int ompi_hook_demo_component_open(void);
|
|
static int ompi_hook_demo_component_close(void);
|
|
static int ompi_hook_demo_component_register(void);
|
|
|
|
/*
|
|
* Public string showing the component version number
|
|
*/
|
|
const char *mca_hook_demo_component_version_string =
|
|
"Open MPI 'demo' hook MCA component version " OMPI_VERSION;
|
|
|
|
/*
|
|
* Instantiate the public struct with all of our public information
|
|
* and pointers to our public functions in it
|
|
*/
|
|
const ompi_hook_base_component_1_0_0_t mca_hook_demo_component = {
|
|
|
|
/* First, the mca_component_t struct containing meta information
|
|
* about the component itself */
|
|
.hookm_version = {
|
|
OMPI_HOOK_BASE_VERSION_1_0_0,
|
|
|
|
/* Component name and version */
|
|
.mca_component_name = "demo",
|
|
MCA_BASE_MAKE_VERSION(component, OMPI_MAJOR_VERSION, OMPI_MINOR_VERSION,
|
|
OMPI_RELEASE_VERSION),
|
|
|
|
/* Component open and close functions */
|
|
.mca_open_component = ompi_hook_demo_component_open,
|
|
.mca_close_component = ompi_hook_demo_component_close,
|
|
.mca_register_component_params = ompi_hook_demo_component_register,
|
|
|
|
// Force this component to always be considered - component must be static
|
|
.mca_component_flags = MCA_BASE_COMPONENT_FLAG_REQUIRED,
|
|
},
|
|
.hookm_data = {
|
|
/* The component is checkpoint ready */
|
|
MCA_BASE_METADATA_PARAM_CHECKPOINT
|
|
},
|
|
|
|
/* Component functions */
|
|
.hookm_mpi_initialized_top = ompi_hook_demo_mpi_initialized_top,
|
|
.hookm_mpi_initialized_bottom = ompi_hook_demo_mpi_initialized_bottom,
|
|
|
|
.hookm_mpi_finalized_top = ompi_hook_demo_mpi_finalized_top,
|
|
.hookm_mpi_finalized_bottom = ompi_hook_demo_mpi_finalized_bottom,
|
|
|
|
.hookm_mpi_init_top = ompi_hook_demo_mpi_init_top,
|
|
.hookm_mpi_init_top_post_opal = ompi_hook_demo_mpi_init_top_post_opal,
|
|
.hookm_mpi_init_bottom = ompi_hook_demo_mpi_init_bottom,
|
|
.hookm_mpi_init_error = ompi_hook_demo_mpi_init_error,
|
|
|
|
.hookm_mpi_finalize_top = ompi_hook_demo_mpi_finalize_top,
|
|
.hookm_mpi_finalize_bottom = ompi_hook_demo_mpi_finalize_bottom,
|
|
};
|
|
|
|
/*
|
|
* Example 'extra' component with an additional callback that is dynamically
|
|
* registered at runtime in addition to the callbacks that are a part of the
|
|
* component structure.
|
|
*/
|
|
ompi_hook_base_component_1_0_0_t hook_demo_extra_component = {
|
|
/* Component functions */
|
|
.hookm_mpi_init_bottom = ompi_hook_demo_extra_mpi_init_bottom,
|
|
};
|
|
|
|
static int ompi_hook_demo_component_open(void)
|
|
{
|
|
opal_output(0, "hook/demo: component_open()");
|
|
|
|
// Register the 'extra' callback(s) to be called the next time those
|
|
// functions are encountered.
|
|
ompi_hook_base_register_callbacks( &hook_demo_extra_component );
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
static int ompi_hook_demo_component_close(void)
|
|
{
|
|
opal_output(0, "hook/demo: component_close()");
|
|
|
|
// Deregister the 'extra' callback(s) so that they are no longer called.
|
|
// Must pass in the same 'component' structure that was passed to the
|
|
// ompi_hook_base_register_callbacks() earlier.
|
|
ompi_hook_base_deregister_callbacks( &hook_demo_extra_component );
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
static int ompi_hook_demo_component_register(void)
|
|
{
|
|
opal_output(0, "hook/demo: component_register()");
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|