Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Python: Add Comm.wait_any
[simgrid.git] / src / surf / StorageImpl.cpp
index 4d4d01a..18c9ac6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2018. 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. */
 
 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*, kernel::resource::Action::State, kernel::resource::Action::State)>
-    storageActionStateChangedCallbacks;
+namespace kernel {
+namespace resource {
 
 /*********
  * Model *
  *********/
 
-StorageModel::StorageModel() : Model()
+StorageModel::StorageModel() : Model(Model::UpdateAlgo::FULL)
 {
   set_maxmin_system(new simgrid::kernel::lmm::System(true /* selective update */));
 }
@@ -44,17 +35,17 @@ StorageModel::~StorageModel()
  * Resource *
  ************/
 
-StorageImpl::StorageImpl(kernel::resource::Model* model, std::string name, kernel::lmm::System* 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(), maxminSystem->constraint_new(this, std::max(bread, bwrite)))
+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)
 {
-  StorageImpl::turnOn();
+  StorageImpl::turn_on();
   XBT_DEBUG("Create resource with Bread '%f' Bwrite '%f' and Size '%llu'", bread, bwrite, size);
   constraintRead_  = maxminSystem->constraint_new(this, bread);
   constraintWrite_ = maxminSystem->constraint_new(this, bwrite);
@@ -62,34 +53,48 @@ StorageImpl::StorageImpl(kernel::resource::Model* model, std::string name, kerne
 
 StorageImpl::~StorageImpl()
 {
-  storageDestructedCallbacks(this);
+  xbt_assert(currentlyDestroying_, "Don't delete Storages directly. Call destroy() instead.");
+}
+
+/** @brief Fire the required callbacks and destroy the object
+ *
+ * Don't delete directly a Storage, call s->destroy() instead.
+ */
+void StorageImpl::destroy()
+{
+  if (not currentlyDestroying_) {
+    currentlyDestroying_ = true;
+    s4u::Storage::on_destruction(this->piface_);
+    delete this;
+  }
 }
 
 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_);
   }
 }
+xbt::signal<void(StorageAction*, kernel::resource::Action::State, kernel::resource::Action::State)>
+    StorageAction::on_state_change;
 
 /**********
  * Action *
@@ -98,7 +103,8 @@ void StorageAction::set_state(Action::State state)
 {
   Action::State old = get_state();
   Action::set_state(state);
-  storageActionStateChangedCallbacks(this, old, state);
-}
-}
+  on_state_change(this, old, state);
 }
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid