Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove unused type definitions.
[simgrid.git] / src / surf / StorageImpl.cpp
index d15ab37..18c9ac6 100644 (file)
@@ -1,59 +1,33 @@
-/* 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 "surf_private.h"
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/join.hpp>
-#include <boost/algorithm/string/split.hpp>
-#include <fstream>
+#include "simgrid/s4u/Engine.hpp"
+#include "src/kernel/EngineImpl.hpp"
+#include "src/kernel/lmm/maxmin.hpp"
+#include "surf_private.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module");
 
-xbt_lib_t storage_lib;
-int MSG_STORAGE_LEVEL                           = -1; // Msg storage level
-int SURF_STORAGE_LEVEL                          = -1;
-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(const char* 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;
 }
 
@@ -61,130 +35,76 @@ StorageModel::~StorageModel()
  * Resource *
  ************/
 
-StorageImpl::StorageImpl(Model* model, const char* name, lmm_system_t maxminSystem, double bread, double bwrite,
-                         const char* type_id, const char* content_name, sg_size_t size, const char* attach)
-    : Resource(model, name, lmm_constraint_new(maxminSystem, this, 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)
-    , usedSize_(0)
-    , typeId_(xbt_strdup(type_id))
-    , writeActions_(std::vector<StorageAction*>())
+    , attach_(attach)
 {
-  content_ = parseContent(content_name);
-  attach_  = xbt_strdup(attach);
-  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});
+  constraintRead_  = maxminSystem->constraint_new(this, bread);
+  constraintWrite_ = maxminSystem->constraint_new(this, bwrite);
 }
 
 StorageImpl::~StorageImpl()
 {
-  storageDestructedCallbacks(this);
-  if (content_ != nullptr) {
-    for (auto entry : *content_)
-      delete entry.second;
-    delete content_;
-  }
-  free(typeId_);
-  free(attach_);
+  xbt_assert(currentlyDestroying_, "Don't delete Storages directly. Call destroy() instead.");
 }
 
-std::map<std::string, sg_size_t*>* StorageImpl::parseContent(const char* 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 ((not filename) || (strcmp(filename, "") == 0))
-    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, line.c_str());
-      sg_size_t size = std::stoull(tokens.at(1));
-
-      usedSize_ += size;
-      sg_size_t* psize = new sg_size_t;
-      *psize           = size;
-      parse_content->insert({tokens.front(), psize});
-    }
-  } while (not fs->eof());
-  delete fs;
-  return parse_content;
+  if (not currentlyDestroying_) {
+    currentlyDestroying_ = 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*, kernel::resource::Action::State, kernel::resource::Action::State)>
+    StorageAction::on_state_change;
 
 /**********
  * Action *
  **********/
-StorageAction::StorageAction(Model* model, double cost, bool failed, StorageImpl* storage,
-                             e_surf_action_storage_type_t type)
-    : Action(model, cost, failed), type_(type), storage_(storage), file_(nullptr)
-{
-  progress_ = 0;
-};
-
-StorageAction::StorageAction(Model* model, double cost, bool failed, lmm_variable_t var, StorageImpl* storage,
-                             e_surf_action_storage_type_t type)
-    : Action(model, cost, failed, var), type_(type), storage_(storage), file_(nullptr)
-{
-  progress_ = 0;
-}
-
-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