X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5a5f54e7f74566a2418d243e7885e737c2312a36..a7ece9a7073ae69a657ba432b187a69ef7db23d9:/src/surf/surf_interface.cpp diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index bd45679669..42b84483a4 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. @@ -402,7 +365,6 @@ Model::Model() doneActionSet_ = new ActionList(); modifiedSet_ = nullptr; - actionHeap_ = nullptr; updateMechanism_ = UM_UNDEFINED; selectiveUpdate_ = 0; } @@ -414,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 @@ -479,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 { @@ -609,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 { @@ -806,34 +771,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);