diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index 0dbd2ca465..17f1331d18 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -615,21 +615,14 @@ uint32_t HOT Scheduler::call(uint32_t now) { } #endif /* ESPHOME_DEBUG_SCHEDULER */ - // Cleanup removed items before processing. Read the counter once so the - // common zero-case is a single atomic load + branch; the old code called - // cleanup_() (which loads to_remove_) and then to_remove_count_() again for - // the MAX check, producing a redundant memw+load pair on the fast path. - if (this->to_remove_count_() != 0) { - // First try to clean items from the top of the heap (fast path). - this->cleanup_slow_path_(); + // Cleanup removed items before processing + // First try to clean items from the top of the heap (fast path) + this->cleanup_(); - // If we still have too many cancelled items, do a full cleanup. - // This only happens if cancelled items are stuck in the middle/bottom - // of the heap. Re-read to_remove_ because cleanup_slow_path_ may have - // decremented it. - if (this->to_remove_count_() >= MAX_LOGICALLY_DELETED_ITEMS) { - this->full_cleanup_removed_items_(); - } + // If we still have too many cancelled items, do a full cleanup + // This only happens if cancelled items are stuck in the middle/bottom of the heap + if (this->to_remove_count_() >= MAX_LOGICALLY_DELETED_ITEMS) { + this->full_cleanup_removed_items_(); } // IMPORTANT: This loop uses index-based access (items_[0]), NOT iterators. // This is intentional — fired intervals are pushed back into items_ via diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index 590c23503b..46b19855c3 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -118,7 +118,7 @@ class Scheduler { bool cancel_retry(Component *component, uint32_t id); /// Get 64-bit millisecond timestamp (handles 32-bit millis() rollover) - uint64_t ESPHOME_ALWAYS_INLINE millis_64() { return esphome::millis_64(); } + uint64_t millis_64() { return esphome::millis_64(); } // Calculate when the next scheduled item should run. // @param now On ESP32, unused for 64-bit extension (native); on other platforms, extended to 64-bit via rollover.