1
1
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

59 строки
1.9 KiB
C

/*
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OMPI_HOOK_BASE_H
#define OMPI_HOOK_BASE_H
#include "ompi_config.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/mca_base_framework.h"
#include "ompi/mca/hook/hook.h"
BEGIN_C_DECLS
/**
* Framework struct declaration for this framework
*/
OMPI_DECLSPEC extern mca_base_framework_t ompi_hook_base_framework;
/**
* Dynamically register function pointers to be called from outside of the hook
* framework. For example, a collective component could register a callback
* at the bottom of init to perform some action.
*/
OMPI_DECLSPEC int ompi_hook_base_register_callbacks(ompi_hook_base_component_t *comp);
OMPI_DECLSPEC int ompi_hook_base_deregister_callbacks(ompi_hook_base_component_t *comp);
/**
* Wrapper functions matching the interface functions
*/
OMPI_DECLSPEC void ompi_hook_base_mpi_initialized_top(int *flag);
OMPI_DECLSPEC void ompi_hook_base_mpi_initialized_bottom(int *flag);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_thread_top(int *argc, char ***argv, int required, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_thread_bottom(int *argc, char ***argv, int required, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_finalized_top(int *flag);
OMPI_DECLSPEC void ompi_hook_base_mpi_finalized_bottom(int *flag);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_top(int argc, char **argv, int requested, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_top_post_opal(int argc, char **argv, int requested, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_bottom(int argc, char **argv, int requested, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_init_error(int argc, char **argv, int requested, int *provided);
OMPI_DECLSPEC void ompi_hook_base_mpi_finalize_top(void);
OMPI_DECLSPEC void ompi_hook_base_mpi_finalize_bottom(void);
END_C_DECLS
#endif /* OMPI_BASE_HOOK_H */