-CpuTi::CpuTi(CpuTiModelPtr model, string name, double powerPeak,
- double powerScale, tmgr_trace_t powerTrace, int core,
- e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
- xbt_dict_t properties) :
- Cpu(model, name, properties), m_powerPeak(powerPeak), m_powerScale(powerScale),
- m_stateCurrent(stateInitial) {
- tmgr_trace_t empty_trace;
- s_tmgr_event_t val;
- xbt_assert(core==1,"Multi-core not handled with this model yet");
- XBT_DEBUG("power scale %lf", powerScale);
- m_availTrace = cpu_ti_parse_trace(powerTrace, powerScale);
- if (stateTrace)
- /*TOREPAIR:m_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, this);*/
- if (powerTrace && xbt_dynar_length(powerTrace->s_list.event_list) > 1) {
- // add a fake trace event if periodicity == 0
- xbt_dynar_get_cpy(powerTrace->s_list.event_list,
- xbt_dynar_length(powerTrace->s_list.event_list) - 1, &val);
- /*TOREPAIR:if (val.delta == 0) {
- empty_trace = tmgr_empty_trace_new();
- m_powerEvent =
- tmgr_history_add_trace(history, empty_trace,
- m_availTrace->last_time, 0, this);
- }*/
+CpuTi::CpuTi(CpuTiModel *model, simgrid::s4u::Host *host, std::vector<double> *speedPerPstate, int core)
+ : Cpu(model, host, speedPerPstate, core)
+{
+ xbt_assert(core==1,"Multi-core not handled by this model yet");
+ coresAmount_ = core;
+
+ speed_.peak = speedPerPstate->front();
+ XBT_DEBUG("CPU create: peak=%f", speed_.peak);
+
+ speedIntegratedTrace_ = new CpuTiTgmr(nullptr, 1/*scale*/);
+}
+
+CpuTi::~CpuTi()
+{
+ modified(false);
+ delete speedIntegratedTrace_;
+}
+void CpuTi::setSpeedTrace(tmgr_trace_t trace)
+{
+ if (speedIntegratedTrace_)
+ delete speedIntegratedTrace_;
+
+ speedIntegratedTrace_ = new CpuTiTgmr(trace, speed_.scale);
+
+ /* add a fake trace event if periodicity == 0 */
+ if (trace && trace->event_list.size() > 1) {
+ trace_mgr::DatedValue val = trace->event_list.back();
+ if (val.date_ < 1e-12)
+ speed_.event = future_evt_set->add_trace(new simgrid::trace_mgr::trace(), this);
+ }
+}
+
+void CpuTi::apply_event(tmgr_trace_event_t event, double value)
+{
+ if (event == speed_.event) {
+ tmgr_trace_t speedTrace;
+ CpuTiTgmr *trace;
+
+ XBT_DEBUG("Finish trace date: value %f", value);
+ /* update remaining of actions and put in modified cpu list */
+ updateRemainingAmount(surf_get_clock());
+
+ modified(true);
+
+ speedTrace = speedIntegratedTrace_->speedTrace_;
+ trace_mgr::DatedValue val = speedTrace->event_list.back();
+ delete speedIntegratedTrace_;
+ speed_.scale = val.value_;
+
+ trace = new CpuTiTgmr(TRACE_FIXED, val.value_);
+ XBT_DEBUG("value %f", val.value_);
+
+ speedIntegratedTrace_ = trace;
+
+ tmgr_trace_event_unref(&speed_.event);
+
+ } else if (event == stateEvent_) {
+ if (value > 0) {
+ if(isOff())
+ host_that_restart.push_back(getHost());
+ turnOn();
+ } else {
+ turnOff();
+ double date = surf_get_clock();
+
+ /* put all action running on cpu to failed */
+ 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);
+ action.setState(Action::State::failed);
+ action.heapRemove(model()->getActionHeap());
+ }
+ }
+ }
+ tmgr_trace_event_unref(&stateEvent_);
+
+ } else {
+ xbt_die("Unknown event!\n");
+ }
+}
+
+void CpuTi::updateActionsFinishTime(double now)
+{
+ double sum_priority = 0.0;
+ double total_area;
+
+ /* update remaining amount of actions */
+ updateRemainingAmount(now);
+
+ for (CpuTiAction const& action : actionSet_) {
+ /* action not running, skip it */
+ if (action.getStateSet() != surf_cpu_model_pm->getRunningActionSet())
+ continue;
+
+ /* bogus priority, skip it */
+ if (action.getPriority() <= 0)
+ continue;
+
+ /* action suspended, skip it */
+ if (action.suspended_ != Action::SuspendStates::not_suspended)
+ continue;
+
+ sum_priority += 1.0 / action.getPriority();