X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f734ec7475682eb90323e804cbcfddd7e4523992..ecd5f7562caf1d443bf22788fa5f4fac408776ec:/src/surf/surf_interface.cpp diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 76293aaa15..cb5ed0e386 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -16,6 +16,10 @@ #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)"); @@ -170,47 +174,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. @@ -239,23 +202,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) { for (int i = 0; table[i].name; i++) - if (not strcmp(name, table[i].name)) { + if (name == table[i].name) return i; - } if (not table[0].name) xbt_die("No model is valid! This is a bug."); - char* name_list = xbt_strdup(table[0].name); - for (int 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; } @@ -405,7 +365,6 @@ Model::Model() doneActionSet_ = new ActionList(); modifiedSet_ = nullptr; - actionHeap_ = nullptr; updateMechanism_ = UM_UNDEFINED; selectiveUpdate_ = 0; } @@ -417,6 +376,14 @@ Model::~Model(){ delete doneActionSet_; } +Action* Model::actionHeapPop() +{ + Action* action = actionHeap_.top().second; + actionHeap_.pop(); + action->clearHeapHandle(); + return action; +} + double Model::nextOccuringEvent(double now) { //FIXME: set the good function once and for all @@ -449,7 +416,7 @@ double Model::nextOccuringEventLazy(double now) 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; @@ -482,8 +449,8 @@ double Model::nextOccuringEventLazy(double now) } //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 { @@ -496,22 +463,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); @@ -577,7 +544,12 @@ 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(); } @@ -607,11 +579,6 @@ const char *surf_action_state_names[6] = { "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 { @@ -640,7 +607,7 @@ void Action::finish(Action::State state) setState(state); } -Action::State Action::getState() +Action::State Action::getState() const { if (stateSet_ == model_->getReadyActionSet()) return Action::State::ready; @@ -677,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); @@ -729,7 +680,7 @@ void Action::setSharingWeight(double weight) { XBT_IN("(%p,%g)", this, weight); sharingWeight_ = weight; - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), weight); + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), weight); if (getModel()->getUpdateMechanism() == UM_LAZY) heapRemove(getModel()->getActionHeap()); @@ -751,7 +702,7 @@ int Action::unref(){ if (action_hook.is_linked()) stateSet_->erase(stateSet_->iterator_to(*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()); @@ -768,7 +719,7 @@ void Action::suspend() { XBT_IN("(%p)", this); if (suspended_ != 2) { - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0); + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), 0.0); if (getModel()->getUpdateMechanism() == UM_LAZY){ heapRemove(getModel()->getActionHeap()); if (getModel()->getUpdateMechanism() == UM_LAZY && stateSet_ == getModel()->getRunningActionSet() && @@ -786,7 +737,7 @@ void Action::resume() { XBT_IN("(%p)", this); if (suspended_ != 2) { - lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), sharingWeight_); + getModel()->getMaxminSystem()->update_variable_weight(getVariable(), getPriority()); suspended_ = 0; if (getModel()->getUpdateMechanism() == UM_LAZY) heapRemove(getModel()->getActionHeap()); @@ -805,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, enum heap_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_); + 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, enum heap_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); @@ -843,10 +791,5 @@ double Action::getRemains() return remains_; } -double Action::getRemainsNoUpdate() -{ - return remains_; -} - } }