1 // -*- c++ -*-
2 //
3 // Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
4 //                         University Research and Technology
5 //                         Corporation.  All rights reserved.
6 // Copyright (c) 2004-2005 The University of Tennessee and The University
7 //                         of Tennessee Research Foundation.  All rights
8 //                         reserved.
9 // Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
10 //                         University of Stuttgart.  All rights reserved.
11 // Copyright (c) 2004-2005 The Regents of the University of California.
12 //                         All rights reserved.
13 // Copyright (c) 2006-2009 Cisco Systems, Inc.  All rights reserved.
14 // $COPYRIGHT$
15 //
16 // Additional copyrights may follow
17 //
18 // $HEADER$
19 //
20 
21 // Typedefs for C++ callbacks registered via MPI::Register_datarep
22 typedef void Datarep_extent_function(const Datatype& datatype,
23                                      Aint& file_extent, void* extra_state);
24 typedef void Datarep_conversion_function(void* userbuf, Datatype& datatype,
25                                          int count, void* filebuf,
26                                          Offset position, void* extra_state);
27 
28 // Both callback functions in C++
29 void Register_datarep(const char* datarep,
30                       Datarep_conversion_function* read_conversion_fn,
31                       Datarep_conversion_function* write_conversion_fn,
32                       Datarep_extent_function* dtype_file_extent_fn,
33                       void* extra_state);
34 
35 // Overload for C read callback function (MPI_CONVERSION_FN_NULL)
36 void Register_datarep(const char* datarep,
37                       MPI_Datarep_conversion_function* read_conversion_fn,
38                       Datarep_conversion_function* write_conversion_fn,
39                       Datarep_extent_function* dtype_file_extent_fn,
40                       void* extra_state);
41 
42 // Overload for C write callback function (MPI_CONVERSION_FN_NULL)
43 void Register_datarep(const char* datarep,
44                       Datarep_conversion_function* read_conversion_fn,
45                       MPI_Datarep_conversion_function* write_conversion_fn,
46                       Datarep_extent_function* dtype_file_extent_fn,
47                       void* extra_state);
48 
49 // Overload for C read and write callback functions (MPI_CONVERSION_FN_NULL)
50 void Register_datarep(const char* datarep,
51                       MPI_Datarep_conversion_function* read_conversion_fn,
52                       MPI_Datarep_conversion_function* write_conversion_fn,
53                       Datarep_extent_function* dtype_file_extent_fn,
54                       void* extra_state);
55 
56 class File {
57 #if 0 /* OMPI_ENABLE_MPI_PROFILING */
58   //  friend class P;
59 
60 #endif
61   friend class MPI::Comm; //so I can access pmpi_file data member in comm.cc
62   friend class MPI::Request; //and also from request.cc
63 
64 public:
65 #if 0 /* OMPI_ENABLE_MPI_PROFILING */
66 
67   // construction / destruction
68   File() { }
69   virtual ~File() { }
70 
71 
72   // copy / assignment
73   File(const File& data) : pmpi_file(data.pmpi_file) { }
74 
75   File(MPI_File i) : pmpi_file(i) { }
76 
77   File& operator=(const File& data) {
78     pmpi_file = data.pmpi_file; return *this; }
79 
80   // comparison, don't need for file
81 
82   // inter-language operability
83   File& operator= (const MPI_File &i) {
84     pmpi_file = i; return *this; }
85   operator MPI_File () const { return pmpi_file; }
86   //  operator MPI_File* () const { return pmpi_file; }
87   operator const PMPI::File&() const { return pmpi_file; }
88 
89 #else
90 
File()91   File() : mpi_file(MPI_FILE_NULL) { }
92   // copy
File(const File & data)93   File(const File& data) : mpi_file(data.mpi_file) { }
94 
File(MPI_File i)95   File(MPI_File i) : mpi_file(i) { }
96 
~File()97   virtual ~File() { }
98 
99   File& operator=(const File& data) {
100     mpi_file = data.mpi_file; return *this; }
101 
102   // comparison, don't need for file
103 
104   // inter-language operability
105   File& operator= (const MPI_File &i) {
106     mpi_file = i; return *this; }
MPI_File()107   operator MPI_File () const { return mpi_file; }
108   //  operator MPI_File* () const { return (MPI_File*)&mpi_file; }
109 
110 #endif
111 
112   // from the I/o chapter of MPI - 2
113 
114   void Close();
115 
116   static void Delete(const char* filename, const MPI::Info& info);
117 
118   int Get_amode() const;
119 
120   bool Get_atomicity() const;
121 
122   MPI::Offset Get_byte_offset(const MPI::Offset disp) const;
123 
124   MPI::Group Get_group() const;
125 
126   MPI::Info Get_info() const;
127 
128   MPI::Offset Get_position() const;
129 
130   MPI::Offset Get_position_shared() const;
131 
132   MPI::Offset Get_size() const;
133 
134   MPI::Aint Get_type_extent(const MPI::Datatype& datatype) const;
135 
136   void Get_view(MPI::Offset& disp, MPI::Datatype& etype,
137 		MPI::Datatype& filetype, char* datarep) const;
138 
139   MPI::Request Iread(void* buf, int count,
140 		     const MPI::Datatype& datatype);
141 
142   MPI::Request Iread_at(MPI::Offset offset, void* buf, int count,
143 			const MPI::Datatype& datatype);
144 
145   MPI::Request Iread_shared(void* buf, int count,
146 			    const MPI::Datatype& datatype);
147 
148   MPI::Request Iwrite(const void* buf, int count,
149 		       const MPI::Datatype& datatype);
150 
151   MPI::Request Iwrite_at(MPI::Offset offset, const void* buf,
152 			 int count,  const MPI::Datatype& datatype);
153 
154   MPI::Request Iwrite_shared(const void* buf, int count,
155 			      const MPI::Datatype& datatype);
156 
157   static MPI::File Open(const MPI::Intracomm& comm,
158 			const char* filename, int amode,
159 			const MPI::Info& info);
160 
161   void Preallocate(MPI::Offset size);
162 
163   void Read(void* buf, int count, const MPI::Datatype& datatype);
164 
165   void Read(void* buf, int count, const MPI::Datatype& datatype,
166 	    MPI::Status& status);
167 
168   void Read_all(void* buf, int count, const MPI::Datatype& datatype);
169 
170   void Read_all(void* buf, int count, const MPI::Datatype& datatype,
171 		MPI::Status& status);
172 
173   void Read_all_begin(void* buf, int count,
174 		      const MPI::Datatype& datatype);
175 
176   void Read_all_end(void* buf);
177 
178   void Read_all_end(void* buf, MPI::Status& status);
179 
180   void Read_at(MPI::Offset offset,
181 	       void* buf, int count,  const MPI::Datatype& datatype);
182 
183   void Read_at(MPI::Offset offset, void* buf, int count,
184 	       const MPI::Datatype& datatype, MPI::Status& status);
185 
186   void Read_at_all(MPI::Offset offset, void* buf, int count,
187 		   const MPI::Datatype& datatype);
188 
189   void Read_at_all(MPI::Offset offset, void* buf, int count,
190 		   const MPI::Datatype& datatype, MPI::Status& status);
191 
192   void Read_at_all_begin(MPI::Offset offset, void* buf, int count,
193 			 const MPI::Datatype& datatype);
194 
195   void Read_at_all_end(void* buf);
196 
197   void Read_at_all_end(void* buf, MPI::Status& status);
198 
199   void Read_ordered(void* buf, int count,
200 		    const MPI::Datatype& datatype);
201 
202   void Read_ordered(void* buf, int count,
203 		    const MPI::Datatype& datatype,
204 		    MPI::Status& status);
205 
206   void Read_ordered_begin(void* buf, int count,
207 			  const MPI::Datatype& datatype);
208 
209   void Read_ordered_end(void* buf);
210 
211   void Read_ordered_end(void* buf, MPI::Status& status);
212 
213   void Read_shared(void* buf, int count,
214 		   const MPI::Datatype& datatype);
215 
216   void Read_shared(void* buf, int count,
217 		   const MPI::Datatype& datatype, MPI::Status& status);
218 
219   void Seek(MPI::Offset offset, int whence);
220 
221   void Seek_shared(MPI::Offset offset, int whence);
222 
223   void Set_atomicity(bool flag);
224 
225   void Set_info(const MPI::Info& info);
226 
227   void Set_size(MPI::Offset size);
228 
229   void Set_view(MPI::Offset disp,  const MPI::Datatype& etype,
230 		const MPI::Datatype& filetype, const char* datarep,
231 		const MPI::Info& info);
232 
233   void Sync();
234 
235   void Write(const void* buf, int count,
236 	      const MPI::Datatype& datatype);
237 
238   void Write(const void* buf, int count,
239 	      const MPI::Datatype& datatype, MPI::Status& status);
240 
241   void Write_all(const void* buf, int count,
242 		  const MPI::Datatype& datatype);
243 
244   void Write_all(const void* buf, int count,
245 		  const MPI::Datatype& datatype, MPI::Status& status);
246 
247   void Write_all_begin(const void* buf, int count,
248 			const MPI::Datatype& datatype);
249 
250   void Write_all_end(const void* buf);
251 
252   void Write_all_end(const void* buf, MPI::Status& status);
253 
254   void Write_at(MPI::Offset offset,  const void* buf, int count,
255 		const MPI::Datatype& datatype);
256 
257   void Write_at(MPI::Offset offset,  const void* buf, int count,
258 		const MPI::Datatype& datatype, MPI::Status& status);
259 
260   void Write_at_all(MPI::Offset offset,  const void* buf, int count,
261 		    const MPI::Datatype& datatype);
262 
263   void Write_at_all(MPI::Offset offset,  const void* buf, int count,
264 		    const MPI::Datatype& datatype,
265   			     MPI::Status& status);
266 
267   void Write_at_all_begin(MPI::Offset offset, const void* buf,
268 			  int count,  const MPI::Datatype& datatype);
269 
270   void Write_at_all_end(const void* buf);
271 
272   void Write_at_all_end(const void* buf, MPI::Status& status);
273 
274   void Write_ordered(const void* buf, int count,
275 		      const MPI::Datatype& datatype);
276 
277   void Write_ordered(const void* buf, int count,
278 		      const MPI::Datatype& datatype, MPI::Status& status);
279 
280   void Write_ordered_begin(const void* buf, int count,
281 			    const MPI::Datatype& datatype);
282 
283   void Write_ordered_end(const void* buf);
284 
285   void Write_ordered_end(const void* buf, MPI::Status& status);
286 
287   void Write_shared(const void* buf, int count,
288 		     const MPI::Datatype& datatype);
289 
290   void Write_shared(const void* buf, int count,
291 		     const MPI::Datatype& datatype, MPI::Status& status);
292 
293   //
294   // Errhandler
295   //
296   typedef void Errhandler_function(MPI::File &, int *, ... );
297   typedef Errhandler_function Errhandler_fn
298         __mpi_interface_deprecated__("MPI::File::Errhandler_fn was deprecated in MPI-2.2; use MPI::File::Errhandler_function instead");
299 
300   static MPI::Errhandler Create_errhandler(Errhandler_function* function);
301 
302   MPI::Errhandler Get_errhandler() const;
303 
304   void Set_errhandler(const MPI::Errhandler& errhandler) const;
305 
306   void Call_errhandler(int errorcode) const;
307 
308 protected:
309 #if 0 /* OMPI_ENABLE_MPI_PROFILING */
310       PMPI::File pmpi_file;
311 
312 #else
313   MPI_File mpi_file;
314 
315 #endif
316 };
317 
318