X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3287799e891ebf4d99a64c7d955955da1a37eb44..07eb08dd092e89871ab3ed9fcf41ad0219598e3b:/src/surf/surf_interface.cpp diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 0bfd73d145..d887e1f4ae 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2004-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2018. 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. */ @@ -7,13 +7,21 @@ #include "mc/mc.h" #include "simgrid/s4u/Engine.hpp" #include "simgrid/sg_config.h" -#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/kernel/lmm/maxmin.hpp" // Constraint #include "src/kernel/routing/NetPoint.hpp" #include "src/surf/HostImpl.hpp" +#include "xbt/utility.hpp" #include +#include +#include #include +#ifdef _WIN32 +#include +#endif + XBT_LOG_NEW_CATEGORY(surf, "All SURF categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf, "Logging specific to SURF (kernel)"); @@ -26,8 +34,9 @@ std::vector * all_existing_models = nullptr; /* to destroy models simgrid::trace_mgr::future_evt_set *future_evt_set = nullptr; std::vector surf_path; std::vector host_that_restart; -xbt_dict_t watched_hosts_lib; -extern std::map storage_types; +/** set of hosts for which one want to be notified if they ever restart. */ +std::set watched_hosts; +extern std::map storage_types; namespace simgrid { namespace surf { @@ -36,8 +45,8 @@ simgrid::xbt::signal surfExitCallbacks; } } -#include // FIXME: this plugin should not be linked to the core -#include // FIXME: this plugin should not be linked to the core +#include // FIXME: this plug-in should not be linked to the core +#include // FIXME: this plug-in should not be linked to the core s_surf_model_description_t surf_plugin_description[] = { {"Energy", "Cpu energy consumption.", &sg_host_energy_plugin_init}, @@ -47,25 +56,31 @@ s_surf_model_description_t surf_plugin_description[] = { /* 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", "Realistic network analytic model (slow-start modeled by multiplying latency by 10.4, bandwidth by .92; bottleneck sharing uses a payload of S=8775 for evaluating RTT). ", - &surf_network_model_init_LegrandVelho}, - {"Constant", - "Simplistic network model where all communication take a constant time (one second). This model provides the lowest realism, but is (marginally) faster.", - &surf_network_model_init_Constant}, - {"SMPI", "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)", - &surf_network_model_init_SMPI}, - {"IB", "Realistic network model specifically tailored for HPC settings, with Infiniband contention model", - &surf_network_model_init_IB}, - {"CM02", "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of small messages are thus poorly modeled).", - &surf_network_model_init_CM02}, - {"NS3", "Network pseudo-model using the NS3 tcp model instead of an analytic model", &surf_network_model_init_NS3}, - {"Reno", "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", - &surf_network_model_init_Reno}, - {"Reno2", "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", - &surf_network_model_init_Reno2}, - {"Vegas", "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", - &surf_network_model_init_Vegas}, - {nullptr, nullptr, nullptr} /* this array must be nullptr terminated */ + {"LV08", "Realistic network analytic model (slow-start modeled by multiplying latency by 13.01, bandwidth by .97; " + "bottleneck sharing uses a payload of S=20537 for evaluating RTT). ", + &surf_network_model_init_LegrandVelho}, + {"Constant", "Simplistic network model where all communication take a constant time (one second). This model " + "provides the lowest realism, but is (marginally) faster.", + &surf_network_model_init_Constant}, + {"SMPI", "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with " + "correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)", + &surf_network_model_init_SMPI}, + {"IB", "Realistic network model specifically tailored for HPC settings, with Infiniband contention model", + &surf_network_model_init_IB}, + {"CM02", "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of " + "small messages are thus poorly modeled).", + &surf_network_model_init_CM02}, + {"NS3", "Network pseudo-model using the NS3 tcp model instead of an analytic model", &surf_network_model_init_NS3}, + {"Reno", + "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", + &surf_network_model_init_Reno}, + {"Reno2", + "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", + &surf_network_model_init_Reno2}, + {"Vegas", + "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).", + &surf_network_model_init_Vegas}, + {nullptr, nullptr, nullptr} /* this array must be nullptr terminated */ }; #if ! HAVE_SMPI @@ -106,10 +121,6 @@ s_surf_model_description_t surf_storage_model_description[] = { {nullptr, nullptr, nullptr} /* this array must be nullptr terminated */ }; -#if HAVE_THREAD_CONTEXTS -static xbt_parmap_t surf_parmap = nullptr; /* parallel map on models */ -#endif - double NOW = 0; double surf_get_clock() @@ -123,16 +134,16 @@ double surf_get_clock() # define FILE_DELIM "/" /* FIXME: move to better location */ #endif -std::ifstream* surf_ifsopen(const char* name) +std::ifstream* surf_ifsopen(std::string name) { std::ifstream* fs = new std::ifstream(); - xbt_assert(name); - if (__surf_is_absolute_file_path(name)) { /* don't mess with absolute file names */ - fs->open(name, std::ifstream::in); + xbt_assert(not name.empty()); + if (__surf_is_absolute_file_path(name.c_str())) { /* don't mess with absolute file names */ + fs->open(name.c_str(), std::ifstream::in); } /* search relative files in the path */ - for (auto path_elm : surf_path) { + for (auto const& path_elm : surf_path) { std::string buff = path_elm + FILE_DELIM + name; fs->open(buff.c_str(), std::ifstream::in); @@ -144,6 +155,7 @@ std::ifstream* surf_ifsopen(const char* name) return fs; } + FILE *surf_fopen(const char *name, const char *mode) { FILE *file = nullptr; @@ -154,10 +166,9 @@ FILE *surf_fopen(const char *name, const char *mode) return fopen(name, mode); /* search relative files in the path */ - for (auto path_elm : surf_path) { - char* buff = bprintf("%s" FILE_DELIM "%s", path_elm.c_str(), name); - file = fopen(buff, mode); - free(buff); + for (auto const& path_elm : surf_path) { + std::string buff = path_elm + FILE_DELIM + name; + file = fopen(buff.c_str(), mode); if (file) return file; @@ -165,47 +176,6 @@ FILE *surf_fopen(const char *name, const char *mode) return nullptr; } -#ifdef _WIN32 -#include -#define MAX_DRIVE 26 -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 - * case the function returns "./" that represents the current - * directory on Unix/Linux platforms. - */ - -const char *__surf_get_initial_path() -{ - -#ifdef _WIN32 - unsigned i; - char current_directory[MAX_PATH + 1] = { 0 }; - unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory); - char root[4] = { 0 }; - - if (not len) - return nullptr; - - strncpy(root, current_directory, 3); - - for (i = 0; i < MAX_DRIVE; i++) { - if (toupper(root[0]) == disk_drives_letter_table[i][0]) - return disk_drives_letter_table[i]; - } - - return nullptr; -#else - return "./"; -#endif -} - /* The __surf_is_absolute_file_path() returns 1 if * file_path is a absolute file path, in the other * case the function returns 0. @@ -234,25 +204,20 @@ void model_help(const char *category, s_surf_model_description_t * table) printf(" %s: %s\n", table[i].name, table[i].description); } -int find_model_description(s_surf_model_description_t * table, - const char *name) +int find_model_description(s_surf_model_description_t* table, std::string name) { - int i; - char *name_list = nullptr; - - for (i = 0; table[i].name; i++) - if (not strcmp(name, table[i].name)) { + for (int i = 0; table[i].name; i++) + if (name == table[i].name) return i; - } + if (not 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); - strncat(name_list, ", ", 2); - strncat(name_list, table[i].name, strlen(table[i].name)); - } - xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list); + + std::string name_list = std::string(table[0].name); + for (int i = 1; table[i].name; i++) + name_list = name_list + ", " + table[i].name; + + xbt_die("Model '%s' is invalid! Valid models are: %s.", name.c_str(), name_list.c_str()); return -1; } @@ -340,17 +305,12 @@ void surf_init(int *argc, char **argv) XBT_DEBUG("Create all Libs"); USER_HOST_LEVEL = simgrid::s4u::Host::extension_create(nullptr); - watched_hosts_lib = xbt_dict_new_homogeneous(nullptr); - xbt_init(argc, argv); if (not all_existing_models) all_existing_models = new std::vector(); if (not future_evt_set) future_evt_set = new simgrid::trace_mgr::future_evt_set(); - TRACE_surf_alloc(); - simgrid::surf::surfExitCallbacks.connect(TRACE_surf_release); - sg_config_init(argc, argv); if (MC_is_active()) @@ -361,38 +321,30 @@ void surf_exit() { TRACE_end(); /* Just in case it was not called by the upper layer (or there is no upper layer) */ - sg_host_exit(); + simgrid::s4u::Engine::shutdown(); sg_link_exit(); - xbt_dict_free(&watched_hosts_lib); - for (auto e : storage_types) { - storage_type_t stype = e.second; - free(stype->model); - free(stype->type_id); - free(stype->content); - xbt_dict_free(&(stype->properties)); + for (auto const& e : storage_types) { + simgrid::surf::StorageType* stype = e.second; + delete stype->properties; delete stype->model_properties; - free(stype); + delete stype; } - delete simgrid::surf::StorageImpl::storages; + for (auto const& s : *simgrid::surf::StorageImpl::storagesMap()) + delete s.second; + delete simgrid::surf::StorageImpl::storagesMap(); - for (auto model : *all_existing_models) + for (auto const& model : *all_existing_models) delete model; delete all_existing_models; - simgrid::surf::surfExitCallbacks(); if (future_evt_set) { delete future_evt_set; future_evt_set = nullptr; } -#if HAVE_THREAD_CONTEXTS - xbt_parmap_destroy(surf_parmap); -#endif - tmgr_finalize(); sg_platf_exit(); - simgrid::s4u::Engine::shutdown(); NOW = 0; /* Just in case the user plans to restart the simulation afterward */ } @@ -413,7 +365,6 @@ Model::Model() doneActionSet_ = new ActionList(); modifiedSet_ = nullptr; - actionHeap_ = nullptr; updateMechanism_ = UM_UNDEFINED; selectiveUpdate_ = 0; } @@ -423,6 +374,16 @@ Model::~Model(){ delete runningActionSet_; delete failedActionSet_; delete doneActionSet_; + delete modifiedSet_; + delete maxminSystem_; +} + +Action* Model::actionHeapPop() +{ + Action* action = actionHeap_.top().second; + actionHeap_.pop(); + action->clearHeapHandle(); + return action; } double Model::nextOccuringEvent(double now) @@ -438,9 +399,9 @@ double Model::nextOccuringEvent(double now) double Model::nextOccuringEventLazy(double now) { - XBT_DEBUG("Before share resources, the size of modified actions set is %zd", modifiedSet_->size()); + XBT_DEBUG("Before share resources, the size of modified actions set is %zu", modifiedSet_->size()); lmm_solve(maxminSystem_); - XBT_DEBUG("After share resources, The size of modified actions set is %zd", modifiedSet_->size()); + XBT_DEBUG("After share resources, The size of modified actions set is %zu", modifiedSet_->size()); while (not modifiedSet_->empty()) { Action *action = &(modifiedSet_->front()); @@ -451,13 +412,13 @@ double Model::nextOccuringEventLazy(double now) continue; /* bogus priority, skip it */ - if (action->getPriority() <= 0 || action->getHat()==LATENCY) + if (action->getPriority() <= 0 || action->getHat() == Action::Type::LATENCY) continue; action->updateRemainingLazy(now); double min = -1; - double share = lmm_variable_getvalue(action->getVariable()); + double share = action->getVariable()->get_value(); if (share > 0) { double time_to_completion; @@ -483,15 +444,15 @@ double Model::nextOccuringEventLazy(double now) action->getMaxDuration()); if (min > -1) { - action->heapUpdate(actionHeap_, min, max_dur_flag ? MAX_DURATION : NORMAL); + action->heapUpdate(actionHeap_, min, max_dur_flag ? Action::Type::MAX_DURATION : Action::Type::NORMAL); XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min, now); } else DIE_IMPOSSIBLE; } //hereafter must have already the min value for this resource model - if (xbt_heap_size(actionHeap_) > 0) { - double min = xbt_heap_maxkey(actionHeap_) - now; + if (not actionHeapIsEmpty()) { + double min = actionHeapTopDate() - now; XBT_DEBUG("minimum with the HEAP %f", min); return min; } else { @@ -504,22 +465,22 @@ double Model::nextOccuringEventFull(double /*now*/) { maxminSystem_->solve_fun(maxminSystem_); double min = -1; - for (auto it(getRunningActionSet()->begin()), itend(getRunningActionSet()->end()); it != itend ; ++it) { - Action *action = &*it; - double value = lmm_variable_getvalue(action->getVariable()); + + for (Action& action : *getRunningActionSet()) { + double value = action.getVariable()->get_value(); if (value > 0) { - if (action->getRemains() > 0) - value = action->getRemainsNoUpdate() / value; + if (action.getRemains() > 0) + value = action.getRemainsNoUpdate() / value; else value = 0.0; if (min < 0 || value < min) { min = value; - XBT_DEBUG("Updating min (value) with %p: %f", action, min); + XBT_DEBUG("Updating min (value) with %p: %f", &action, min); } } - if ((action->getMaxDuration() >= 0) && (min<0 || action->getMaxDuration() < min)) { - min = action->getMaxDuration(); - XBT_DEBUG("Updating min (duration) with %p: %f", action, min); + if ((action.getMaxDuration() >= 0) && (min < 0 || action.getMaxDuration() < min)) { + min = action.getMaxDuration(); + XBT_DEBUG("Updating min (duration) with %p: %f", &action, min); } } XBT_DEBUG("min value : %f", min); @@ -555,9 +516,10 @@ void Model::updateActionsStateFull(double /*now*/, double /*delta*/) ************/ namespace simgrid { -namespace surf { +namespace kernel { +namespace model { -Resource::Resource(Model* model, const char* name, lmm_constraint_t constraint) +Resource::Resource(surf::Model* model, const std::string& name, lmm::Constraint* constraint) : name_(name), model_(model), constraint_(constraint) {} @@ -580,12 +542,22 @@ void Resource::turnOff() isOn_ = false; } -Model* Resource::model() const +double Resource::getLoad() +{ + return constraint_->get_usage(); +} + +surf::Model* Resource::model() const { return model_; } -const char* Resource::cname() const +const std::string& Resource::getName() const +{ + return name_; +} + +const char* Resource::getCname() const { return name_.c_str(); } @@ -594,32 +566,19 @@ bool Resource::operator==(const Resource &other) const { return name_ == other.name_; } -lmm_constraint_t Resource::constraint() const +kernel::lmm::Constraint* Resource::constraint() const { - return constraint_; + return const_cast(constraint_); } } +} // namespace kernel } /********** * Action * **********/ -const char *surf_action_state_names[6] = { - "SURF_ACTION_READY", - "SURF_ACTION_RUNNING", - "SURF_ACTION_FAILED", - "SURF_ACTION_DONE", - "SURF_ACTION_TO_FREE", - "SURF_ACTION_NOT_IN_THE_SYSTEM" -}; - -/* added to manage the communication action's heap */ -void surf_action_lmm_update_index_heap(void *action, int i) { - static_cast(action)->updateIndexHeap(i); -} - namespace simgrid { namespace surf { @@ -627,7 +586,7 @@ Action::Action(simgrid::surf::Model* model, double cost, bool failed) : Action(m { } -Action::Action(simgrid::surf::Model* model, double cost, bool failed, lmm_variable_t var) +Action::Action(simgrid::surf::Model* model, double cost, bool failed, kernel::lmm::Variable* var) : remains_(cost), start_(surf_get_clock()), cost_(cost), model_(model), variable_(var) { if (failed) @@ -642,11 +601,13 @@ Action::~Action() { xbt_free(category_); } -void Action::finish() { - finishTime_ = surf_get_clock(); +void Action::finish(Action::State state) +{ + finishTime_ = surf_get_clock(); + setState(state); } -Action::State Action::getState() +Action::State Action::getState() const { if (stateSet_ == model_->getReadyActionSet()) return Action::State::ready; @@ -661,7 +622,7 @@ Action::State Action::getState() void Action::setState(Action::State state) { - stateSet_->erase(stateSet_->iterator_to(*this)); + simgrid::xbt::intrusive_erase(*stateSet_, *this); switch (state) { case Action::State::ready: stateSet_ = model_->getReadyActionSet(); @@ -683,38 +644,22 @@ void Action::setState(Action::State state) stateSet_->push_back(*this); } -double Action::getBound() +double Action::getBound() const { - return (variable_) ? lmm_variable_getbound(variable_) : 0; + return variable_ ? variable_->get_bound() : 0; } void Action::setBound(double bound) { XBT_IN("(%p,%g)", this, bound); if (variable_) - lmm_update_variable_bound(getModel()->getMaxminSystem(), variable_, bound); + getModel()->getMaxminSystem()->update_variable_bound(variable_, bound); if (getModel()->getUpdateMechanism() == UM_LAZY && getLastUpdate() != surf_get_clock()) heapRemove(getModel()->getActionHeap()); XBT_OUT(); } -double Action::getStartTime() -{ - return start_; -} - -double Action::getFinishTime() -{ - /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */ - return remains_ <= 0 ? finishTime_ : -1; -} - -void Action::setData(void* data) -{ - data_ = data; -} - void Action::setCategory(const char *category) { category_ = xbt_strdup(category); @@ -731,13 +676,11 @@ void Action::setMaxDuration(double duration) heapRemove(getModel()->getActionHeap()); } -void Action::gapRemove() {} - -void Action::setPriority(double priority) +void Action::setSharingWeight(double weight) { - XBT_IN("(%p,%g)", this, priority); - priority_ = priority; - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), priority); + XBT_IN("(%p,%g)", this, weight); + sharingWeight_ = weight; + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), weight); if (getModel()->getUpdateMechanism() == UM_LAZY) heapRemove(getModel()->getActionHeap()); @@ -748,7 +691,7 @@ void Action::cancel(){ setState(Action::State::failed); if (getModel()->getUpdateMechanism() == UM_LAZY) { if (action_lmm_hook.is_linked()) - getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this)); + simgrid::xbt::intrusive_erase(*getModel()->getModifiedSet(), *this); heapRemove(getModel()->getActionHeap()); } } @@ -757,14 +700,14 @@ int Action::unref(){ refcount_--; if (not refcount_) { if (action_hook.is_linked()) - stateSet_->erase(stateSet_->iterator_to(*this)); + simgrid::xbt::intrusive_erase(*stateSet_, *this); if (getVariable()) - lmm_variable_free(getModel()->getMaxminSystem(), getVariable()); + getModel()->getMaxminSystem()->variable_free(getVariable()); if (getModel()->getUpdateMechanism() == UM_LAZY) { /* remove from heap */ heapRemove(getModel()->getActionHeap()); if (action_lmm_hook.is_linked()) - getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this)); + simgrid::xbt::intrusive_erase(*getModel()->getModifiedSet(), *this); } delete this; return 1; @@ -775,16 +718,17 @@ int Action::unref(){ void Action::suspend() { XBT_IN("(%p)", this); - if (suspended_ != 2) { - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0); + if (suspended_ != SuspendStates::sleeping) { + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), 0.0); if (getModel()->getUpdateMechanism() == UM_LAZY){ heapRemove(getModel()->getActionHeap()); - if (getModel()->getUpdateMechanism() == UM_LAZY && stateSet_ == getModel()->getRunningActionSet() && priority_ > 0){ + if (getModel()->getUpdateMechanism() == UM_LAZY && stateSet_ == getModel()->getRunningActionSet() && + sharingWeight_ > 0) { //If we have a lazy model, we need to update the remaining value accordingly updateRemainingLazy(surf_get_clock()); } } - suspended_ = 1; + suspended_ = SuspendStates::suspended; } XBT_OUT(); } @@ -792,9 +736,9 @@ void Action::suspend() void Action::resume() { XBT_IN("(%p)", this); - if (suspended_ != 2) { - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), priority_); - suspended_ = 0; + if (suspended_ != SuspendStates::sleeping) { + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), getPriority()); + suspended_ = SuspendStates::not_suspended; if (getModel()->getUpdateMechanism() == UM_LAZY) heapRemove(getModel()->getActionHeap()); } @@ -803,7 +747,7 @@ void Action::resume() bool Action::isSuspended() { - return suspended_ == 1; + return suspended_ == SuspendStates::suspended; } /* insert action on heap using a given key and a hat (heap_action_type) * a hat can be of three types for communications: @@ -812,34 +756,31 @@ bool Action::isSuspended() * 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 Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat) +void Action::heapInsert(heap_type& heap, double key, Action::Type hat) { hat_ = hat; - xbt_heap_push(heap, this, key); + heapHandle_ = heap.emplace(std::make_pair(key, this)); } -void Action::heapRemove(xbt_heap_t heap) +void Action::heapRemove(heap_type& heap) { - hat_ = NOTSET; - if (indexHeap_ >= 0) { - xbt_heap_remove(heap, indexHeap_); + hat_ = Action::Type::NOTSET; + if (heapHandle_) { + heap.erase(*heapHandle_); + clearHeapHandle(); } } -void Action::heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat) +void Action::heapUpdate(heap_type& heap, double key, Action::Type hat) { hat_ = hat; - if (indexHeap_ >= 0) { - xbt_heap_update(heap, indexHeap_, key); - }else{ - xbt_heap_push(heap, this, key); + if (heapHandle_) { + heap.update(*heapHandle_, std::make_pair(key, this)); + } else { + heapHandle_ = heap.emplace(std::make_pair(key, this)); } } -void Action::updateIndexHeap(int i) { - indexHeap_ = i; -} - double Action::getRemains() { XBT_IN("(%p)", this); @@ -850,63 +791,5 @@ double Action::getRemains() return remains_; } -double Action::getRemainsNoUpdate() -{ - return remains_; -} - -//FIXME split code in the right places -void Action::updateRemainingLazy(double now) -{ - double delta = 0.0; - - if(getModel() == surf_network_model) - { - if (suspended_ != 0) - return; - } - else - { - xbt_assert(stateSet_ == getModel()->getRunningActionSet(), "You're updating an action that is not running."); - xbt_assert(priority_ > 0, "You're updating an action that seems suspended."); - } - - delta = now - lastUpdate_; - - if (remains_ > 0) { - XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, remains_, lastUpdate_); - double_update(&remains_, lastValue_ * delta, sg_surf_precision*sg_maxmin_precision); - - if (getModel() == surf_cpu_model_pm && TRACE_is_enabled()) { - simgrid::surf::Resource *cpu = static_cast( - lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0))); - TRACE_surf_host_set_utilization(cpu->cname(), getCategory(), lastValue_, lastUpdate_, now - lastUpdate_); - } - XBT_DEBUG("Updating action(%p): remains is now %f", this, remains_); - } - - if(getModel() == surf_network_model) - { - if (maxDuration_ != NO_MAX_DURATION) - double_update(&maxDuration_, delta, sg_surf_precision); - - //FIXME: duplicated code - if ((remains_ <= 0) && - (lmm_get_variable_weight(getVariable()) > 0)) { - finish(); - setState(Action::State::done); - heapRemove(getModel()->getActionHeap()); - } else if (((maxDuration_ != NO_MAX_DURATION) - && (maxDuration_ <= 0))) { - finish(); - setState(Action::State::done); - heapRemove(getModel()->getActionHeap()); - } - } - - lastUpdate_ = now; - lastValue_ = lmm_variable_getvalue(getVariable()); -} - } }