Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
35e36d4e4c1f83d5413224d87e3ff2990820a735
[simgrid.git] / src / smpi / mpi / smpi_file.cpp
1 /* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved.          */\r
2 \r
3 /* This program is free software; you can redistribute it and/or modify it\r
4  * under the terms of the license (GNU LGPL) which comes with this package. */\r
5 #include "private.hpp"\r
6 \r
7 #include "smpi_comm.hpp"\r
8 #include "smpi_coll.hpp"\r
9 #include "smpi_datatype.hpp"\r
10 #include "smpi_info.hpp"\r
11 #include "smpi_file.hpp"\r
12 #include "simgrid/plugins/file_system.h"\r
13 \r
14 \r
15 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_io, smpi, "Logging specific to SMPI (RMA operations)");\r
16 \r
17 \r
18 namespace simgrid{\r
19 namespace smpi{\r
20   File::File(MPI_Comm comm, char *filename, int amode, MPI_Info info): comm_(comm), flags_(amode), info_(info){\r
21     file_= new simgrid::s4u::File(filename, nullptr);\r
22   }\r
23   \r
24   File::~File(){\r
25     delete file_;\r
26   }\r
27 \r
28   int File::close(MPI_File *fh){\r
29     XBT_DEBUG("Closing MPI_File %s", (*fh)->file_->get_path());\r
30     (*fh)->sync();\r
31     if((*fh)->flags() & MPI_MODE_DELETE_ON_CLOSE)\r
32       (*fh)->file_->unlink();\r
33     delete (*fh);\r
34     return MPI_SUCCESS;\r
35   }\r
36 \r
37   int File::del(char *filename, MPI_Info info){\r
38     //get the file with MPI_MODE_DELETE_ON_CLOSE and then close it\r
39     File* f = new File(MPI_COMM_SELF,filename,MPI_MODE_DELETE_ON_CLOSE|MPI_MODE_RDWR, nullptr);\r
40     close(&f);\r
41     return MPI_SUCCESS;\r
42   }\r
43 \r
44   int File::seek(MPI_Offset offset, int whence){\r
45     switch(whence){\r
46       case(MPI_SEEK_SET):\r
47         XBT_DEBUG("Seeking in MPI_File %s, setting offset %lld", file_->get_path(), offset);\r
48         file_->seek(offset,SEEK_SET);\r
49         break;\r
50       case(MPI_SEEK_CUR):\r
51         XBT_DEBUG("Seeking in MPI_File %s, current offset + %lld", file_->get_path(), offset);\r
52         file_->seek(offset,SEEK_CUR);\r
53         break;\r
54       case(MPI_SEEK_END):\r
55         XBT_DEBUG("Seeking in MPI_File %s, end offset + %lld", file_->get_path(), offset);\r
56         file_->seek(offset,SEEK_END);\r
57         break;\r
58       default:\r
59         return MPI_ERR_FILE;\r
60     }\r
61     return MPI_SUCCESS;\r
62   }\r
63   \r
64   int File::read(void *buf, int count, MPI_Datatype datatype, MPI_Status *status){\r
65     //get position first as we may be doing non contiguous reads and it will probably be updated badly\r
66     MPI_Offset position = file_->tell();\r
67     MPI_Offset movesize = datatype->get_extent()*count;\r
68     MPI_Offset readsize = datatype->size()*count;\r
69     XBT_DEBUG("Position before read in MPI_File %s : %llu",file_->get_path(),file_->tell());\r
70     MPI_Offset read = file_->read(readsize);\r
71     XBT_DEBUG("Read in MPI_File %s, %lld bytes read, readsize %lld bytes, movesize %lld", file_->get_path(), read, readsize, movesize);\r
72     if(readsize!=movesize){\r
73       file_->seek(position+movesize, SEEK_SET);\r
74     }\r
75     XBT_DEBUG("Position after read in MPI_File %s : %llu",file_->get_path(), file_->tell());\r
76     return MPI_SUCCESS;\r
77   }\r
78 \r
79   int File::size(){\r
80     return file_->size();\r
81   }\r
82 \r
83   int File::flags(){\r
84     return flags_;\r
85   }\r
86 \r
87   int File::sync(){\r
88     //no idea\r
89     return simgrid::smpi::Colls::barrier(comm_);\r
90   }\r
91 }\r
92 }\r