-/* 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. */
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;
-
/*********
* Model *
*********/
-StorageModel::StorageModel() : Model()
+StorageModel::StorageModel() : Model(Model::UpdateAlgo::FULL)
{
set_maxmin_system(new simgrid::kernel::lmm::System(true /* selective update */));
}
* Resource *
************/
-StorageImpl::StorageImpl(kernel::resource::Model* model, std::string name, kernel::lmm::System* maxminSystem,
+StorageImpl::StorageImpl(kernel::resource::Model* model, const 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)))
+ : Resource(model, name, maxminSystem->constraint_new(this, std::max(bread, bwrite)))
, piface_(name, this)
- , typeId_(type_id)
- , content_name(content_name)
+ , typeId_(std::move(type_id))
+ , content_name(std::move(content_name))
, size_(size)
- , attach_(attach)
+ , attach_(std::move(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);
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()
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 *
{
Action::State old = get_state();
Action::set_state(state);
- storageActionStateChangedCallbacks(this, old, state);
+ on_state_change(this, old, state);
}
}
}