Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Test using macros for arguments checking, saves some duplicated lines.
[simgrid.git] / src / smpi / mpi / smpi_file.cpp
index 4cfbe05..1beffe9 100644 (file)
@@ -6,6 +6,7 @@
 \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
@@ -23,31 +24,73 @@ namespace smpi{
   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(MPI_File fh, 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 = fh->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",fh->file_->get_path(),fh->file_->tell());\r
+    MPI_Offset read = fh->file_->read(readsize);\r
+    XBT_DEBUG("Read in MPI_File %s, %lld bytes read, readsize %lld bytes, movesize %lld", fh->file_->get_path(), read, readsize, movesize);\r
+    if(readsize!=movesize){\r
+      fh->file_->seek(position+movesize, SEEK_SET);\r
+    }\r
+    XBT_DEBUG("Position after read in MPI_File %s : %llu",fh->file_->get_path(), fh->file_->tell());\r
+    return MPI_SUCCESS;\r
+  }\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