+/* Copyright (c) 2004-2014. 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 "surf_private.h"
#include "surf_interface.hpp"
#include "network_interface.hpp"
xbt_dynar_t host_that_restart = NULL;
xbt_dict_t watched_hosts_lib;
+surf_callback(void, void) surfExitCallbacks;
+
+s_surf_model_description_t surf_plugin_description[] = {
+ {"Energy",
+ "Cpu energy consumption.",
+ sg_energy_plugin_init},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
/* Don't forget to update the option description in smx_config when you change this */
s_surf_model_description_t surf_network_model_description[] = {
{"LV08",
s_surf_model_description_t surf_vm_workstation_model_description[] = {
{"default",
- "Default vm workstation model.)",
+ "Default vm workstation model.",
surf_vm_workstation_model_init_current_default},
{NULL, NULL, NULL} /* this array must be NULL terminated */
};
return NULL;
}
+
+#ifndef MAX_DRIVE
+#define MAX_DRIVE 26
+#endif
+
+#ifdef _XBT_WIN32
+#include <windows.h>
+static const char *disk_drives_letter_table[MAX_DRIVE] = {
+ "A:\\",
+ "B:\\",
+ "C:\\",
+ "D:\\",
+ "E:\\",
+ "F:\\",
+ "G:\\",
+ "H:\\",
+ "I:\\",
+ "J:\\",
+ "K:\\",
+ "L:\\",
+ "M:\\",
+ "N:\\",
+ "O:\\",
+ "P:\\",
+ "Q:\\",
+ "R:\\",
+ "S:\\",
+ "T:\\",
+ "U:\\",
+ "V:\\",
+ "W:\\",
+ "X:\\",
+ "Y:\\",
+ "Z:\\"
+};
+#endif
+
/*
* Returns the initial path. On Windows the initial path is
* the current directory for the current process in the other
if (!strcmp(name, table[i].name)) {
return i;
}
- name_list = strdup(table[0].name);
+ if (!table[0].name)
+ xbt_die("No model is valid! This is a bug.");
+ name_list = xbt_strdup(table[0].name);
for (i = 1; table[i].name; i++) {
name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3);
strcat(name_list, ", ");
static XBT_INLINE void surf_cpu_free(void *r)
{
- delete dynamic_cast<CpuPtr>(static_cast<ResourcePtr>(r));
+ delete static_cast<CpuPtr>(r);
}
static XBT_INLINE void surf_link_free(void *r)
{
- delete dynamic_cast<NetworkLinkPtr>(static_cast<ResourcePtr>(r));
+ delete static_cast<NetworkLinkPtr>(r);
}
static XBT_INLINE void surf_workstation_free(void *r)
{
- delete dynamic_cast<WorkstationPtr>(static_cast<ResourcePtr>(r));
+ delete static_cast<WorkstationPtr>(r);
+}
+
+static XBT_INLINE void surf_storage_free(void *r)
+{
+ delete static_cast<StoragePtr>(r);
}
as_router_lib = xbt_lib_new();
storage_lib = xbt_lib_new();
storage_type_lib = xbt_lib_new();
+ file_lib = xbt_lib_new();
watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
XBT_DEBUG("Add routing levels");
SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_cpu_free);
SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_workstation_free);
SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_link_free);
+ SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_free);
xbt_init(argc, argv);
if (!model_list)
sg_config_finalize();
+ xbt_dynar_free(&host_that_restart);
+ xbt_dynar_free(&surf_path);
+
+ xbt_lib_free(&host_lib);
+ xbt_lib_free(&link_lib);
+ xbt_lib_free(&as_router_lib);
+ xbt_lib_free(&storage_lib);
+ xbt_lib_free(&storage_type_lib);
+ xbt_lib_free(&file_lib);
+ xbt_dict_free(&watched_hosts_lib);
+
xbt_dynar_foreach(model_list, iter, model)
delete model;
xbt_dynar_free(&model_list);
xbt_dynar_free(&model_list_invoke);
routing_exit();
+ surf_callback_emit(surfExitCallbacks);
+
if (maxmin_system) {
lmm_system_free(maxmin_system);
maxmin_system = NULL;
xbt_free(surf_mins);
surf_mins = NULL;
- xbt_dynar_free(&host_that_restart);
- xbt_dynar_free(&surf_path);
-
- xbt_lib_free(&host_lib);
- xbt_lib_free(&link_lib);
- xbt_lib_free(&as_router_lib);
- xbt_lib_free(&storage_lib);
- xbt_lib_free(&storage_type_lib);
-
- xbt_dict_free(&watched_hosts_lib);
-
tmgr_finalize();
surf_parse_lex_destroy();
surf_parse_free_callbacks();
NOW = 0; /* Just in case the user plans to restart the simulation afterward */
}
+
/*********
* Model *
*********/
-Model::Model(string name)
- : p_maxminSystem(0), m_name(name),
- m_resOnCB(0), m_resOffCB(0),
- m_actCancelCB(0), m_actSuspendCB(0), m_actResumeCB(0)
+Model::Model(const char *name)
+ : p_maxminSystem(NULL)
+ , p_name(name)
{
- ActionPtr action = NULL;
- p_readyActionSet = xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
- p_runningActionSet = xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
- p_failedActionSet = xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
- p_doneActionSet = xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
+ p_readyActionSet = new ActionList();
+ p_runningActionSet = new ActionList();
+ p_failedActionSet = new ActionList();
+ p_doneActionSet = new ActionList();
p_modifiedSet = NULL;
p_actionHeap = NULL;
}
Model::~Model(){
-xbt_swag_free(p_readyActionSet);
-xbt_swag_free(p_runningActionSet);
-xbt_swag_free(p_failedActionSet);
-xbt_swag_free(p_doneActionSet);
+ delete p_readyActionSet;
+ delete p_runningActionSet;
+ delete p_failedActionSet;
+ delete p_doneActionSet;
}
double Model::shareResources(double now)
double Model::shareResourcesLazy(double now)
{
- ActionLmmPtr action = NULL;
+ ActionPtr action = NULL;
double min = -1;
- double value;
+ double share, time_to_completion;
XBT_DEBUG
- ("Before share resources, the size of modified actions set is %d",
- xbt_swag_size(p_modifiedSet));
+ ("Before share resources, the size of modified actions set is %zd",
+ p_modifiedSet->size());
lmm_solve(p_maxminSystem);
XBT_DEBUG
- ("After share resources, The size of modified actions set is %d",
- xbt_swag_size(p_modifiedSet));
+ ("After share resources, The size of modified actions set is %zd",
+ p_modifiedSet->size());
- while((action = static_cast<ActionLmmPtr>(xbt_swag_extract(p_modifiedSet)))) {
+ while(!p_modifiedSet->empty()) {
+ action = &(p_modifiedSet->front());
+ p_modifiedSet->pop_front();
int max_dur_flag = 0;
- if (action->p_stateSet != p_runningActionSet)
+ if (action->getStateSet() != p_runningActionSet)
continue;
/* bogus priority, skip it */
- if (action->m_priority <= 0)
+ if (action->getPriority() <= 0 || action->getHat()==LATENCY)
continue;
action->updateRemainingLazy(now);
min = -1;
- value = lmm_variable_getvalue(action->p_variable);
- if (value > 0) {
- if (action->m_remains > 0) {
- value = action->m_remains / value;
- min = now + value;
+ time_to_completion = -1;
+ share = lmm_variable_getvalue(action->getVariable());
+
+ if (share > 0) {
+ if (action->getRemains() > 0) {
+ time_to_completion = action->getRemainsNoUpdate() / share;
} else {
- value = 0.0;
- min = now;
+ time_to_completion = 0.0;
}
+ min = now + time_to_completion; // when the task will complete if nothing changes
}
- if ((action->m_maxDuration != NO_MAX_DURATION)
+ if ((action->getMaxDuration() != NO_MAX_DURATION)
&& (min == -1
- || action->m_start +
- action->m_maxDuration < min)) {
- min = action->m_start +
- action->m_maxDuration;
+ || action->getStartTime() +
+ action->getMaxDuration() < min)) {
+ min = action->getStartTime() +
+ action->getMaxDuration(); // when the task will complete anyway because of the deadline if any
max_dur_flag = 1;
}
- XBT_DEBUG("Action(%p) Start %lf Finish %lf Max_duration %lf", action,
- action->m_start, now + value,
- action->m_maxDuration);
+
+ XBT_DEBUG("Action(%p) corresponds to variable %d", action, action->getVariable()->id_int);
+
+ XBT_DEBUG("Action(%p) Start %f. May finish at %f (got a share of %f). Max_duration %f", action,
+ action->getStartTime(), min, share,
+ action->getMaxDuration());
if (min != -1) {
action->heapRemove(p_actionHeap);
action->heapInsert(p_actionHeap, min, max_dur_flag ? MAX_DURATION : NORMAL);
- XBT_DEBUG("Insert at heap action(%p) min %lf now %lf", action, min,
+ XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min,
now);
} else DIE_IMPOSSIBLE;
}
else
min = -1;
- XBT_DEBUG("The minimum with the HEAP %lf", min);
+ XBT_DEBUG("The minimum with the HEAP %f", min);
return min;
}
THROW_UNIMPLEMENTED;
}
-
-double Model::shareResourcesMaxMin(xbt_swag_t running_actions,
+double Model::shareResourcesMaxMin(ActionListPtr running_actions,
lmm_system_t sys,
void (*solve) (lmm_system_t))
{
- void *_action = NULL;
- ActionLmmPtr action = NULL;
+ ActionPtr action = NULL;
double min = -1;
double value = -1;
solve(sys);
- xbt_swag_foreach(_action, running_actions) {
- action = dynamic_cast<ActionLmmPtr>(static_cast<ActionPtr>(_action));
- value = lmm_variable_getvalue(action->p_variable);
- if ((value > 0) || (action->m_maxDuration >= 0))
+ ActionList::iterator it(running_actions->begin()), itend(running_actions->end());
+ for(; it != itend ; ++it) {
+ action = &*it;
+ value = lmm_variable_getvalue(action->getVariable());
+ if ((value > 0) || (action->getMaxDuration() >= 0))
break;
}
- if (!_action)
+ if (!action)
return -1.0;
if (value > 0) {
- if (action->m_remains > 0)
- min = action->m_remains / value;
+ if (action->getRemains() > 0)
+ min = action->getRemainsNoUpdate() / value;
else
min = 0.0;
- if ((action->m_maxDuration >= 0) && (action->m_maxDuration < min))
- min = action->m_maxDuration;
+ if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min))
+ min = action->getMaxDuration();
} else
- min = action->m_maxDuration;
+ min = action->getMaxDuration();
- for (_action = xbt_swag_getNext(static_cast<ActionPtr>(action), running_actions->offset);
- _action;
- _action = xbt_swag_getNext(static_cast<ActionPtr>(action), running_actions->offset)) {
- action = dynamic_cast<ActionLmmPtr>(static_cast<ActionPtr>(_action));
- value = lmm_variable_getvalue(action->p_variable);
+ for (++it; it != itend; ++it) {
+ action = &*it;
+ value = lmm_variable_getvalue(action->getVariable());
if (value > 0) {
- if (action->m_remains > 0)
- value = action->m_remains / value;
+ if (action->getRemains() > 0)
+ value = action->getRemainsNoUpdate() / value;
else
value = 0.0;
if (value < min) {
XBT_DEBUG("Updating min (value) with %p: %f", action, min);
}
}
- if ((action->m_maxDuration >= 0) && (action->m_maxDuration < min)) {
- min = action->m_maxDuration;
+ if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min)) {
+ min = action->getMaxDuration();
XBT_DEBUG("Updating min (duration) with %p: %f", action, min);
}
}
void Model::updateActionsStateLazy(double /*now*/, double /*delta*/)
{
-
}
void Model::updateActionsStateFull(double /*now*/, double /*delta*/)
{
-
-}
-
-
-void Model::addTurnedOnCallback(ResourceCallback rc)
-{
- m_resOnCB = rc;
-}
-
-void Model::notifyResourceTurnedOn(ResourcePtr r)
-{
- m_resOnCB(r);
-}
-
-void Model::addTurnedOffCallback(ResourceCallback rc)
-{
- m_resOffCB = rc;
-}
-
-void Model::notifyResourceTurnedOff(ResourcePtr r)
-{
- m_resOffCB(r);
-}
-
-void Model::addActionCancelCallback(ActionCallback ac)
-{
- m_actCancelCB = ac;
-}
-
-void Model::notifyActionCancel(ActionPtr a)
-{
- m_actCancelCB(a);
-}
-
-void Model::addActionResumeCallback(ActionCallback ac)
-{
- m_actResumeCB = ac;
-}
-
-void Model::notifyActionResume(ActionPtr a)
-{
- m_actResumeCB(a);
-}
-
-void Model::addActionSuspendCallback(ActionCallback ac)
-{
- m_actSuspendCB = ac;
-}
-
-void Model::notifyActionSuspend(ActionPtr a)
-{
- m_actSuspendCB(a);
}
-
/************
* Resource *
************/
-Resource::Resource(surf_model_t model, const char *name, xbt_dict_t props)
- : m_name(xbt_strdup(name)), m_properties(props), p_model(model), m_running(true)
+Resource::Resource()
+: p_name(NULL), p_properties(NULL), p_model(NULL)
{}
-Resource::Resource()
-: m_name(NULL), m_properties(NULL), p_model(NULL)
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
{}
-const char *Resource::getName()
-{
- return m_name;
-}
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
+{}
-xbt_dict_t Resource::getProperties()
-{
- return m_properties;
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(stateInit)
+{}
+
+Resource::~Resource() {
+ xbt_free((void*)p_name);
+ xbt_dict_free(&p_properties);
}
e_surf_resource_state_t Resource::getState()
{
- return p_stateCurrent;
+ return m_stateCurrent;
}
void Resource::setState(e_surf_resource_state_t state)
{
- p_stateCurrent = state;
+ m_stateCurrent = state;
}
bool Resource::isOn()
{
if (!m_running) {
m_running = true;
- p_model->notifyResourceTurnedOn(this);
}
}
{
if (m_running) {
m_running = false;
- p_model->notifyResourceTurnedOff(this);
}
}
-ResourceLmm::ResourceLmm(lmm_system_t system,
- double constraint_value,
- tmgr_history_t history,
- e_surf_resource_state_t state_init,
- tmgr_trace_t state_trace,
- double metric_peak,
- tmgr_trace_t metric_trace)
-{
- p_constraint = lmm_constraint_new(system, this, constraint_value);
- p_stateCurrent = state_init;
- if (state_trace)
- p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast<ResourcePtr>(this));
- p_power.scale = 1.0;
- p_power.peak = metric_peak;
- if (metric_trace)
- p_power.event = tmgr_history_add_trace(history, metric_trace, 0.0, 0, static_cast<ResourcePtr>(this));
- else
- p_power.event = NULL;
+ModelPtr Resource::getModel() {
+ return p_model;
+}
+
+const char *Resource::getName() {
+ return p_name;
+}
+
+xbt_dict_t Resource::getProperties() {
+ if (p_properties==NULL)
+ p_properties = xbt_dict_new();
+ return p_properties;
+}
+
+lmm_constraint_t Resource::getConstraint() {
+ return p_constraint;
}
/**********
"SURF_ACTION_NOT_IN_THE_SYSTEM"
};
-Action::Action()
-: m_refcount(1)
-{}
+void Action::initialize(ModelPtr model, double cost, bool failed,
+ lmm_variable_t var)
+{
+ m_priority = 1.0;
+ m_refcount = 1;
+ m_remains = cost;
+ m_maxDuration = NO_MAX_DURATION;
+ m_finish = -1.0;
+ m_failed = failed;
+ m_start = surf_get_clock();
+ m_cost = cost;
+ p_model = model;
+ p_data = NULL;
+ p_variable = var;
+ m_lastValue = 0;
+ m_lastUpdate = 0;
+ m_suspended = false;
+ m_hat = NOTSET;
+}
Action::Action(ModelPtr model, double cost, bool failed)
- : m_priority(1.0)
- , m_failed(failed)
- , m_start(surf_get_clock()), m_finish(-1.0)
- , m_remains(cost)
- , m_maxDuration(NO_MAX_DURATION)
- , m_cost(cost)
- , p_data(NULL)
- , p_model(model)
- , m_refcount(1)
{
+ initialize(model, cost, failed);
#ifdef HAVE_TRACING
p_category = NULL;
#endif
p_stateHookup.prev = 0;
p_stateHookup.next = 0;
if (failed)
- p_stateSet = p_model->p_failedActionSet;
+ p_stateSet = getModel()->getFailedActionSet();
else
- p_stateSet = p_model->p_runningActionSet;
+ p_stateSet = getModel()->getRunningActionSet();
- xbt_swag_insert(this, p_stateSet);
+ p_stateSet->push_back(*this);
}
-Action::~Action() {}
+Action::Action(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+{
+ initialize(model, cost, failed, var);
+ #ifdef HAVE_TRACING
+ p_category = NULL;
+ #endif
+ p_stateHookup.prev = 0;
+ p_stateHookup.next = 0;
+ if (failed)
+ p_stateSet = getModel()->getFailedActionSet();
+ else
+ p_stateSet = getModel()->getRunningActionSet();
-int Action::unref(){
- DIE_IMPOSSIBLE;
+ p_stateSet->push_back(*this);
}
-void Action::cancel(){
- DIE_IMPOSSIBLE;
+Action::~Action() {
+#ifdef HAVE_TRACING
+ xbt_free(p_category);
+#endif
}
-void Action::recycle(){
- DIE_IMPOSSIBLE;
+void Action::finish() {
+ m_finish = surf_get_clock();
}
e_surf_action_state_t Action::getState()
{
- if (p_stateSet == p_model->p_readyActionSet)
+ if (p_stateSet == getModel()->getReadyActionSet())
return SURF_ACTION_READY;
- if (p_stateSet == p_model->p_runningActionSet)
+ if (p_stateSet == getModel()->getRunningActionSet())
return SURF_ACTION_RUNNING;
- if (p_stateSet == p_model->p_failedActionSet)
+ if (p_stateSet == getModel()->getFailedActionSet())
return SURF_ACTION_FAILED;
- if (p_stateSet == p_model->p_doneActionSet)
+ if (p_stateSet == getModel()->getDoneActionSet())
return SURF_ACTION_DONE;
return SURF_ACTION_NOT_IN_THE_SYSTEM;
}
{
//surf_action_state_t action_state = &(action->model_type->states);
XBT_IN("(%p,%s)", this, surf_action_state_names[state]);
- xbt_swag_remove(this, p_stateSet);
-
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
if (state == SURF_ACTION_READY)
- p_stateSet = p_model->p_readyActionSet;
+ p_stateSet = getModel()->getReadyActionSet();
else if (state == SURF_ACTION_RUNNING)
- p_stateSet = p_model->p_runningActionSet;
+ p_stateSet = getModel()->getRunningActionSet();
else if (state == SURF_ACTION_FAILED)
- p_stateSet = p_model->p_failedActionSet;
+ p_stateSet = getModel()->getFailedActionSet();
else if (state == SURF_ACTION_DONE)
- p_stateSet = p_model->p_doneActionSet;
+ p_stateSet = getModel()->getDoneActionSet();
else
p_stateSet = NULL;
if (p_stateSet)
- xbt_swag_insert(this, p_stateSet);
+ p_stateSet->push_back(*this);
+ XBT_OUT();
+}
+
+double Action::getBound()
+{
+ return (p_variable) ? lmm_variable_getbound(p_variable) : 0;
+}
+
+void Action::setBound(double bound)
+{
+ XBT_IN("(%p,%g)", this, bound);
+ if (p_variable)
+ lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), bound);
+
+ if (getModel()->getUpdateMechanism() == UM_LAZY && getLastUpdate()!=surf_get_clock())
+ heapRemove(getModel()->getActionHeap());
XBT_OUT();
}
return m_remains == 0 ? m_finish : -1;
}
-double Action::getRemains()
-{
- XBT_IN("(%p)", this);
- XBT_OUT();
- return m_remains;
-}
-
void Action::setData(void* data)
{
p_data = data;
m_refcount++;
}
-void ActionLmm::setMaxDuration(double duration)
+void Action::setMaxDuration(double duration)
{
XBT_IN("(%p,%g)", this, duration);
m_maxDuration = duration;
- if (p_model->p_updateMechanism == UM_LAZY) // remove action from the heap
- heapRemove(p_model->p_actionHeap);
+ if (getModel()->getUpdateMechanism() == UM_LAZY) // remove action from the heap
+ heapRemove(getModel()->getActionHeap());
XBT_OUT();
}
-void ActionLmm::gapRemove() {}
+void Action::gapRemove() {}
-void ActionLmm::setPriority(double priority)
+void Action::setPriority(double priority)
{
XBT_IN("(%p,%g)", this, priority);
m_priority = priority;
- lmm_update_variable_weight(p_model->p_maxminSystem, p_variable, priority);
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), priority);
- if (p_model->p_updateMechanism == UM_LAZY)
- heapRemove(p_model->p_actionHeap);
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
XBT_OUT();
}
-void ActionLmm::cancel(){
+void Action::cancel(){
setState(SURF_ACTION_FAILED);
- if (p_model->p_updateMechanism == UM_LAZY) {
- xbt_swag_remove(this, p_model->p_modifiedSet);
- heapRemove(p_model->p_actionHeap);
+ if (getModel()->getUpdateMechanism() == UM_LAZY) {
+ if (actionLmmHook::is_linked())
+ getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
+ heapRemove(getModel()->getActionHeap());
}
}
-int ActionLmm::unref(){
+int Action::unref(){
m_refcount--;
if (!m_refcount) {
- xbt_swag_remove(static_cast<ActionPtr>(this), p_stateSet);
- if (p_variable)
- lmm_variable_free(p_model->p_maxminSystem, p_variable);
- if (p_model->p_updateMechanism == UM_LAZY) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ if (getVariable())
+ lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
+ if (getModel()->getUpdateMechanism() == UM_LAZY) {
/* remove from heap */
- heapRemove(p_model->p_actionHeap);
- xbt_swag_remove(this, p_model->p_modifiedSet);
+ heapRemove(getModel()->getActionHeap());
+ if (actionLmmHook::is_linked())
+ getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
}
-#ifdef HAVE_TRACING
- xbt_free(p_category);
-#endif
delete this;
return 1;
}
return 0;
}
-void ActionLmm::suspend()
+void Action::suspend()
{
XBT_IN("(%p)", this);
if (m_suspended != 2) {
- lmm_update_variable_weight(p_model->p_maxminSystem, p_variable, 0.0);
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0);
m_suspended = 1;
- if (p_model->p_updateMechanism == UM_LAZY)
- heapRemove(p_model->p_actionHeap);
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
}
XBT_OUT();
}
-void ActionLmm::resume()
+void Action::resume()
{
XBT_IN("(%p)", this);
if (m_suspended != 2) {
- lmm_update_variable_weight(p_model->p_maxminSystem, p_variable, m_priority);
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), m_priority);
m_suspended = 0;
- if (p_model->p_updateMechanism == UM_LAZY)
- heapRemove(p_model->p_actionHeap);
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
}
XBT_OUT();
}
-bool ActionLmm::isSuspended()
+bool Action::isSuspended()
{
return m_suspended == 1;
}
* LATENCY = this is a heap entry to warn us when the latency is payed
* MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
*/
-void ActionLmm::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat)
+void Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat)
{
m_hat = hat;
xbt_heap_push(heap, this, key);
}
-void ActionLmm::heapRemove(xbt_heap_t heap)
+void Action::heapRemove(xbt_heap_t heap)
{
m_hat = NOTSET;
if (m_indexHeap >= 0) {
/* added to manage the communication action's heap */
void surf_action_lmm_update_index_heap(void *action, int i) {
- ((ActionLmmPtr)action)->updateIndexHeap(i);
+ ((ActionPtr)action)->updateIndexHeap(i);
}
-void ActionLmm::updateIndexHeap(int i) {
+void Action::updateIndexHeap(int i) {
m_indexHeap = i;
}
-double ActionLmm::getRemains()
+double Action::getRemains()
{
XBT_IN("(%p)", this);
/* update remains before return it */
- if (p_model->p_updateMechanism == UM_LAZY) /* update remains before return it */
+ if (getModel()->getUpdateMechanism() == UM_LAZY) /* update remains before return it */
updateRemainingLazy(surf_get_clock());
XBT_OUT();
return m_remains;
}
+double Action::getRemainsNoUpdate()
+{
+ return m_remains;
+}
+
//FIXME split code in the right places
-void ActionLmm::updateRemainingLazy(double now)
+void Action::updateRemainingLazy(double now)
{
double delta = 0.0;
- if(p_model == static_cast<ModelPtr>(surf_network_model))
+ if(getModel() == static_cast<ModelPtr>(surf_network_model))
{
if (m_suspended != 0)
return;
}
else
{
- xbt_assert(p_stateSet == p_model->p_runningActionSet,
+ xbt_assert(p_stateSet == getModel()->getRunningActionSet(),
"You're updating an action that is not running.");
/* bogus priority, skip it */
if (m_remains > 0) {
XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
- double_update(&m_remains, m_lastValue * delta);
+ double_update(&m_remains, m_lastValue * delta, sg_surf_precision*sg_maxmin_precision);
#ifdef HAVE_TRACING
- if (p_model == static_cast<ModelPtr>(surf_cpu_model_pm) && TRACE_is_enabled()) {
- ResourcePtr cpu = static_cast<ResourcePtr>(lmm_constraint_id(lmm_get_cnst_from_var(p_model->p_maxminSystem, p_variable, 0)));
- TRACE_surf_host_set_utilization(cpu->m_name, p_category, m_lastValue, m_lastUpdate, now - m_lastUpdate);
+ if (getModel() == static_cast<ModelPtr>(surf_cpu_model_pm) && TRACE_is_enabled()) {
+ ResourcePtr cpu = static_cast<ResourcePtr>(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
+ TRACE_surf_host_set_utilization(cpu->getName(), getCategory(), m_lastValue, m_lastUpdate, now - m_lastUpdate);
}
#endif
XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
}
- if(p_model == static_cast<ModelPtr>(surf_network_model))
+ if(getModel() == static_cast<ModelPtr>(surf_network_model))
{
if (m_maxDuration != NO_MAX_DURATION)
- double_update(&m_maxDuration, delta);
+ double_update(&m_maxDuration, delta, sg_surf_precision);
//FIXME: duplicated code
if ((m_remains <= 0) &&
- (lmm_get_variable_weight(p_variable) > 0)) {
- m_finish = surf_get_clock();
+ (lmm_get_variable_weight(getVariable()) > 0)) {
+ finish();
setState(SURF_ACTION_DONE);
- heapRemove(p_model->p_actionHeap);
+ heapRemove(getModel()->getActionHeap());
} else if (((m_maxDuration != NO_MAX_DURATION)
&& (m_maxDuration <= 0))) {
- m_finish = surf_get_clock();
+ finish();
setState(SURF_ACTION_DONE);
- heapRemove(p_model->p_actionHeap);
+ heapRemove(getModel()->getActionHeap());
}
}
m_lastUpdate = now;
- m_lastValue = lmm_variable_getvalue(p_variable);
-}
-
-/*void Action::cancel()
-{
- p_model->notifyActionCancel(this);
+ m_lastValue = lmm_variable_getvalue(getVariable());
}
-void Action::suspend()
-{
- p_model->notifyActionSuspend(this);
-}
-
-void Action::resume()
-{
- p_model->notifyActionResume(this);
-}
-
-bool Action::isSuspended()
-{
- return false;
-}*/
-