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
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);
}
*********/
Model::Model(const char *name)
- : p_maxminSystem(0), p_name(name),
+ : p_name(name), p_maxminSystem(0),
m_resOnCB(0), m_resOffCB(0),
m_actCancelCB(0), m_actSuspendCB(0), m_actResumeCB(0)
{
- 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;
XBT_DEBUG
("Before share resources, the size of modified actions set is %d",
- xbt_swag_size(p_modifiedSet));
+ 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));
+ 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->getStateSet() != p_runningActionSet)
}
-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));
+ 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) {
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));
+ for (++it; it != itend; ++it) {
+ action = &*it;
value = lmm_variable_getvalue(action->getVariable());
if (value > 0) {
if (action->getRemains() > 0)
, 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(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)
}
}
-ResourceLmm::ResourceLmm()
- : p_constraint(NULL)
-{}
-
-ResourceLmm::ResourceLmm(lmm_constraint_t constraint)
- : p_constraint(constraint)
-{}
-
/**********
* Action *
**********/
, p_data(NULL)
, p_model(model)
, m_refcount(1)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+ , p_variable(NULL)
+{
+ #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();
+
+ p_stateSet->push_back(*this);
+}
+
+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_remains(cost)
+ , m_maxDuration(NO_MAX_DURATION)
+ , m_cost(cost)
+ , p_data(NULL)
+ , p_model(model)
+ , m_refcount(1)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+ , p_variable(var)
{
#ifdef HAVE_TRACING
p_category = NULL;
else
p_stateSet = getModel()->getRunningActionSet();
- xbt_swag_insert(this, p_stateSet);
+ p_stateSet->push_back(*this);
}
Action::~Action() {
m_finish = surf_get_clock();
}
-int Action::unref(){
- DIE_IMPOSSIBLE;
-}
-
-void Action::cancel(){
- DIE_IMPOSSIBLE;
-}
-
-void Action::recycle(){
- DIE_IMPOSSIBLE;
-}
-
e_surf_action_state_t Action::getState()
{
if (p_stateSet == getModel()->getReadyActionSet())
{
//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 = getModel()->getReadyActionSet();
else if (state == SURF_ACTION_RUNNING)
p_stateSet = NULL;
if (p_stateSet)
- xbt_swag_insert(this, p_stateSet);
+ p_stateSet->push_back(*this);
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;
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;
XBT_OUT();
}
-void ActionLmm::cancel(){
+void Action::cancel(){
setState(SURF_ACTION_FAILED);
if (getModel()->getUpdateMechanism() == UM_LAZY) {
- xbt_swag_remove(this, getModel()->getModifiedSet());
+ 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 (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(getModel()->getActionHeap());
- xbt_swag_remove(this, getModel()->getModifiedSet());
+ if (actionLmmHook::is_linked())
+ getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
}
delete this;
return 1;
return 0;
}
-void ActionLmm::suspend()
+void Action::suspend()
{
XBT_IN("(%p)", this);
if (m_suspended != 2) {
XBT_OUT();
}
-void ActionLmm::resume()
+void Action::resume()
{
XBT_IN("(%p)", this);
if (m_suspended != 2) {
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 */
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;
m_lastValue = lmm_variable_getvalue(getVariable());
}
-/*void Action::cancel()
-{
- p_model->notifyActionCancel(this);
-}
-
-void Action::suspend()
-{
- p_model->notifyActionSuspend(this);
-}
-
-void Action::resume()
-{
- p_model->notifyActionResume(this);
-}
-
-bool Action::isSuspended()
-{
- return false;
-}*/
-