1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. 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
*
* This is the base request type for all IO requests.
*/
#ifndef IO_BASE_REQUEST_H
#define IO_BASE_REQUEST_H
#include "opal/class/opal_object.h"
#include "ompi/request/request.h"
#include "ompi/file/file.h"
#include "ompi/mca/io/base/base.h"
/**
* Base request type.
*/
struct mca_io_base_request_t {
/** Base request */
ompi_request_t super;
/** ompi_file_t of the file that owns this request */
ompi_file_t *req_file;
/** io component version number of the module that owns this
request (i.e., this defines what follows this entry in
memory) */
mca_io_base_version_t req_ver;
/** True if free has been called on this request (before it has
been finalized */
volatile bool free_called;
};
/**
* Convenience typedef
*/
typedef struct mca_io_base_request_t mca_io_base_request_t;
/**
* Declare the class
*/
OBJ_CLASS_DECLARATION(mca_io_base_request_t);
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
/**
* Setup freelist of IO requests
*
* @returns OMPI_SUCCESS upon success
*
* Initialize the IO freelist of requests, making each request be
* the size of the base IO request plus the maxiumum number of
* bytes from all the available IO components.
*/
int mca_io_base_request_create_freelist(void);
/**
* Get a new IO request
*
* @param fh The file handle
* @param req Pointer to an IO base request
*
* @returns OMPI_SUCCESS on success
* @returns err otherwise
*
* This function allocates an MPI_Request (ompi_request_t)
* according to the io module that is selected on the file handle.
* Specifically, it mallocs enough contiguous space for an
* ompi_request_t, an mca_io_base_request_t, and the value of
* io_cache_bytes from the selected module. This allows all three
* entities to have space allocated in one contiguous chunk.
*
* This function will either allocate an initialize a new request
* (in which case it will call the module's request init
* function), or it will take an old request off a cache of
* already-created requests. Either way, the return is a new IO
* request that is suitable for use by the selected module.
*
* For optimization reasons, only minimal error checking is
* performed.
*/
int mca_io_base_request_alloc(ompi_file_t *file,
mca_io_base_request_t **req);
/**
* Return a module-specific IO MPI_Request.
*
* @param fh The file handle
* @param req The request to return
*
* Returns a module-specific IO request when it has completed.
* This request may actually be freed (in which case it will call
* the IO module's fini function before freeing it) or it may be
* placed on a freelist.
*
* The req argument is set to MPI_REQUEST_NULL upon return.
*
* For optimization reasons, \em no error checking is performed.
*/
void mca_io_base_request_free(ompi_file_t *file,
mca_io_base_request_t *req);
/*
* count of number of pending requests in the IO subsystem. Should
* only be modified with OPAL_THREAD_ADD32. Probably should not be
* used outside of IO components. Here only for the progress check
* optimzation.
*/
OMPI_DECLSPEC extern volatile int32_t mca_io_base_request_num_pending;
/**
* Initialize the request progress code
*
*/
void mca_io_base_request_progress_init(void);
/**
*
*/
void mca_io_base_request_progress_add(void);
/**
*
*/
void mca_io_base_request_progress_del(void);
/**
* Finalize the request progress code
*/
void mca_io_base_request_progress_fini(void);
/**
* External progress function; invoked from opal_progress()
*/
static inline int mca_io_base_request_progress(void)
{
if (mca_io_base_request_num_pending > 0) {
return mca_io_base_component_run_progress();
}
return 0;
}
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif
#endif
|