1
1
openmpi/ompi/mca/hook/hook.h
Joshua Hursey c10bbfded6 ompi/hook: Add the hook/license framework
* 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>
2017-02-27 12:05:53 -05:00

220 строки
7.2 KiB
C

/*
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
* The hook framework is designed to allow a component of the hook framework
* to be called a designated points in the MPI process lifecycle.
*
* There is not module structure in this framework since the components apply to
* the whole process. Further, the component might need to active before mca_init.
*
* Why not a PMPI library?
* - The desire is to allow a component to be built statically into the library
* for licensing and disgnostic purposes. As such we need the ability for
* the component to be statically linked into the libmpi library.
*
* Why is there not a hook for location XYZ?
* - The number of possible places for hooks is quite large. This framework
* supports a set that we think will provide the best coverage for the
* common use cases. If you have another use case we are always open to
* discussing extensions on the mailing list.
*/
#ifndef MCA_HOOK_H
#define MCA_HOOK_H
#include "ompi_config.h"
#include "mpi.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
BEGIN_C_DECLS
/*
* Some functions are specially marked. See decoder below.
*
* *** Static Only (Always) ***
* Only static components will ever see this callback triggered due to the
* position of the hook relative to ompi_mpi_init and ompi_mpi_finalize.
*
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
* Only static components will ever see this callback triggered when outside
* of the ompi_mpi_init and ompi_mpi_finalize region. Others may see this
* triggered if the user's program makes additional calls while inside
* that region.
*
* *** Everyone (Inside MPI) ***
* Everyone registered will see this callback triggered. It is only triggered
* between ompi_mpi_init and ompi_mpi_finalize.
*
*/
/* ******************************************************************** */
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/initialized.c
* At the top of function (outside of mutex)
*/
typedef void (*ompi_hook_base_component_mpi_initialized_top_fn_t)(int *flag);
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/initialized.c
* At the bottom of function (outside of mutex)
*/
typedef void (*ompi_hook_base_component_mpi_initialized_bottom_fn_t)(int *flag);
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/init_thread.c
* At the top of function
*/
typedef void (*ompi_hook_base_component_mpi_init_thread_top_fn_t)(int *argc, char ***argv, int required, int *provided);
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/init_thread.c
* At the bottom of function
*/
typedef void (*ompi_hook_base_component_mpi_init_thread_bottom_fn_t)(int *argc, char ***argv, int required, int *provided);
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/finalized.c
* At the top of function (outside of mutex)
*/
typedef void (*ompi_hook_base_component_mpi_finalized_top_fn_t)(int *flag);
/**
* *** Static Only (Outside MPI), Everyone (Inside MPI) ***
*
* Location: mpi/c/finalized.c
* At the bottom of function (outside of mutex)
*/
typedef void (*ompi_hook_base_component_mpi_finalized_bottom_fn_t)(int *flag);
/**
* *** Static Only (Always) ***
*
* Location: runtime/ompi_mpi_init.c
* At top of function (outside of mutex)
*/
typedef void (*ompi_hook_base_component_mpi_init_top_fn_t)(int argc, char **argv, int requested, int *provided);
/**
* *** Everyone (Inside MPI) ***
*
* Location: runtime/ompi_mpi_init.c
* Just after opal_init_util and MCA initialization. (inside mutex)
* Notes:
* This framework has been opened as have its components.
*/
typedef void (*ompi_hook_base_component_mpi_init_top_post_opal_fn_t)(int argc, char **argv, int requested, int *provided);
/**
* *** Everyone (Inside MPI) ***
*
* Location: runtime/ompi_mpi_init.c
* At the bottom of the function. (outside mutex)
* Notes:
* This framework has been opened as have its components.
* Can safely use all MPI functionality.
*/
typedef void (*ompi_hook_base_component_mpi_init_bottom_fn_t)(int argc, char **argv, int requested, int *provided);
/**
* *** Everyone (Inside MPI) ***
*
* Location: runtime/ompi_mpi_init.c
* At the bottom of the error path. (outside mutex)
* Notes:
* This framework has been opened as have its components.
*/
typedef void (*ompi_hook_base_component_mpi_init_error_fn_t)(int argc, char **argv, int requested, int *provided);
/**
* *** Everyone (Inside MPI) ***
*
* Location: runtime/ompi_mpi_finalize.c
* At the top of the function. (outside mutex)
* Notes:
* This framework has been opened as have its components.
* Can safely use all MPI functionality.
*/
typedef void (*ompi_hook_base_component_mpi_finalize_top_fn_t)(void);
/**
* *** Static Only (Always) ***
*
* Location: runtime/ompi_mpi_finalize.c
* At top of function (outside of mutex)
* Notes:
* This framework has been closed.
*/
typedef void (*ompi_hook_base_component_mpi_finalize_bottom_fn_t)(void);
/* ******************************************************************** */
/**
* Hook component version and interface functions.
*/
struct ompi_hook_base_component_1_0_0_t {
mca_base_component_t hookm_version;
mca_base_component_data_t hookm_data;
/* MPI_Initialized */
ompi_hook_base_component_mpi_initialized_top_fn_t hookm_mpi_initialized_top;
ompi_hook_base_component_mpi_initialized_bottom_fn_t hookm_mpi_initialized_bottom;
/* MPI_Init_thread */
ompi_hook_base_component_mpi_init_thread_top_fn_t hookm_mpi_init_thread_top;
ompi_hook_base_component_mpi_init_thread_bottom_fn_t hookm_mpi_init_thread_bottom;
/* MPI_Finalized */
ompi_hook_base_component_mpi_finalized_top_fn_t hookm_mpi_finalized_top;
ompi_hook_base_component_mpi_finalized_bottom_fn_t hookm_mpi_finalized_bottom;
/* ompi_mpi_init */
ompi_hook_base_component_mpi_init_top_fn_t hookm_mpi_init_top;
ompi_hook_base_component_mpi_init_top_post_opal_fn_t hookm_mpi_init_top_post_opal;
ompi_hook_base_component_mpi_init_bottom_fn_t hookm_mpi_init_bottom;
ompi_hook_base_component_mpi_init_error_fn_t hookm_mpi_init_error;
/* ompi_mpi_finalize */
ompi_hook_base_component_mpi_finalize_top_fn_t hookm_mpi_finalize_top;
ompi_hook_base_component_mpi_finalize_bottom_fn_t hookm_mpi_finalize_bottom;
};
typedef struct ompi_hook_base_component_1_0_0_t ompi_hook_base_component_1_0_0_t;
typedef ompi_hook_base_component_1_0_0_t ompi_hook_base_component_t;
/*
* Note: We do -not- expose a component object for this framework.
* All interation with the component should go through the base/base.h interfaces.
* See that header for more information on calling functions.
*/
/* ******************************************************************** */
/*
* Macro for use in components that are of type hook
*/
#define OMPI_HOOK_BASE_VERSION_1_0_0 \
OMPI_MCA_BASE_VERSION_2_1_0("hook", 1, 0, 0)
END_C_DECLS
#endif /* MCA_HOOK_H */