X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/827b5fc241bd5cd1c65354d0566197196179ab84..a4e7a60bca6c13451f237201eb5a7534e5da0838:/src/surf/FileImpl.cpp diff --git a/src/surf/FileImpl.cpp b/src/surf/FileImpl.cpp index 59530a92de..d190065cb0 100644 --- a/src/surf/FileImpl.cpp +++ b/src/surf/FileImpl.cpp @@ -5,12 +5,59 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/surf/FileImpl.hpp" -#include "src/surf/HostImpl.hpp" +#include "src/surf/StorageImpl.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_file, surf, "Logging specific to the SURF file module"); namespace simgrid { namespace surf { +FileImpl::FileImpl(sg_storage_t st, std::string path, std::string mount) : path_(path), mount_point_(mount) +{ + XBT_DEBUG("\tOpen file '%s'", path.c_str()); + location_ = st->getImpl(); + std::map* content = location_->getContent(); + // if file does not exist create an empty file + auto sz = content->find(path); + if (sz != content->end()) { + size_ = sz->second; + } else { + size_ = 0; + content->insert({path, size_}); + XBT_DEBUG("File '%s' was not found, file created.", path.c_str()); + } +} + +Action* FileImpl::read(sg_size_t size) +{ + XBT_DEBUG("READ %s on disk '%s'", getCname(), location_->getCname()); + if (current_position_ + size > size_) { + if (current_position_ > size_) { + size = 0; + } else { + size = size_ - current_position_; + } + current_position_ = size_; + } else + current_position_ += size; + + return location_->read(size); +} + +Action* FileImpl::write(sg_size_t size) +{ + XBT_DEBUG("WRITE %s on disk '%s'. size '%llu/%llu'", getCname(), location_->getCname(), size, size_); + + StorageAction* action = location_->write(size); + action->file_ = this; + /* Substract the part of the file that might disappear from the used sized on the storage element */ + location_->usedSize_ -= (size_ - current_position_); + // If the storage is full before even starting to write + if (location_->usedSize_ >= location_->getSize()) { + action->setState(Action::State::failed); + } + return action; +} + int FileImpl::seek(sg_offset_t offset, int origin) { switch (origin) { @@ -28,40 +75,40 @@ int FileImpl::seek(sg_offset_t offset, int origin) } } -int FileImpl::unlink(sg_host_t host) +int FileImpl::unlink() { - simgrid::surf::StorageImpl* st = host->pimpl_->findStorageOnMountList(mount_point_.c_str()); /* Check if the file is on this storage */ - if (st->content_->find(path_) == st->content_->end()) { - XBT_WARN("File %s is not on disk %s. Impossible to unlink", cname(), st->cname()); + if (location_->getContent()->find(path_) == location_->getContent()->end()) { + XBT_WARN("File %s is not on disk %s. Impossible to unlink", getCname(), location_->getCname()); return -1; } else { - XBT_DEBUG("UNLINK %s on disk '%s'", cname(), st->cname()); - st->usedSize_ -= size_; + XBT_DEBUG("UNLINK %s on disk '%s'", getCname(), location_->getCname()); + location_->usedSize_ -= size_; // Remove the file from storage - st->content_->erase(path_); + location_->getContent()->erase(path_); return 0; } } -void FileImpl::move(sg_host_t host, const char* fullpath) +void FileImpl::move(std::string fullpath) { /* Check if the new full path is on the same mount point */ - if (not strncmp(mount_point_.c_str(), fullpath, mount_point_.size())) { - std::map* content = host->pimpl_->findStorageOnMountList(mount_point_.c_str())->content_; - if (content->find(path_) != content->end()) { // src file exists - sg_size_t new_size = content->at(path_); + if (not strncmp(mount_point_.c_str(), fullpath.c_str(), mount_point_.size())) { + std::map* content = location_->getContent(); + auto sz = content->find(path_); + if (sz != content->end()) { // src file exists + sg_size_t new_size = sz->second; content->erase(path_); - std::string path = std::string(fullpath).substr(mount_point_.size(), strlen(fullpath)); + std::string path = fullpath.substr(mount_point_.length(), fullpath.length()); content->insert({path.c_str(), new_size}); - XBT_DEBUG("Move file from %s to %s, size '%llu'", path_.c_str(), fullpath, new_size); + XBT_DEBUG("Move file from %s to %s, size '%llu'", path_.c_str(), fullpath.c_str(), new_size); } else { XBT_WARN("File %s doesn't exist", path_.c_str()); } } else { - XBT_WARN("New full path %s is not on the same mount point: %s.", fullpath, mount_point_.c_str()); + XBT_WARN("New full path %s is not on the same mount point: %s.", fullpath.c_str(), mount_point_.c_str()); } } }