From 8db6f3129cb35a9a0fe8c5c4977af5be9521c2db Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sun, 9 Jun 2019 13:19:57 +0200 Subject: [PATCH] Fix scheduler --- .../esp32_ble_tracker/esp32_ble_tracker.cpp | 2 +- esphome/core/scheduler.cpp | 35 ++++++++----------- esphome/core/scheduler.h | 3 +- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp index 043fdb409d..3aaf8eaa44 100644 --- a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +++ b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp @@ -164,7 +164,7 @@ void ESP32BLETracker::start_scan(bool first) { esp_ble_gap_set_scan_params(&this->scan_params_); esp_ble_gap_start_scanning(this->scan_interval_); - this->set_timeout("scan", this->scan_interval_ * 2000, [] () { + this->set_timeout("scan", this->scan_interval_ * 2000, []() { ESP_LOGW(TAG, "ESP-IDF BLE scan never terminated, rebooting to restore BLE stack..."); App.reboot(); }); diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index de139e2cef..2531baf9d5 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -65,7 +65,7 @@ bool HOT Scheduler::cancel_interval(Component *component, const std::string &nam return this->cancel_item_(component, name, SchedulerItem::INTERVAL); } optional HOT Scheduler::next_schedule_in() { - if (!this->peek_()) + if (this->items_.empty()) return {}; auto *item = this->items_[0]; const uint32_t now = millis(); @@ -79,8 +79,8 @@ void ICACHE_RAM_ATTR HOT Scheduler::call() { this->process_to_add(); while (true) { - bool has_item = this->peek_(); - if (!has_item) + this->cleanup_(); + if (this->items_.empty()) // No more item left, done! break; @@ -132,14 +132,14 @@ void ICACHE_RAM_ATTR HOT Scheduler::call() { this->process_to_add(); } void HOT Scheduler::process_to_add() { - for (auto &it : this->to_add_) { + for (auto *it : this->to_add_) { if (it->remove) { delete it; continue; } this->items_.push_back(it); - std::push_heap(this->items_.begin(), this->items_.end()); + std::push_heap(this->items_.begin(), this->items_.end(), SchedulerItem::cmp); } this->to_add_.clear(); } @@ -153,12 +153,8 @@ void HOT Scheduler::cleanup_() { this->pop_raw_(); } } -bool HOT Scheduler::peek_() { - this->cleanup_(); - return !this->items_.empty(); -} void HOT Scheduler::pop_raw_() { - std::pop_heap(this->items_.begin(), this->items_.end()); + std::pop_heap(this->items_.begin(), this->items_.end(), SchedulerItem::cmp); this->items_.pop_back(); } void HOT Scheduler::push_(Scheduler::SchedulerItem *item) { this->to_add_.push_back(item); } @@ -169,7 +165,7 @@ bool HOT Scheduler::cancel_item_(Component *component, const std::string &name, it->remove = true; ret = true; } - for (auto &it : this->to_add_) + for (auto *it : this->to_add_) if (it->component == component && it->name == name && it->type == type) { it->remove = true; ret = true; @@ -178,16 +174,15 @@ bool HOT Scheduler::cancel_item_(Component *component, const std::string &name, return ret; } -bool HOT Scheduler::SchedulerItem::operator<(const Scheduler::SchedulerItem &other) const { +bool HOT Scheduler::SchedulerItem::cmp(Scheduler::SchedulerItem *a, Scheduler::SchedulerItem *b) { // min-heap - uint32_t this_next_exec = this->last_execution + this->timeout; - bool this_overflow = this_next_exec < this->last_execution; - uint32_t other_next_exec = other.last_execution + other.timeout; - bool other_overflow = other_next_exec < other.last_execution; - if (this_overflow == other_overflow) - return this_next_exec > other_next_exec; + uint32_t a_next_exec = a->last_execution + a->timeout; + bool a_overflow = a_next_exec < a->last_execution; + uint32_t b_next_exec = b->last_execution + b->timeout; + bool b_overflow = b_next_exec < b->last_execution; + if (a_overflow == b_overflow) + return a_next_exec > b_next_exec; - return this_overflow; + return a_overflow; } - } // namespace esphome diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index e1ecdbb409..ee2a082265 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -33,11 +33,10 @@ class Scheduler { std::function f; bool remove; - bool operator<(const SchedulerItem &other) const; + static bool cmp(SchedulerItem *a, SchedulerItem *b); }; void cleanup_(); - bool peek_(); void pop_raw_(); void push_(SchedulerItem *item); bool cancel_item_(Component *component, const std::string &name, SchedulerItem::Type type);