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