+/* 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 */
};
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)
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(const char *name)
- : p_name(name), p_maxminSystem(0),
- m_resOnCB(0), m_resOffCB(0),
- m_actCancelCB(0), m_actSuspendCB(0), m_actResumeCB(0)
+ : p_maxminSystem(NULL)
+ , p_name(name)
{
p_readyActionSet = new ActionList();
p_runningActionSet = new ActionList();
double value;
XBT_DEBUG
- ("Before share resources, the size of modified actions set is %d",
+ ("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",
+ ("After share resources, The size of modified actions set is %zd",
p_modifiedSet->size());
while(!p_modifiedSet->empty()) {
value = lmm_variable_getvalue(action->getVariable());
if (value > 0) {
if (action->getRemains() > 0) {
- value = action->getRemains() / value;
+ value = action->getRemainsNoUpdate() / value;
min = now + value;
} else {
value = 0.0;
max_dur_flag = 1;
}
- XBT_DEBUG("Action(%p) Start %lf Finish %lf Max_duration %lf", action,
+ XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
action->getStartTime(), now + value,
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(ActionListPtr running_actions,
lmm_system_t sys,
void (*solve) (lmm_system_t))
{
- void *_action = NULL;
ActionPtr action = NULL;
double min = -1;
double value = -1;
if (value > 0) {
if (action->getRemains() > 0)
- min = action->getRemains() / value;
+ min = action->getRemainsNoUpdate() / value;
else
min = 0.0;
if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min))
value = lmm_variable_getvalue(action->getVariable());
if (value > 0) {
if (action->getRemains() > 0)
- value = action->getRemains() / value;
+ value = action->getRemainsNoUpdate() / value;
else
value = 0.0;
if (value < 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 *
************/
: p_name(NULL), p_properties(NULL), p_model(NULL)
{}
-Resource::Resource(surf_model_t 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)
+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)
{}
-Resource::Resource(surf_model_t 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)
+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)
{}
-Resource::Resource(surf_model_t 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(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 m_stateCurrent;
{
if (!m_running) {
m_running = true;
- getModel()->notifyResourceTurnedOn(this);
}
}
{
if (m_running) {
m_running = false;
- getModel()->notifyResourceTurnedOff(this);
}
}
+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;
+}
+
/**********
* Action *
**********/
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_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_data(NULL)
, p_model(model)
- , m_refcount(1)
+ , p_data(NULL)
+ , p_variable(NULL)
, m_lastValue(0)
, m_lastUpdate(0)
, m_suspended(false)
- , p_variable(NULL)
{
#ifdef HAVE_TRACING
p_category = NULL;
Action::Action(ModelPtr model, double cost, bool failed, lmm_variable_t var)
: m_priority(1.0)
- , m_failed(failed)
- , m_start(surf_get_clock()), m_finish(-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_data(NULL)
, p_model(model)
- , m_refcount(1)
+ , p_data(NULL)
+ , p_variable(var)
, m_lastValue(0)
, m_lastUpdate(0)
, m_suspended(false)
- , p_variable(var)
{
#ifdef HAVE_TRACING
p_category = NULL;
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)
+ heapRemove(getModel()->getActionHeap());
+ XBT_OUT();
+}
+
double Action::getStartTime()
{
return m_start;