X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/147c486afe8c6315e76e1dba5b8ba803636d0755..67bdf5427542ebb33da6978c6ae422a763ea0ab3:/src/surf/cpu_ti.cpp diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index d65cf3330c..462b8065d7 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -6,6 +6,7 @@ #include "cpu_ti.hpp" #include "src/surf/trace_mgr.hpp" +#include "xbt/utility.hpp" #include #ifndef SURF_MODEL_CPUTI_H_ @@ -326,18 +327,9 @@ void surf_cpu_model_init_ti() namespace simgrid { namespace surf { -CpuTiModel::CpuTiModel() : CpuModel() -{ - runningActionSetThatDoesNotNeedBeingChecked_ = new ActionList(); - - modifiedCpu_ = new CpuTiList(); -} - CpuTiModel::~CpuTiModel() { surf_cpu_model_pm = nullptr; - delete runningActionSetThatDoesNotNeedBeingChecked_; - delete modifiedCpu_; } Cpu *CpuTiModel::createCpu(simgrid::s4u::Host *host, std::vector* speedPerPstate, int core) @@ -350,7 +342,7 @@ double CpuTiModel::nextOccuringEvent(double now) double min_action_duration = -1; /* iterates over modified cpus to update share resources */ - for (auto it = std::begin(*modifiedCpu_); it != std::end(*modifiedCpu_);) { + for (auto it = std::begin(modifiedCpu_); it != std::end(modifiedCpu_);) { CpuTi& ti = *it; ++it; // increment iterator here since the following call to ti.updateActionsFinishTime() may invalidate it ti.updateActionsFinishTime(now); @@ -387,8 +379,6 @@ CpuTi::CpuTi(CpuTiModel *model, simgrid::s4u::Host *host, std::vector *s xbt_assert(core==1,"Multi-core not handled by this model yet"); coresAmount_ = core; - actionSet_ = new ActionTiList(); - speed_.peak = speedPerPstate->front(); XBT_DEBUG("CPU create: peak=%f", speed_.peak); @@ -399,7 +389,6 @@ CpuTi::~CpuTi() { modified(false); delete speedIntegratedTrace_; - delete actionSet_; } void CpuTi::setSpeedTrace(tmgr_trace_t trace) { @@ -450,7 +439,7 @@ void CpuTi::apply_event(tmgr_trace_event_t event, double value) double date = surf_get_clock(); /* put all action running on cpu to failed */ - for (CpuTiAction& action : *actionSet_) { + for (CpuTiAction& action : actionSet_) { if (action.getState() == Action::State::running || action.getState() == Action::State::ready || action.getState() == Action::State::not_in_the_system) { action.setFinishTime(date); @@ -474,7 +463,7 @@ void CpuTi::updateActionsFinishTime(double now) /* update remaining amount of actions */ updateRemainingAmount(now); - for (CpuTiAction const& action : *actionSet_) { + for (CpuTiAction const& action : actionSet_) { /* action not running, skip it */ if (action.getStateSet() != surf_cpu_model_pm->getRunningActionSet()) continue; @@ -484,21 +473,21 @@ void CpuTi::updateActionsFinishTime(double now) continue; /* action suspended, skip it */ - if (action.suspended_ != 0) + if (action.suspended_ != Action::SuspendStates::not_suspended) continue; sum_priority += 1.0 / action.getPriority(); } sumPriority_ = sum_priority; - for (CpuTiAction& action : *actionSet_) { + for (CpuTiAction& action : actionSet_) { double min_finish = -1; /* action not running, skip it */ if (action.getStateSet() != surf_cpu_model_pm->getRunningActionSet()) continue; /* verify if the action is really running on cpu */ - if (action.suspended_ == 0 && action.getPriority() > 0) { + if (action.suspended_ == Action::SuspendStates::not_suspended && action.getPriority() > 0) { /* total area needed to finish the action. Used in trace integration */ total_area = (action.getRemains()) * sum_priority * action.getPriority(); @@ -531,7 +520,7 @@ void CpuTi::updateActionsFinishTime(double now) bool CpuTi::isUsed() { - return not actionSet_->empty(); + return not actionSet_.empty(); } double CpuTi::getAvailableSpeed() @@ -551,7 +540,7 @@ void CpuTi::updateRemainingAmount(double now) /* compute the integration area */ double area_total = speedIntegratedTrace_->integrate(lastUpdate_, now) * speed_.peak; XBT_DEBUG("Flops total: %f, Last update %f", area_total, lastUpdate_); - for (CpuTiAction& action : *actionSet_) { + for (CpuTiAction& action : actionSet_) { /* action not running, skip it */ if (action.getStateSet() != model()->getRunningActionSet()) continue; @@ -561,7 +550,7 @@ void CpuTi::updateRemainingAmount(double now) continue; /* action suspended, skip it */ - if (action.suspended_ != 0) + if (action.suspended_ != Action::SuspendStates::not_suspended) continue; /* action don't need update */ @@ -584,7 +573,7 @@ CpuAction *CpuTi::execution_start(double size) XBT_IN("(%s,%g)", getCname(), size); CpuTiAction* action = new CpuTiAction(static_cast(model()), size, isOff(), this); - actionSet_->push_back(*action); + actionSet_.push_back(*action); XBT_OUT(); return action; @@ -600,31 +589,29 @@ CpuAction *CpuTi::sleep(double duration) CpuTiAction* action = new CpuTiAction(static_cast(model()), 1.0, isOff(), this); action->setMaxDuration(duration); - action->suspended_ = 2; + action->suspended_ = Action::SuspendStates::sleeping; if (duration == NO_MAX_DURATION) { - /* Move to the *end* of the corresponding action set. This convention - is used to speed up update_resource_state */ - action->getStateSet()->erase(action->getStateSet()->iterator_to(*action)); - action->stateSet_ = static_cast(model())->runningActionSetThatDoesNotNeedBeingChecked_; - action->getStateSet()->push_back(*action); + /* Move to the *end* of the corresponding action set. This convention is used to speed up update_resource_state */ + simgrid::xbt::intrusive_erase(*action->getStateSet(), *action); + action->stateSet_ = &static_cast(model())->runningActionSetThatDoesNotNeedBeingChecked_; + action->getStateSet()->push_back(*action); } - actionSet_->push_back(*action); + actionSet_.push_back(*action); XBT_OUT(); return action; } void CpuTi::modified(bool modified){ - CpuTiList* modifiedCpu = static_cast(model())->modifiedCpu_; + CpuTiList& modifiedCpu = static_cast(model())->modifiedCpu_; if (modified) { if (not cpu_ti_hook.is_linked()) { - modifiedCpu->push_back(*this); + modifiedCpu.push_back(*this); } } else { - if (cpu_ti_hook.is_linked()) { - modifiedCpu->erase(modifiedCpu->iterator_to(*this)); - } + if (cpu_ti_hook.is_linked()) + simgrid::xbt::intrusive_erase(modifiedCpu, *this); } } @@ -650,10 +637,10 @@ int CpuTiAction::unref() refcount_--; if (not refcount_) { if (action_hook.is_linked()) - getStateSet()->erase(getStateSet()->iterator_to(*this)); + simgrid::xbt::intrusive_erase(*getStateSet(), *this); /* remove from action_set */ if (action_ti_hook.is_linked()) - cpu_->actionSet_->erase(cpu_->actionSet_->iterator_to(*this)); + simgrid::xbt::intrusive_erase(cpu_->actionSet_, *this); /* remove from heap */ heapRemove(getModel()->getActionHeap()); cpu_->modified(true); @@ -673,8 +660,8 @@ void CpuTiAction::cancel() void CpuTiAction::suspend() { XBT_IN("(%p)", this); - if (suspended_ != 2) { - suspended_ = 1; + if (suspended_ != Action::SuspendStates::sleeping) { + suspended_ = Action::SuspendStates::suspended; heapRemove(getModel()->getActionHeap()); cpu_->modified(true); } @@ -684,8 +671,8 @@ void CpuTiAction::suspend() void CpuTiAction::resume() { XBT_IN("(%p)", this); - if (suspended_ != 2) { - suspended_ = 0; + if (suspended_ != Action::SuspendStates::sleeping) { + suspended_ = Action::SuspendStates::not_suspended; cpu_->modified(true); } XBT_OUT();