-/* Copyright (c) 2013-2017. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2013-2019. 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. */
#include "StorageImpl.hpp"
-
+#include "simgrid/s4u/Engine.hpp"
+#include "src/kernel/EngineImpl.hpp"
+#include "src/kernel/lmm/maxmin.hpp"
#include "surf_private.hpp"
-#include <algorithm>
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/join.hpp>
-#include <boost/algorithm/string/split.hpp>
-#include <fstream>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module");
-simgrid::surf::StorageModel* surf_storage_model = nullptr;
+simgrid::kernel::resource::StorageModel* surf_storage_model = nullptr;
namespace simgrid {
-namespace surf {
-
-/*************
- * Callbacks *
- *************/
-
-simgrid::xbt::signal<void(StorageImpl*)> storageCreatedCallbacks;
-simgrid::xbt::signal<void(StorageImpl*)> storageDestructedCallbacks;
-simgrid::xbt::signal<void(StorageImpl*, int, int)> storageStateChangedCallbacks; // signature: wasOn, isOn
-simgrid::xbt::signal<void(StorageAction*, Action::State, Action::State)> storageActionStateChangedCallbacks;
-
-/* List of storages */
-std::unordered_map<std::string, StorageImpl*>* StorageImpl::storages =
- new std::unordered_map<std::string, StorageImpl*>();
-
-StorageImpl* StorageImpl::byName(std::string name)
-{
- if (storages->find(name) == storages->end())
- return nullptr;
- return storages->at(name);
-}
+namespace kernel {
+namespace resource {
/*********
* Model *
*********/
-StorageModel::StorageModel() : Model()
+StorageModel::StorageModel() : Model(Model::UpdateAlgo::FULL)
{
- maxminSystem_ = lmm_system_new(true /* lazy update */);
+ set_maxmin_system(new simgrid::kernel::lmm::System(true /* selective update */));
}
StorageModel::~StorageModel()
{
- lmm_system_free(maxminSystem_);
surf_storage_model = nullptr;
}
* Resource *
************/
-StorageImpl::StorageImpl(Model* model, std::string name, lmm_system_t maxminSystem, double bread, double bwrite,
- std::string type_id, std::string content_name, sg_size_t size, std::string attach)
- : Resource(model, name.c_str(), lmm_constraint_new(maxminSystem, this, std::max(bread, bwrite)))
- , piface_(this)
+StorageImpl::StorageImpl(kernel::resource::Model* model, const std::string& name, kernel::lmm::System* maxminSystem,
+ double bread, double bwrite, const std::string& type_id, const std::string& content_name,
+ sg_size_t size, const std::string& attach)
+ : Resource(model, name, maxminSystem->constraint_new(this, std::max(bread, bwrite)))
+ , piface_(name, this)
, typeId_(type_id)
+ , content_name_(content_name)
, size_(size)
, attach_(attach)
{
- content_ = parseContent(content_name);
- StorageImpl::turnOn();
+ StorageImpl::turn_on();
XBT_DEBUG("Create resource with Bread '%f' Bwrite '%f' and Size '%llu'", bread, bwrite, size);
- constraintRead_ = lmm_constraint_new(maxminSystem, this, bread);
- constraintWrite_ = lmm_constraint_new(maxminSystem, this, bwrite);
- storages->insert({name, this});
+ constraint_read_ = maxminSystem->constraint_new(this, bread);
+ constraint_write_ = maxminSystem->constraint_new(this, bwrite);
}
StorageImpl::~StorageImpl()
{
- storageDestructedCallbacks(this);
- if (content_ != nullptr)
- delete content_;
+ xbt_assert(currently_destroying_, "Don't delete Storages directly. Call destroy() instead.");
}
-std::map<std::string, sg_size_t>* StorageImpl::parseContent(std::string filename)
+/** @brief Fire the required callbacks and destroy the object
+ *
+ * Don't delete directly a Storage, call s->destroy() instead.
+ */
+void StorageImpl::destroy()
{
- usedSize_ = 0;
- if (filename.empty())
- return nullptr;
-
- std::map<std::string, sg_size_t>* parse_content = new std::map<std::string, sg_size_t>();
-
- std::ifstream* fs = surf_ifsopen(filename);
-
- std::string line;
- std::vector<std::string> tokens;
- do {
- std::getline(*fs, line);
- boost::trim(line);
- if (line.length() > 0) {
- boost::split(tokens, line, boost::is_any_of(" \t"), boost::token_compress_on);
- xbt_assert(tokens.size() == 2, "Parse error in %s: %s", filename.c_str(), line.c_str());
- sg_size_t size = std::stoull(tokens.at(1));
-
- usedSize_ += size;
- parse_content->insert({tokens.front(), size});
- }
- } while (not fs->eof());
- delete fs;
- return parse_content;
+ if (not currently_destroying_) {
+ currently_destroying_ = true;
+ s4u::Storage::on_destruction(this->piface_);
+ delete this;
+ }
}
-bool StorageImpl::isUsed()
+bool StorageImpl::is_used()
{
THROW_UNIMPLEMENTED;
- return false;
}
-void StorageImpl::apply_event(tmgr_trace_event_t /*event*/, double /*value*/)
+void StorageImpl::apply_event(kernel::profile::Event* /*event*/, double /*value*/)
{
THROW_UNIMPLEMENTED;
}
-void StorageImpl::turnOn()
+void StorageImpl::turn_on()
{
- if (isOff()) {
- Resource::turnOn();
- storageStateChangedCallbacks(this, 0, 1);
+ if (not is_on()) {
+ Resource::turn_on();
+ s4u::Storage::on_state_change(this->piface_);
}
}
-void StorageImpl::turnOff()
+void StorageImpl::turn_off()
{
- if (isOn()) {
- Resource::turnOff();
- storageStateChangedCallbacks(this, 1, 0);
+ if (is_on()) {
+ Resource::turn_off();
+ s4u::Storage::on_state_change(this->piface_);
}
}
-
-std::map<std::string, sg_size_t>* StorageImpl::getContent()
-{
- /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
- return content_;
-}
-
-sg_size_t StorageImpl::getFreeSize()
-{
- return size_ - usedSize_;
-}
-
-sg_size_t StorageImpl::getUsedSize()
-{
- return usedSize_;
-}
+xbt::signal<void(StorageAction const&, kernel::resource::Action::State, kernel::resource::Action::State)>
+ StorageAction::on_state_change;
/**********
* Action *
**********/
-void StorageAction::setState(Action::State state)
+void StorageAction::set_state(Action::State state)
{
- Action::State old = getState();
- Action::setState(state);
- storageActionStateChangedCallbacks(this, old, state);
-}
-}
+ Action::State old = get_state();
+ Action::set_state(state);
+ on_state_change(*this, old, state);
}
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid