More scheduler fixes

This commit is contained in:
Otto Winter 2019-06-30 12:18:27 +02:00
parent 840f599631
commit 6c493d10d2
No known key found for this signature in database
GPG Key ID: DB66C0BE6013F97E

View File

@ -84,27 +84,32 @@ void ICACHE_RAM_ATTR HOT Scheduler::call() {
// Uncomment for debugging the scheduler: // Uncomment for debugging the scheduler:
// if (random_uint32() % 400 == 0) { // if (random_uint32() % 400 == 0) {
// std::vector<SchedulerItem *> old_items = this->items_; // std::vector<SchedulerItem *> old_items = this->items_;
// ESP_LOGVV(TAG, "Items: (%u)", this->items_.size()); // ESP_LOGVV(TAG, "Items: count=%u, now=%u", this->items_.size(), now);
// while (!this->empty_()) { // while (!this->empty_()) {
// auto *item = this->items_[0]; // auto *item = this->items_[0];
// const char *type = item->type == SchedulerItem::INTERVAL ? "interval" : "timeout"; // const char *type = item->type == SchedulerItem::INTERVAL ? "interval" : "timeout";
// ESP_LOGVV(TAG, " %s '%s' interval=%u last_execution=%u next=%u", // ESP_LOGVV(TAG, " %s '%s' interval=%u last_execution=%u (%u) next=%u",
// type, item->name.c_str(), item->interval, item->last_execution, item->last_execution + // type, item->name.c_str(), item->interval, item->last_execution, item->last_execution_major,
// item->interval); // item->last_execution + item->interval);
// this->pop_raw_(); // this->pop_raw_();
// }
// ESP_LOGVV(TAG, "\n");
// this->items_ = old_items;
// } // }
// ESP_LOGVV(TAG, "\n");
// this->items_ = old_items;
//}
while (!this->empty_()) { while (!this->empty_()) {
// Don't copy-by value yet // Don't copy-by value yet
auto *item = this->items_[0]; auto *item = this->items_[0];
if ((now - item->last_execution) < item->interval || item->last_execution_major != this->millis_major_) if ((now - item->last_execution) < item->interval)
// Not reached timeout yet, done for this call // Not reached timeout yet, done for this call
break; break;
uint8_t major = item->last_execution_major;
if (item->last_execution + item->interval < item->last_execution)
major++;
if (major != this->millis_major_)
break;
// Don't run on failed components // Don't run on failed components
if (item->component != nullptr && item->component->is_failed()) { if (item->component != nullptr && item->component->is_failed()) {