1/*
2 * Copyright (C) by Argonne National Laboratory
3 *     See COPYRIGHT in top-level directory
4 */
5
6/* user include file for MPI-IO programs */
7
8#ifndef MPIO_INCLUDE
9#define MPIO_INCLUDE
10
11#include "mpi.h"
12
13#if defined(HAVE_VISIBILITY)
14#define ROMIO_API_PUBLIC __attribute__((visibility ("default")))
15#else
16#define ROMIO_API_PUBLIC
17#endif
18
19#if defined(__cplusplus)
20extern "C" {
21#endif
22
23#define ROMIO_VERSION 126 /* version 1.2.6 */
24
25/* define MPI-IO datatypes and constants */
26
27#ifndef MPI_FILE_DEFINED
28typedef struct ADIOI_FileD *MPI_File;
29#endif
30
31/* *INDENT-OFF* */
32@DEFINE_HAVE_MPI_GREQUEST@
33/* *INDENT-ON* */
34#ifndef HAVE_MPI_GREQUEST
35typedef struct ADIOI_RequestD *MPIO_Request;
36#else
37#define MPIO_Request MPI_Request
38#define MPIO_USES_MPI_REQUEST
39/* Also rename the MPIO routines to get the MPI versions */
40#define MPIO_Wait MPI_Wait
41#define MPIO_Test MPI_Test
42#define PMPIO_Wait PMPI_Wait
43#define PMPIO_Test PMPI_Test
44#endif
45#define MPIO_REQUEST_DEFINED
46
47#ifndef HAVE_MPI_OFFSET
48/* *INDENT-OFF* */
49@DEFINE_MPI_OFFSET@
50/* *INDENT-ON* */
51/* If we needed to define MPI_Offset, then we also need to make
52   this definition. */
53#ifndef HAVE_MPI_DATAREP_FUNCTIONS
54#define HAVE_MPI_DATAREP_FUNCTIONS
55typedef int (MPI_Datarep_conversion_function)(void *, MPI_Datatype, int,
56             void *, MPI_Offset, void *);
57typedef int (MPI_Datarep_extent_function)(MPI_Datatype datatype, MPI_Aint *,
58					  void *);
59#endif
60#endif
61
62#ifndef NEEDS_MPI_FINT
63/* *INDENT-OFF* */
64@NEEDS_MPI_FINT@
65/* *INDENT-ON* */
66#endif
67#ifdef NEEDS_MPI_FINT
68typedef int MPI_Fint;
69#endif
70
71#ifndef HAVE_MPI_INFO
72/* *INDENT-OFF* */
73@HAVE_MPI_INFO@
74/* *INDENT-ON* */
75#endif
76#ifndef HAVE_MPI_INFO
77  typedef struct MPIR_Info *MPI_Info;
78# define MPI_INFO_NULL         ((MPI_Info) 0)
79# define MPI_MAX_INFO_KEY       255
80# define MPI_MAX_INFO_VAL      1024
81#endif
82
83#define MPI_MODE_RDONLY              2  /* ADIO_RDONLY */
84#define MPI_MODE_RDWR                8  /* ADIO_RDWR  */
85#define MPI_MODE_WRONLY              4  /* ADIO_WRONLY  */
86#define MPI_MODE_CREATE              1  /* ADIO_CREATE */
87#define MPI_MODE_EXCL               64  /* ADIO_EXCL */
88#define MPI_MODE_DELETE_ON_CLOSE    16  /* ADIO_DELETE_ON_CLOSE */
89#define MPI_MODE_UNIQUE_OPEN        32  /* ADIO_UNIQUE_OPEN */
90#define MPI_MODE_APPEND            128  /* ADIO_APPEND */
91#define MPI_MODE_SEQUENTIAL        256  /* ADIO_SEQUENTIAL */
92
93#define MPI_DISPLACEMENT_CURRENT   -54278278
94
95#ifndef MPICH
96/* FIXME: Make sure that we get a consistent definition of MPI_FILE_NULL
97	in MPICH */
98/* MPICH defines null object handles differently */
99#define MPI_FILE_NULL           ((MPI_File) 0)
100#endif
101#define MPIO_REQUEST_NULL       ((MPIO_Request) 0)
102
103#define MPI_SEEK_SET            600
104#define MPI_SEEK_CUR            602
105#define MPI_SEEK_END            604
106
107/* Open MPI: don't define MPI_MAX_DATAREP_STRING here; it's defined in
108   OMPI's mpi.h. */
109#ifndef OPEN_MPI
110#define MPI_MAX_DATAREP_STRING  128
111#endif
112
113#ifndef HAVE_MPI_DARRAY_SUBARRAY
114/* *INDENT-OFF* */
115@HAVE_MPI_DARRAY_SUBARRAY@
116/* *INDENT-ON* */
117#endif
118#ifndef HAVE_MPI_DARRAY_SUBARRAY
119#  define MPI_ORDER_C             56
120#  define MPI_ORDER_FORTRAN       57
121#  define MPI_DISTRIBUTE_BLOCK    121
122#  define MPI_DISTRIBUTE_CYCLIC   122
123#  define MPI_DISTRIBUTE_NONE     123
124#  define MPI_DISTRIBUTE_DFLT_DARG -49767
125#endif
126
127
128/* MPI-IO function prototypes */
129
130/* The compiler must support ANSI C style prototypes, otherwise
131   long long constants (e.g. 0) may get passed as ints. */
132
133#ifndef HAVE_PRAGMA_HP_SEC_DEF
134
135/* Section 9.2 */
136/* Begin Prototypes */
137int MPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh) ROMIO_API_PUBLIC;
138int MPI_File_close(MPI_File *fh) ROMIO_API_PUBLIC;
139int MPI_File_delete(const char *filename, MPI_Info info) ROMIO_API_PUBLIC;
140int MPI_File_set_size(MPI_File fh, MPI_Offset size) ROMIO_API_PUBLIC;
141int MPI_File_preallocate(MPI_File fh, MPI_Offset size) ROMIO_API_PUBLIC;
142int MPI_File_get_size(MPI_File fh, MPI_Offset *size) ROMIO_API_PUBLIC;
143int MPI_File_get_group(MPI_File fh, MPI_Group *group) ROMIO_API_PUBLIC;
144int MPI_File_get_amode(MPI_File fh, int *amode) ROMIO_API_PUBLIC;
145int MPI_File_set_info(MPI_File fh, MPI_Info info) ROMIO_API_PUBLIC;
146int MPI_File_get_info(MPI_File fh, MPI_Info *info_used) ROMIO_API_PUBLIC;
147
148/* Section 9.3 */
149int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Datatype filetype,
150                      const char *datarep, MPI_Info info) ROMIO_API_PUBLIC;
151int MPI_File_get_view(MPI_File fh, MPI_Offset *disp, MPI_Datatype *etype, MPI_Datatype *filetype,
152                      char *datarep) ROMIO_API_PUBLIC;
153
154/* Section 9.4.2 */
155int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
156                     MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
157int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void * buf, int count,
158                         MPI_Datatype datatype, MPI_Status *status)
159    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
160int MPI_File_write_at(MPI_File fh, MPI_Offset offset, const void * buf, int count,
161                      MPI_Datatype datatype, MPI_Status *status)
162    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
163int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
164                          MPI_Datatype datatype, MPI_Status *status)
165    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
166
167/* nonblocking calls currently use MPIO_Request, because generalized
168   requests not yet implemented. For the same reason, MPIO_Test and
169   MPIO_Wait are used to test and wait on nonblocking I/O requests */
170int MPI_File_iread_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
171                      MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
172int MPI_File_iwrite_at(MPI_File fh, MPI_Offset offset, const void *buf, int count,
173                       MPI_Datatype datatype, MPIO_Request *request)
174    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
175
176/* Section 9.4.3 */
177int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status)
178    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
179int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status)
180    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
181int MPI_File_write(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
182                   MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
183int MPI_File_write_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
184                       MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
185
186/* nonblocking calls currently use MPIO_Request, because generalized
187   requests not yet implemented. For the same reason, MPIO_Test and
188   MPIO_Wait are used to test and wait on nonblocking I/O requests */
189
190int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPIO_Request *request)
191    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
192int MPI_File_iwrite(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
193                    MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
194
195int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence) ROMIO_API_PUBLIC;
196int MPI_File_get_position(MPI_File fh, MPI_Offset *offset) ROMIO_API_PUBLIC;
197int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp) ROMIO_API_PUBLIC;
198
199/* Section 9.4.4 */
200int MPI_File_read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
201                         MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
202int MPI_File_write_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
203                          MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
204int MPI_File_iread_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
205                          MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
206int MPI_File_iwrite_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
207                           MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
208int MPI_File_read_ordered(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
209                          MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
210int MPI_File_write_ordered(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
211                           MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
212int MPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence) ROMIO_API_PUBLIC;
213int MPI_File_get_position_shared(MPI_File fh, MPI_Offset *offset) ROMIO_API_PUBLIC;
214
215/* Section 9.4.5 */
216int MPI_File_read_at_all_begin(MPI_File fh, MPI_Offset offset, void *buf, int count,
217                               MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
218int MPI_File_read_at_all_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
219int MPI_File_write_at_all_begin(MPI_File fh, MPI_Offset offset, const void *buf, int count,
220                                MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
221int MPI_File_write_at_all_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
222int MPI_File_read_all_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype)
223    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
224int MPI_File_read_all_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
225int MPI_File_write_all_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype)
226    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
227int MPI_File_write_all_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
228int MPI_File_read_ordered_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype)
229    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
230int MPI_File_read_ordered_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
231int MPI_File_write_ordered_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype)
232    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
233int MPI_File_write_ordered_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
234
235/* Section 9.5.1 */
236int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype, MPI_Aint *extent) ROMIO_API_PUBLIC;
237
238/* Section 9.5.3 */
239int MPI_Register_datarep(const char *datarep, MPI_Datarep_conversion_function *read_conversion_fn,
240			 MPI_Datarep_conversion_function *write_conversion_fn,
241			 MPI_Datarep_extent_function *dtype_file_extent_fn, void *extra_state) ROMIO_API_PUBLIC;
242
243/* Section 9.6.1 */
244int MPI_File_set_atomicity(MPI_File fh, int flag) ROMIO_API_PUBLIC;
245int MPI_File_get_atomicity(MPI_File fh, int *flag) ROMIO_API_PUBLIC;
246int MPI_File_sync(MPI_File fh) ROMIO_API_PUBLIC;
247
248/* Section 4.13.3 */
249#ifndef MPICH
250/* MPICH provides these definitions */
251int MPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler) ROMIO_API_PUBLIC;
252int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler) ROMIO_API_PUBLIC;
253#endif
254
255/* For MPI 3.1 */
256int MPI_File_iread_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,
257                           MPI_Datatype datatype, MPI_Request *request)
258    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
259int MPI_File_iwrite_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
260                            MPI_Datatype datatype, MPI_Request *request)
261    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
262int MPI_File_iread_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
263                        MPI_Request *request)
264    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
265int MPI_File_iwrite_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
266                         MPI_Request *request)
267    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
268/* End Prototypes */
269
270#ifndef HAVE_MPI_DARRAY_SUBARRAY
271/* Section 4.14.4 */
272int MPI_Type_create_subarray(int ndims, const int array_of_sizes[], const int array_of_subsizes[],
273                             const int array_of_starts[], int order, MPI_Datatype oldtype,
274                             MPI_Datatype *newtype) ROMIO_API_PUBLIC;
275
276/* Section 4.14.5 */
277int MPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsizes[],
278                           const int array_of_distribs[], const int array_of_dargs[],
279                           const int array_of_psizes, int order, MPI_Datatype oldtype,
280                           MPI_Datatype *newtype) ROMIO_API_PUBLIC;
281#endif
282
283/* The globus2 device has to rename MPI_ symbols in order to use the vendor
284   MPI as one of its transport mechanisms.  Therefore, the following undefines
285   should only happen if MPICH_RENAMING_MPI_FUNCS is not defined. */
286/* Section 4.12.4 */
287#if !defined(MPICH_RENAMING_MPI_FUNCS)
288#ifdef MPI_File_f2c
289#undef MPI_File_f2c
290#endif
291#ifdef MPI_File_c2f
292#undef MPI_File_c2f
293#endif
294#endif
295/* above needed for some versions of mpi.h in MPICH!! */
296MPI_File MPI_File_f2c(MPI_Fint file) ROMIO_API_PUBLIC;
297MPI_Fint MPI_File_c2f(MPI_File file) ROMIO_API_PUBLIC;
298
299
300#ifndef HAVE_MPI_GREQUEST
301/* The following functions are required if generalized requests are not
302   available, because in that case, an MPIO_Request object
303   is currently used for nonblocking I/O. */
304int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status) ROMIO_API_PUBLIC;
305int MPIO_Wait(MPIO_Request *request, MPI_Status *status) ROMIO_API_PUBLIC;
306int MPIO_Testall(int count, MPIO_Request array_of_requests[], int *flag,
307                 MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
308int MPIO_Waitall(int count, MPIO_Request array_of_requests[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
309int MPIO_Testany(int count, MPIO_Request array_of_requests[], int *indx, int *flag,
310                 MPI_Status *status) ROMIO_API_PUBLIC;
311int MPIO_Waitany(int count, MPIO_Request array_of_requests[], int *indx, MPI_Status *status) ROMIO_API_PUBLIC;
312int MPIO_Waitsome(int incount, MPIO_Request array_of_requests[], int *outcount,
313                  int array_of_indices[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
314int MPIO_Testsome(int incount, MPIO_Request array_of_requests[], int *outcount,
315                  int array_of_indices[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
316
317MPI_Fint MPIO_Request_c2f(MPIO_Request request) ROMIO_API_PUBLIC;
318MPIO_Request MPIO_Request_f2c(MPI_Fint request) ROMIO_API_PUBLIC;
319#endif /* HAVE_MPI_GREQUEST */
320
321/* info functions if not defined in the MPI implementation */
322#ifndef HAVE_MPI_INFO
323
324int MPI_Info_create(MPI_Info *info) ROMIO_API_PUBLIC;
325int MPI_Info_set(MPI_Info info, const char *key, const char *value) ROMIO_API_PUBLIC;
326int MPI_Info_delete(MPI_Info info, const char *key) ROMIO_API_PUBLIC;
327int MPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag) ROMIO_API_PUBLIC;
328int MPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag) ROMIO_API_PUBLIC;
329int MPI_Info_get_nkeys(MPI_Info info, int *nkeys) ROMIO_API_PUBLIC;
330int MPI_Info_get_nthkey(MPI_Info info, int n, char *key) ROMIO_API_PUBLIC;
331int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo) ROMIO_API_PUBLIC;
332int MPI_Info_free(MPI_Info *info) ROMIO_API_PUBLIC;
333
334/* The globus2 device has to rename MPI_ symbols in order to use the vendor
335   MPI as one of its transport mechanisms.  Therefore, the following undefines
336   should only happen if MPICH_RENAMING_MPI_FUNCS is not defined. */
337#if !defined(MPICH_RENAMING_MPI_FUNCS)
338#ifdef MPI_Info_f2c
339#undef MPI_Info_f2c
340#endif
341#ifdef MPI_Info_c2f
342#undef MPI_Info_c2f
343#endif
344#endif
345/* above needed for some versions of mpi.h in MPICH!! */
346MPI_Fint MPI_Info_c2f(MPI_Info info) ROMIO_API_PUBLIC;
347MPI_Info MPI_Info_f2c(MPI_Fint info) ROMIO_API_PUBLIC;
348#endif
349
350#endif   /* HAVE_PRAGMA_HP_SEC_DEF */
351
352
353/**************** BINDINGS FOR THE PROFILING INTERFACE ***************/
354
355
356/* Section 9.2 */
357int PMPI_File_open(MPI_Comm, const char *, int, MPI_Info, MPI_File *) ROMIO_API_PUBLIC;
358int PMPI_File_close(MPI_File *) ROMIO_API_PUBLIC;
359int PMPI_File_delete(const char *, MPI_Info) ROMIO_API_PUBLIC;
360int PMPI_File_set_size(MPI_File, MPI_Offset) ROMIO_API_PUBLIC;
361int PMPI_File_preallocate(MPI_File, MPI_Offset) ROMIO_API_PUBLIC;
362int PMPI_File_get_size(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
363int PMPI_File_get_group(MPI_File, MPI_Group *) ROMIO_API_PUBLIC;
364int PMPI_File_get_amode(MPI_File, int *) ROMIO_API_PUBLIC;
365int PMPI_File_set_info(MPI_File, MPI_Info) ROMIO_API_PUBLIC;
366int PMPI_File_get_info(MPI_File, MPI_Info *) ROMIO_API_PUBLIC;
367
368/* Section 9.3 */
369int PMPI_File_set_view(MPI_File, MPI_Offset,
370    MPI_Datatype, MPI_Datatype, const char *, MPI_Info) ROMIO_API_PUBLIC;
371int PMPI_File_get_view(MPI_File, MPI_Offset *,
372      MPI_Datatype *, MPI_Datatype *, char *) ROMIO_API_PUBLIC;
373
374/* Section 9.4.2 */
375int PMPI_File_read_at(MPI_File, MPI_Offset, void *,
376	      int, MPI_Datatype, MPI_Status *)
377              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
378int PMPI_File_read_at_all(MPI_File, MPI_Offset, void *,
379	      int, MPI_Datatype, MPI_Status *)
380              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
381int PMPI_File_write_at(MPI_File, MPI_Offset, const void *,
382	      int, MPI_Datatype, MPI_Status *)
383              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
384int PMPI_File_write_at_all(MPI_File, MPI_Offset, const void *,
385	      int, MPI_Datatype, MPI_Status *)
386              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
387
388/* nonblocking calls currently use MPIO_Request, because generalized
389   requests not yet implemented. For the same reason, MPIO_Test and
390   MPIO_Wait are used to test and wait on nonblocking I/O requests */
391
392int PMPI_File_iread_at(MPI_File, MPI_Offset, void *,
393	      int, MPI_Datatype, MPIO_Request *)
394              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
395int PMPI_File_iwrite_at(MPI_File, MPI_Offset, const void *,
396	      int, MPI_Datatype, MPIO_Request *)
397              MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
398
399/* Section 9.4.3 */
400int PMPI_File_read(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
401                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
402int PMPI_File_read_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
403                       MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
404int PMPI_File_write(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
405                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
406int PMPI_File_write_all(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
407                        MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
408
409/* nonblocking calls currently use MPIO_Request, because generalized
410   requests not yet implemented. For the same reason, MPIO_Test and
411   MPIO_Wait are used to test and wait on nonblocking I/O requests */
412
413int PMPI_File_iread(MPI_File, void *, int, MPI_Datatype, MPIO_Request *)
414                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
415int PMPI_File_iwrite(MPI_File, const void *, int, MPI_Datatype, MPIO_Request *)
416                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
417
418int PMPI_File_seek(MPI_File, MPI_Offset, int) ROMIO_API_PUBLIC;
419int PMPI_File_get_position(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
420int PMPI_File_get_byte_offset(MPI_File, MPI_Offset, MPI_Offset *) ROMIO_API_PUBLIC;
421
422/* Section 9.4.4 */
423int PMPI_File_read_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
424                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
425int PMPI_File_write_shared(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
426                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
427int PMPI_File_iread_shared(MPI_File, void *, int,
428			   MPI_Datatype, MPIO_Request *)
429                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
430int PMPI_File_iwrite_shared(MPI_File, const void *, int,
431			    MPI_Datatype, MPIO_Request *)
432                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
433int PMPI_File_read_ordered(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
434                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
435int PMPI_File_write_ordered(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
436                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
437int PMPI_File_seek_shared(MPI_File, MPI_Offset, int) ROMIO_API_PUBLIC;
438int PMPI_File_get_position_shared(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
439
440/* Section 9.4.5 */
441int PMPI_File_read_at_all_begin(MPI_File, MPI_Offset, void *,
442                               int, MPI_Datatype)
443                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
444int PMPI_File_read_at_all_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
445int PMPI_File_write_at_all_begin(MPI_File, MPI_Offset, const void *,
446                                 int, MPI_Datatype)
447                                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
448int PMPI_File_write_at_all_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
449int PMPI_File_read_all_begin(MPI_File, void *, int, MPI_Datatype)
450                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
451int PMPI_File_read_all_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
452int PMPI_File_write_all_begin(MPI_File, const void *, int, MPI_Datatype)
453                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
454int PMPI_File_write_all_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
455int PMPI_File_read_ordered_begin(MPI_File, void *, int, MPI_Datatype)
456                                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
457int PMPI_File_read_ordered_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
458int PMPI_File_write_ordered_begin(MPI_File, const void *, int, MPI_Datatype)
459                                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
460int PMPI_File_write_ordered_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
461
462/* Section 9.5.1 */
463int PMPI_File_get_type_extent(MPI_File, MPI_Datatype, MPI_Aint *) ROMIO_API_PUBLIC;
464
465/* Section 9.5.3 */
466int PMPI_Register_datarep(const char *,
467			 MPI_Datarep_conversion_function *,
468			 MPI_Datarep_conversion_function *,
469			 MPI_Datarep_extent_function *,
470			 void *) ROMIO_API_PUBLIC;
471
472/* Section 9.6.1 */
473int PMPI_File_set_atomicity(MPI_File, int) ROMIO_API_PUBLIC;
474int PMPI_File_get_atomicity(MPI_File, int *) ROMIO_API_PUBLIC;
475int PMPI_File_sync(MPI_File) ROMIO_API_PUBLIC;
476
477/* Section 4.13.3 */
478#ifndef MPICH
479/* MPICH provides these definitions */
480int PMPI_File_set_errhandler( MPI_File, MPI_Errhandler ) ROMIO_API_PUBLIC;
481int PMPI_File_get_errhandler( MPI_File, MPI_Errhandler * ) ROMIO_API_PUBLIC;
482#endif
483
484/* For MPI 3.1 */
485int PMPI_File_iread_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,
486                            MPI_Datatype datatype, MPI_Request *request)
487    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
488int PMPI_File_iwrite_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
489                             MPI_Datatype datatype, MPI_Request *request)
490    MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
491int PMPI_File_iread_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
492                         MPI_Request *request)
493    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
494int PMPI_File_iwrite_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
495                          MPI_Request *request)
496    MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
497
498#ifndef HAVE_MPI_DARRAY_SUBARRAY
499/* Section 4.14.4 */
500int PMPI_Type_create_subarray(int, int *, int *, int *, int,
501                      MPI_Datatype, MPI_Datatype *) ROMIO_API_PUBLIC;
502
503/* Section 4.14.5 */
504int PMPI_Type_create_darray(int, int, int, int *, int *,
505                    int *, int *, int, MPI_Datatype, MPI_Datatype *) ROMIO_API_PUBLIC;
506#endif
507
508/* Section 4.12.4 */
509MPI_File PMPI_File_f2c(MPI_Fint) ROMIO_API_PUBLIC;
510MPI_Fint PMPI_File_c2f(MPI_File) ROMIO_API_PUBLIC;
511
512#ifndef HAVE_MPI_GREQUEST
513/* The following functions are required if generalized requests are not
514   available, because in that case, an MPIO_Request object
515   is currently used for nonblocking I/O. */
516int PMPIO_Test(MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
517int PMPIO_Wait(MPIO_Request *, MPI_Status *) ROMIO_API_PUBLIC;
518int PMPIO_Testall(int, MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
519int PMPIO_Waitall(int, MPIO_Request *, MPI_Status *) ROMIO_API_PUBLIC;
520int PMPIO_Testany(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
521int PMPIO_Waitany(int, MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
522int PMPIO_Waitsome(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
523int PMPIO_Testsome(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
524MPI_Fint PMPIO_Request_c2f(MPIO_Request) ROMIO_API_PUBLIC;
525MPIO_Request PMPIO_Request_f2c(MPI_Fint) ROMIO_API_PUBLIC;
526#endif /* HAVE_MPI_GREQUEST */
527
528/* info functions if not defined in the MPI implementation */
529#ifndef HAVE_MPI_INFO
530
531int PMPI_Info_create(MPI_Info *) ROMIO_API_PUBLIC;
532int PMPI_Info_set(MPI_Info, char *, char *) ROMIO_API_PUBLIC;
533int PMPI_Info_delete(MPI_Info, char *) ROMIO_API_PUBLIC;
534int PMPI_Info_get(MPI_Info, char *, int, char *, int *) ROMIO_API_PUBLIC;
535int PMPI_Info_get_valuelen(MPI_Info, char *, int *, int *) ROMIO_API_PUBLIC;
536int PMPI_Info_get_nkeys(MPI_Info, int *) ROMIO_API_PUBLIC;
537int PMPI_Info_get_nthkey(MPI_Info, int, char *) ROMIO_API_PUBLIC;
538int PMPI_Info_dup(MPI_Info, MPI_Info *) ROMIO_API_PUBLIC;
539int PMPI_Info_free(MPI_Info *) ROMIO_API_PUBLIC;
540
541MPI_Fint PMPI_Info_c2f(MPI_Info) ROMIO_API_PUBLIC;
542MPI_Info PMPI_Info_f2c(MPI_Fint) ROMIO_API_PUBLIC;
543#endif
544
545#if defined(__cplusplus)
546}
547#endif
548
549#endif
550