X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/84402e8e2ee2a2d0bef25fdceb0a263ed8b471f6..3718b81f92488f30d14590c0b69b13c3843604d5:/src/smpi/mpi/smpi_file.cpp?ds=sidebyside diff --git a/src/smpi/mpi/smpi_file.cpp b/src/smpi/mpi/smpi_file.cpp index b92dbc4115..82c5e2fe5f 100644 --- a/src/smpi/mpi/smpi_file.cpp +++ b/src/smpi/mpi/smpi_file.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -21,7 +21,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_io, smpi, "Logging specific to SMPI (RMA operations)"); -MPI_Errhandler SMPI_default_File_Errhandler = MPI_ERRORS_RETURN; +MPI_Errhandler SMPI_default_File_Errhandler = _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;; namespace simgrid{ namespace smpi{ @@ -30,12 +30,12 @@ namespace smpi{ if (info_ != MPI_INFO_NULL) info_->ref(); std::string fullname=filename; - if (simgrid::s4u::Host::current()->get_disks().empty()) - xbt_die("SMPI/IO : Trying to open file on a diskless host ! Add one to your platform file"); + xbt_assert(not simgrid::s4u::Host::current()->get_disks().empty(), + "SMPI/IO : Trying to open file on a diskless host ! Add one to your platform file"); size_t found=fullname.find('/'); //in case no fullpath is provided ... just pick the first mountpoint. - if(found==std::string::npos){ + if(found==std::string::npos || fullname.rfind("./", 1) != std::string::npos){ auto disk = simgrid::s4u::Host::current()->get_disks().front(); std::string mount; if (disk->get_host() != simgrid::s4u::Host::current()) @@ -43,8 +43,12 @@ namespace smpi{ else mount = disk->extension()->get_mount_point(); XBT_DEBUG("No absolute path given for file opening, use '%s'", mount.c_str()); - mount.append("/"); - fullname.insert(0, mount); + if(fullname.rfind("./",1) != std::string::npos) + fullname.replace(fullname.begin(), fullname.begin() + 1, mount); + else{ + mount.append("/"); + fullname.insert(0, mount); + } } file_= new simgrid::s4u::File(fullname, nullptr); @@ -67,6 +71,7 @@ namespace smpi{ simgrid::smpi::colls::bcast(&shared_mutex_, 1, MPI_AINT, 0, comm); if(comm_->rank() != 0) intrusive_ptr_add_ref(&*shared_mutex_); + this->add_f(); } File::~File(){ @@ -76,6 +81,7 @@ namespace smpi{ } delete win_; delete file_; + F2C::free_f(this->f2c_id()); if (info_ != MPI_INFO_NULL) simgrid::smpi::Info::unref(info_); if (errhandler_ != MPI_ERRHANDLER_NULL) @@ -94,17 +100,19 @@ namespace smpi{ int File::del(const char* filename, const Info*) { //get the file with MPI_MODE_DELETE_ON_CLOSE and then close it - File* f = new File(MPI_COMM_SELF,filename,MPI_MODE_DELETE_ON_CLOSE|MPI_MODE_RDWR, nullptr); + auto* f = new File(MPI_COMM_SELF, filename, MPI_MODE_DELETE_ON_CLOSE | MPI_MODE_RDWR, nullptr); close(&f); return MPI_SUCCESS; } - int File::get_position(MPI_Offset* offset){ + int File::get_position(MPI_Offset* offset) const + { *offset=file_->tell(); return MPI_SUCCESS; } - int File::get_position_shared(MPI_Offset* offset){ + int File::get_position_shared(MPI_Offset* offset) const + { shared_mutex_->lock(); *offset=*shared_file_pointer_; shared_mutex_->unlock(); @@ -113,15 +121,15 @@ namespace smpi{ int File::seek(MPI_Offset offset, int whence){ switch(whence){ - case(MPI_SEEK_SET): + case MPI_SEEK_SET: XBT_VERB("Seeking in MPI_File %s, setting offset %lld", file_->get_path(), offset); file_->seek(offset,SEEK_SET); break; - case(MPI_SEEK_CUR): + case MPI_SEEK_CUR: XBT_VERB("Seeking in MPI_File %s, current offset + %lld", file_->get_path(), offset); file_->seek(offset,SEEK_CUR); break; - case(MPI_SEEK_END): + case MPI_SEEK_END: XBT_VERB("Seeking in MPI_File %s, end offset + %lld", file_->get_path(), offset); file_->seek(offset,SEEK_END); break; @@ -134,12 +142,12 @@ namespace smpi{ int File::seek_shared(MPI_Offset offset, int whence){ shared_mutex_->lock(); seek(offset,whence); - *shared_file_pointer_=offset; + *shared_file_pointer_=file_->tell(); shared_mutex_->unlock(); return MPI_SUCCESS; } - int File::read(MPI_File fh, void* /*buf*/, int count, MPI_Datatype datatype, MPI_Status* status) + int File::read(MPI_File fh, void* /*buf*/, int count, const Datatype* datatype, MPI_Status* status) { //get position first as we may be doing non contiguous reads and it will probably be updated badly MPI_Offset position = fh->file_->tell(); @@ -167,7 +175,8 @@ namespace smpi{ /* address="Berlin, Heidelberg",*/ /* pages="84--93"*/ /* }*/ - int File::read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status){ + int File::read_shared(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status) + { fh->shared_mutex_->lock(); fh->seek(*(fh->shared_file_pointer_),MPI_SEEK_SET); read(fh, buf, count, datatype, status); @@ -176,7 +185,8 @@ namespace smpi{ return MPI_SUCCESS; } - int File::read_ordered(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status){ + int File::read_ordered(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status) + { //0 needs to get the shared pointer value MPI_Offset val; if(fh->comm_->rank()==0){ @@ -199,7 +209,7 @@ namespace smpi{ return ret; } - int File::write(MPI_File fh, void* /*buf*/, int count, MPI_Datatype datatype, MPI_Status* status) + int File::write(MPI_File fh, void* /*buf*/, int count, const Datatype* datatype, MPI_Status* status) { //get position first as we may be doing non contiguous reads and it will probably be updated badly MPI_Offset position = fh->file_->tell(); @@ -217,16 +227,20 @@ namespace smpi{ return MPI_SUCCESS; } - int File::write_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status){ + int File::write_shared(MPI_File fh, const void* buf, int count, const Datatype* datatype, MPI_Status* status) + { fh->shared_mutex_->lock(); + XBT_DEBUG("Write shared on %s - Shared ptr before : %lld",fh->file_->get_path(), *(fh->shared_file_pointer_)); fh->seek(*(fh->shared_file_pointer_),MPI_SEEK_SET); write(fh, const_cast(buf), count, datatype, status); *(fh->shared_file_pointer_)=fh->file_->tell(); + XBT_DEBUG("Write shared on %s - Shared ptr after : %lld",fh->file_->get_path(), *(fh->shared_file_pointer_)); fh->shared_mutex_->unlock(); return MPI_SUCCESS; } - int File::write_ordered(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status){ + int File::write_ordered(MPI_File fh, const void* buf, int count, const Datatype* datatype, MPI_Status* status) + { //0 needs to get the shared pointer value MPI_Offset val; if(fh->comm_->rank()==0){ @@ -257,7 +271,7 @@ namespace smpi{ return MPI_SUCCESS; } - int File::get_view(MPI_Offset* /*disp*/, MPI_Datatype* etype, MPI_Datatype* filetype, char* datarep) + int File::get_view(MPI_Offset* /*disp*/, MPI_Datatype* etype, MPI_Datatype* filetype, char* datarep) const { *etype=etype_; *filetype=filetype_; @@ -265,11 +279,18 @@ namespace smpi{ return MPI_SUCCESS; } - int File::size(){ + int File::size() const + { return file_->size(); } - int File::flags(){ + void File::set_size(int size) + { + file_->write(size, true); + } + + int File::flags() const + { return flags_; } @@ -280,9 +301,6 @@ namespace smpi{ MPI_Info File::info() { - if (info_ == MPI_INFO_NULL) - info_ = new Info(); - info_->ref(); return info_; } @@ -295,7 +313,8 @@ namespace smpi{ info_->ref(); } - MPI_Comm File::comm(){ + MPI_Comm File::comm() const + { return comm_; } @@ -314,5 +333,9 @@ namespace smpi{ if (errhandler_ != MPI_ERRHANDLER_NULL) errhandler_->ref(); } + + File* File::f2c(int id){ + return static_cast(F2C::f2c(id)); + } } }