\r
#include "smpi_comm.hpp"\r
#include "smpi_coll.hpp"\r
+#include "smpi_datatype.hpp"\r
#include "smpi_info.hpp"\r
#include "smpi_file.hpp"\r
#include "simgrid/plugins/file_system.h"\r
File::~File(){\r
delete file_;\r
}\r
- \r
+\r
int File::close(MPI_File *fh){\r
+ XBT_DEBUG("Closing MPI_File %s", (*fh)->file_->get_path());\r
(*fh)->sync();\r
if((*fh)->flags() & MPI_MODE_DELETE_ON_CLOSE)\r
(*fh)->file_->unlink();\r
- delete fh;\r
+ delete (*fh);\r
return MPI_SUCCESS;\r
}\r
- \r
+\r
int File::del(char *filename, MPI_Info info){\r
+ //get the file with MPI_MODE_DELETE_ON_CLOSE and then close it\r
File* f = new File(MPI_COMM_SELF,filename,MPI_MODE_DELETE_ON_CLOSE|MPI_MODE_RDWR, nullptr);\r
close(&f);\r
return MPI_SUCCESS;\r
}\r
+\r
+ int File::seek(MPI_Offset offset, int whence){\r
+ switch(whence){\r
+ case(MPI_SEEK_SET):\r
+ XBT_DEBUG("Seeking in MPI_File %s, setting offset %lld", file_->get_path(), offset);\r
+ file_->seek(offset,SEEK_SET);\r
+ break;\r
+ case(MPI_SEEK_CUR):\r
+ XBT_DEBUG("Seeking in MPI_File %s, current offset + %lld", file_->get_path(), offset);\r
+ file_->seek(offset,SEEK_CUR);\r
+ break;\r
+ case(MPI_SEEK_END):\r
+ XBT_DEBUG("Seeking in MPI_File %s, end offset + %lld", file_->get_path(), offset);\r
+ file_->seek(offset,SEEK_END);\r
+ break;\r
+ default:\r
+ return MPI_ERR_FILE;\r
+ }\r
+ return MPI_SUCCESS;\r
+ }\r
\r
+ int File::read(void *buf, int count, MPI_Datatype datatype, MPI_Status *status){\r
+ //get position first as we may be doing non contiguous reads and it will probably be updated badly\r
+ MPI_Offset position = file_->tell();\r
+ MPI_Offset movesize = datatype->get_extent()*count;\r
+ MPI_Offset readsize = datatype->size()*count;\r
+ XBT_DEBUG("Position before read in MPI_File %s : %llu",file_->get_path(),file_->tell());\r
+ MPI_Offset read = file_->read(readsize);\r
+ XBT_DEBUG("Read in MPI_File %s, %lld bytes read, readsize %lld bytes, movesize %lld", file_->get_path(), read, readsize, movesize);\r
+ if(readsize!=movesize){\r
+ file_->seek(position+movesize, SEEK_SET);\r
+ }\r
+ XBT_DEBUG("Position after read in MPI_File %s : %llu",file_->get_path(), file_->tell());\r
+ return MPI_SUCCESS;\r
+ }\r
+\r
int File::size(){\r
return file_->size();\r
}\r
- \r
+\r
int File::flags(){\r
return flags_;\r
}\r
+\r
int File::sync(){\r
//no idea\r
return simgrid::smpi::Colls::barrier(comm_);\r
}\r
}\r
-}
\ No newline at end of file
+}\r