a13166b500
This commit was SVN r6329.
320 строки
12 KiB
C
320 строки
12 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* MCA io base framework public interface functions.
|
|
*/
|
|
|
|
#ifndef MCA_IO_BASE_H
|
|
#define MCA_IO_BASE_H
|
|
|
|
#include "ompi_config.h"
|
|
|
|
#include "mpi.h"
|
|
#include "opal/class/opal_list.h"
|
|
#include "class/ompi_free_list.h"
|
|
#include "mca/io/io.h"
|
|
|
|
|
|
/*
|
|
* Global functions for MCA overall io open and close
|
|
*/
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
/**
|
|
* Initialize the io MCA framework
|
|
*
|
|
* @retval OMPI_SUCCESS Upon success
|
|
* @retval OMPI_ERROR Upon failure
|
|
*
|
|
* This must be the first function invoked in the io MCA
|
|
* framework. It initializes the io MCA framework, finds and
|
|
* opens io components, etc.
|
|
*
|
|
* This function is invoked during ompi_mpi_init() and during the
|
|
* initialization of the special case of the laminfo command.
|
|
*
|
|
* This function fills in the internal global variable
|
|
* mca_io_base_components_opened, which is a list of all io components
|
|
* that were successfully opened. This variable should \em only be
|
|
* used by other io base functions -- it is not considered a
|
|
* public interface member -- and is only mentioned here for
|
|
* completeness.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_open(void);
|
|
|
|
/**
|
|
* Create list of available io components.
|
|
*
|
|
* @param allow_multi_user_threads Will be set to true if any of the
|
|
* available components will allow multiple user threads
|
|
* @param have_hidden_threads Will be set to true if any of the
|
|
* available components have hidden threads.
|
|
*
|
|
* @retval OMPI_SUCCESS If one or more io components are available.
|
|
* @retval OMPI_ERROR If no io components are found to be available.
|
|
*
|
|
* This function is invoked during ompi_mpi_init() to query all
|
|
* successfully opened io components and create a list of all
|
|
* available io components.
|
|
*
|
|
* This function traverses the (internal global variable)
|
|
* mca_io_base_components_opened list and queries each component to see
|
|
* if it ever might want to run during this MPI process. It creates
|
|
* another internal global variable list named
|
|
* mca_io_base_components_available, consisting of a list of components
|
|
* that are available for selection when file handles are created.
|
|
* This variable should \em only be used by other io base
|
|
* functions -- it is not considered a public interface member --
|
|
* and is only mentioned here for completeness.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_find_available(bool enable_progress_threads,
|
|
bool enable_mpi_threads);
|
|
|
|
/**
|
|
* Select an available component for a new file handle.
|
|
*
|
|
* @param file File Handle that the component will be selected for.
|
|
* @param preferred The component that is preferred for this
|
|
* file handle (or NULL).
|
|
*
|
|
* @return OMPI_SUCCESS Upon success.
|
|
* @return OMPI_ERROR Upon failure.
|
|
*
|
|
* Note that the types of the parameters have "struct" in them
|
|
* (e.g., ompi_file_t" vs. a plain "ompi_file_t") to
|
|
* avoid an include file loop. All similar types (e.g., "struct
|
|
* ompi_file_t *", "ompi_file_t *", and "MPI_File")
|
|
* are all typedef'ed to be the same, so the fact that we use struct
|
|
* here in the prototype is ok.
|
|
*
|
|
* This function is invoked when a new file handle is created and a
|
|
* io component needs to be selected for it. It should be invoked
|
|
* near the end of the file handle creation process such that
|
|
* almost everything else is functional on the file handle.
|
|
*
|
|
* This function invokes the selection process for io components,
|
|
* which works as follows:
|
|
*
|
|
* - If the \em preferred argument is NULL, the selection set is
|
|
* defined to be all the components found during
|
|
* mca_io_base_find_available().
|
|
* - If \em preferred is not NULL, then the selection set is just
|
|
* that component. (However, in this mode, we may make 2 passes
|
|
* through the selection process -- more on this below).
|
|
* - All components in the selection set are queried to see if they
|
|
* want to run with that file handle. All components that want to
|
|
* run are ranked by their priority and the highest priority
|
|
* component is selected. All non-selected components have their
|
|
* "unquery" function invoked to let them know that they were not
|
|
* selected.
|
|
* - The selected module will have its "init" function
|
|
* invoked to let it know that it was selected. All unselected
|
|
* components will have their file_unselect function invoked.
|
|
* - If we fall through this entire process and no component is
|
|
* selected \em and the \em preferred argument is not NULL, then
|
|
* run the entire process again as if the \em preferred argument
|
|
* was NULL (i.e., use the entire available set of components).
|
|
*
|
|
* At the end of this process, we'll either have a single
|
|
* component/module pair that is selected and initialized for the
|
|
* file handle, or no component was selected and an error is
|
|
* returned up the stack.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_file_select(struct ompi_file_t *file,
|
|
struct mca_base_component_t *preferred);
|
|
|
|
/**
|
|
* Finalize a io component on a specific file handle.
|
|
*
|
|
* @param file The file handle that is being destroyed.
|
|
*
|
|
* @retval OMPI_SUCCESS Always.
|
|
*
|
|
* Note that the type of the parameter is only a "struct
|
|
* ompi_file_t" (vs. a plain "ompi_file_t") to avoid an include file
|
|
* loop. The types "struct ompi_file_t *", "ompi_file_t *", and
|
|
* "MPI_File" are all typedef'ed to be the same, so the fact that we
|
|
* use struct here in the prototype is ok.
|
|
*
|
|
* This function is invoked near the beginning of the destruction of
|
|
* a file handle. It finalizes the io component associated with the
|
|
* file handle (e.g., allowing the component to clean up and free any
|
|
* resources allocated for that file handle). Note that similar to
|
|
* mca_io_base_select(), as result of this function, other
|
|
* file handles may also be destroyed.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_file_unselect(struct ompi_file_t *file);
|
|
|
|
/**
|
|
* Invoke a back-end component to delete a file.
|
|
*
|
|
* @param filename Name of the file to be deleted
|
|
* @param info MPI_Info for additional information
|
|
*
|
|
* This function is a bit different than most other MPI_File_*
|
|
* functions -- it does not take a MPI_File handle. As such, this
|
|
* function function invokes appropriate delete handlers on all
|
|
* the available components (rather than some pre-selected
|
|
* module). See io.h for details.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_delete(char *filename,
|
|
struct ompi_info_t *info);
|
|
|
|
/**
|
|
* Initialize the components-in-use list.
|
|
*
|
|
* @returns OMPI_SUCCESS Always
|
|
*
|
|
* Creates resources associated with the io framework's
|
|
* currently-in-use list.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_component_init(void);
|
|
|
|
/**
|
|
* Add a comoponent to the io framework's currently-in-use list,
|
|
* or increase its refcount if it's already in the list.
|
|
*
|
|
* @param comp The component being added (union)
|
|
*
|
|
* Add a component to the list of components that is monitored
|
|
* every time we go to make progress on asynchronous requests. If
|
|
* the component is already in the list, its reference count will
|
|
* be increases.
|
|
*
|
|
* For asynchronous progress, opal_progress() will call
|
|
* mca_io_base_progress(), which will go down the list of active
|
|
* io components and call their progress() function.
|
|
*
|
|
* Since components on this list are refcounted; they must be
|
|
* removed with mca_io_base_component_del() for each time that
|
|
* they are added with mca_io_base_component_add(). Once their
|
|
* refcount reaches 0, they are removed from the list and will not
|
|
* be called for asynchronous progress.
|
|
*
|
|
* This function is protected by a mutex; it is safe to call this
|
|
* function from multiple threads simultaneously.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_component_add(mca_io_base_components_t *comp);
|
|
|
|
/**
|
|
* Decrease the refcount of a component in the io framework's
|
|
* currently-in-use list.
|
|
*
|
|
* @param comp The component to be [potentially] removed from the
|
|
* currently-in-use list.
|
|
*
|
|
* Find a component in the currently-in-use list and decrease its
|
|
* refcount. If its refcount goes to 0, it will be removed from
|
|
* the list and will not be polled for asynchonous progress.
|
|
*
|
|
* This function is protected by a mutex; it is safe to call this
|
|
* function from multiple threads simultaneously.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_component_del(mca_io_base_components_t *comp);
|
|
|
|
/**
|
|
* Return all the cached requests on an MPI_File to the global IO
|
|
* request freelist.
|
|
*
|
|
* @param file MPI_File to flush the cache
|
|
*
|
|
*
|
|
*/
|
|
OMPI_DECLSPEC void mca_io_base_request_return(struct ompi_file_t *file);
|
|
|
|
/**
|
|
* Shut down the component list
|
|
*
|
|
* @returns OMPI_SUCCESS Always
|
|
*
|
|
* Destroys resources associated with the io framework's
|
|
* currently-in-use list.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_component_finalize(void);
|
|
|
|
/**
|
|
* Shut down the io MCA framework.
|
|
*
|
|
* @retval OMPI_SUCCESS Always
|
|
*
|
|
* This function shuts down everything in the io MCA framework,
|
|
* and is called during ompi_mpi_finalize() and the special case of
|
|
* the laminfo fileand.
|
|
*
|
|
* It must be the last function invoked on the io MCA framework.
|
|
*/
|
|
OMPI_DECLSPEC int mca_io_base_close(void);
|
|
|
|
OMPI_DECLSPEC int mca_io_base_component_run_progress(void);
|
|
|
|
|
|
/*
|
|
* Globals
|
|
*/
|
|
|
|
/**
|
|
* Index number from the "io" MCA parameter, created when the io
|
|
* framework is initialized and used during scope selection.
|
|
*/
|
|
OMPI_DECLSPEC extern int mca_io_base_param;
|
|
/**
|
|
* io framework debugging stream ID used with opal_output() and
|
|
* opal_output_verbose().
|
|
*/
|
|
OMPI_DECLSPEC extern int mca_io_base_output;
|
|
|
|
/**
|
|
* Indicator as to whether the list of opened io components is valid or
|
|
* not.
|
|
*/
|
|
OMPI_DECLSPEC extern bool mca_io_base_components_opened_valid;
|
|
/**
|
|
* List of all opened components; created when the io framework is
|
|
* initialized and destroyed when we reduce the list to all available
|
|
* io components.
|
|
*/
|
|
OMPI_DECLSPEC extern opal_list_t mca_io_base_components_opened;
|
|
/**
|
|
* Indicator as to whether the list of available io components is valid
|
|
* or not.
|
|
*/
|
|
OMPI_DECLSPEC extern bool mca_io_base_components_available_valid;
|
|
/**
|
|
* List of all available components; created by reducing the list of open
|
|
* components to all those who indicate that they may run during this
|
|
* process.
|
|
*/
|
|
OMPI_DECLSPEC extern opal_list_t mca_io_base_components_available;
|
|
/**
|
|
* Indicator as to whether the freelist of IO requests is valid or
|
|
* not.
|
|
*/
|
|
OMPI_DECLSPEC extern bool mca_io_base_requests_valid;
|
|
/**
|
|
* Free list of IO requests
|
|
*/
|
|
OMPI_DECLSPEC extern ompi_free_list_t mca_io_base_requests;
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
}
|
|
#endif
|
|
#endif /* MCA_BASE_IO_H */
|