s_surf_model_description_t surf_vm_workstation_model_description[] = {
{"default",
"Default vm workstation model.",
- surf_vm_workstation_model_init_current_default},
+ surf_vm_workstation_model_init_HL13},
{NULL, NULL, NULL} /* this array must be NULL terminated */
};
"Y:\\",
"Z:\\"
};
-#endif
+#endif
/*
* Returns the initial path. On Windows the initial path is
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, ", ");
delete static_cast<WorkstationPtr>(r);
}
+static XBT_INLINE void surf_storage_free(void *r)
+{
+ delete static_cast<StoragePtr>(r);
+}
+
void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
*ver_major = SIMGRID_VERSION_MAJOR;
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)
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)
{
ActionPtr action = NULL;
double min = -1;
- double value;
+ double share;
XBT_DEBUG
("Before share resources, the size of modified actions set is %zd",
p_modifiedSet->size());
while(!p_modifiedSet->empty()) {
- action = &(p_modifiedSet->front());
- p_modifiedSet->pop_front();
+ action = &(p_modifiedSet->front());
+ p_modifiedSet->pop_front();
int max_dur_flag = 0;
if (action->getStateSet() != p_runningActionSet)
continue;
/* bogus priority, skip it */
- if (action->getPriority() <= 0)
+ if (action->getPriority() <= 0 || action->getHat()==LATENCY)
continue;
action->updateRemainingLazy(now);
min = -1;
- value = lmm_variable_getvalue(action->getVariable());
- if (value > 0) {
+ share = lmm_variable_getvalue(action->getVariable());
+
+ if (share > 0) {
+ double time_to_completion;
if (action->getRemains() > 0) {
- value = action->getRemainsNoUpdate() / value;
- min = now + value;
+ 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->getMaxDuration() != NO_MAX_DURATION)
|| action->getStartTime() +
action->getMaxDuration() < min)) {
min = action->getStartTime() +
- action->getMaxDuration();
+ action->getMaxDuration(); // when the task will complete anyway because of the deadline if any
max_dur_flag = 1;
}
- XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
- action->getStartTime(), now + value,
+
+ 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) {
"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_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(NULL)
- , m_lastValue(0)
- , m_lastUpdate(0)
- , m_suspended(false)
{
+ initialize(model, cost, failed);
#ifdef HAVE_TRACING
p_category = NULL;
#endif
}
Action::Action(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)
{
+ initialize(model, cost, failed, var);
#ifdef HAVE_TRACING
p_category = NULL;
#endif
if (p_variable)
lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), bound);
- if (getModel()->getUpdateMechanism() == UM_LAZY)
- heapRemove(getModel()->getActionHeap());
+ if (getModel()->getUpdateMechanism() == UM_LAZY && getLastUpdate()!=surf_get_clock())
+ heapRemove(getModel()->getActionHeap());
XBT_OUT();
}
{
double delta = 0.0;
- if(getModel() == static_cast<ModelPtr>(surf_network_model))
+ if(getModel() == surf_network_model)
{
if (m_suspended != 0)
return;
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 (getModel() == static_cast<ModelPtr>(surf_cpu_model_pm) && TRACE_is_enabled()) {
+ if (getModel() == 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);
}
XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
}
- if(getModel() == static_cast<ModelPtr>(surf_network_model))
+ if(getModel() == 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) &&