From: Arnaud Giersch Date: Sun, 12 Nov 2017 21:37:43 +0000 (+0100) Subject: Replace xbt_heap with boost::heap for surf actions. X-Git-Tag: v3.18~242^2~48 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/b56f5db19216ad6717f65e0c52383c87bad6e043?hp=be79f9bbdee8f1458cb67e2644d48783dad66fb9 Replace xbt_heap with boost::heap for surf actions. Use a stable order to ensure reproducibility. Note: it's not fully tested if pairing_heap is the best choice among availables heaps (binomial, fibonacci, ...). It's easy to change if needed. --- diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp index aa47bfff92..e9655c4ecf 100644 --- a/src/surf/cpu_cas01.cpp +++ b/src/surf/cpu_cas01.cpp @@ -210,7 +210,6 @@ CpuCas01Action::CpuCas01Action(Model* model, double cost, bool failed, double sp , requestedCore_(requestedCore) { if (model->getUpdateMechanism() == UM_LAZY) { - updateIndexHeap(-1); refreshLastUpdate(); setLastValue(0.0); } diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index a4c47a56e2..0611e46a0d 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -646,7 +646,6 @@ CpuTiAction::CpuTiAction(CpuTiModel *model_, double cost, bool failed, CpuTi *cp : CpuAction(model_, cost, failed) , cpu_(cpu) { - updateIndexHeap(-1); cpu_->modified(true); } diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index e1896d35af..bd5b18af45 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -289,7 +289,6 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz action->latency_ = latency; action->rate_ = rate; if (getUpdateMechanism() == UM_LAZY) { - action->updateIndexHeap(-1); action->refreshLastUpdate(); } diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 01318caa06..632776c082 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -365,20 +365,25 @@ Model::Model() doneActionSet_ = new ActionList(); modifiedSet_ = nullptr; - actionHeap_ = xbt_heap_new(8, nullptr); - xbt_heap_set_update_callback(actionHeap_, surf_action_lmm_update_index_heap); updateMechanism_ = UM_UNDEFINED; selectiveUpdate_ = 0; } Model::~Model(){ - xbt_heap_free(actionHeap_); delete readyActionSet_; delete runningActionSet_; delete failedActionSet_; 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 @@ -574,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 { @@ -771,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(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(key, this); } } -void Action::updateIndexHeap(int i) { - indexHeap_ = i; -} - double Action::getRemains() { XBT_IN("(%p)", this); diff --git a/src/surf/surf_interface.hpp b/src/surf/surf_interface.hpp index 14c92a03d8..0644588618 100644 --- a/src/surf/surf_interface.hpp +++ b/src/surf/surf_interface.hpp @@ -10,10 +10,11 @@ #include "src/surf/surf_private.hpp" #include "surf/surf.hpp" -#include "xbt/heap.h" #include "xbt/str.h" +#include #include +#include #include #include #include @@ -66,8 +67,6 @@ enum heap_action_type{ * Action * **********/ -XBT_PRIVATE void surf_action_lmm_update_index_heap(void *action, int i); - /** \ingroup SURF_models * \brief List of initialized models */ @@ -76,6 +75,14 @@ XBT_PUBLIC_DATA(std::vector*) all_existing_models; namespace simgrid { namespace surf { +typedef std::pair heap_element_type; +struct heap_element_compare { + bool operator()(const heap_element_type& a, const heap_element_type& b) const { return a.first > b.first; } +}; +typedef boost::heap::pairing_heap, boost::heap::stable, + boost::heap::compare> + heap_type; + /** @ingroup SURF_interface * @brief SURF action interface class * @details An action is an event generated by a resource (e.g.: a communication for the network) @@ -233,14 +240,14 @@ private: double lastValue_ = 0; lmm_variable_t variable_ = nullptr; enum heap_action_type hat_ = NOTSET; - int indexHeap_; + boost::optional heapHandle_ = boost::none; public: virtual void updateRemainingLazy(double now) { THROW_IMPOSSIBLE; }; - void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat); - void heapRemove(xbt_heap_t heap); - void heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat); - void updateIndexHeap(int i); + void heapInsert(heap_type& heap, double key, enum heap_action_type hat); + void heapRemove(heap_type& heap); + void heapUpdate(heap_type& heap, double key, enum heap_action_type hat); + void clearHeapHandle() { heapHandle_ = boost::none; } lmm_variable_t getVariable() {return variable_;} void setVariable(lmm_variable_t var) { variable_ = var; } double getLastUpdate() {return lastUpdate_;} @@ -299,11 +306,11 @@ public: void setUpdateMechanism(e_UM_t mechanism) { updateMechanism_ = mechanism; } /** @brief Get Action heap */ - xbt_heap_t getActionHeap() {return actionHeap_;} + heap_type& getActionHeap() { return actionHeap_; } - double actionHeapTopDate() const { return xbt_heap_maxkey(actionHeap_); } - Action* actionHeapPop() { return static_cast(xbt_heap_pop(actionHeap_)); } - bool actionHeapIsEmpty() const { return xbt_heap_size(actionHeap_) == 0; } + double actionHeapTopDate() const { return actionHeap_.top().first; } + Action* actionHeapPop(); + bool actionHeapIsEmpty() const { return actionHeap_.empty(); } /** * @brief Share the resources between the actions @@ -343,7 +350,7 @@ private: ActionList* runningActionSet_; /**< Actions in state SURF_ACTION_RUNNING */ ActionList* failedActionSet_; /**< Actions in state SURF_ACTION_FAILED */ ActionList* doneActionSet_; /**< Actions in state SURF_ACTION_DONE */ - xbt_heap_t actionHeap_; + heap_type actionHeap_; }; }