[core] Inline loop gate expression to avoid stale local reuse

The previous gate captured each subexpression in a named local
(high_frequency, elapsed, woke). Locals are easy to reuse later in
the function, and we have hit bugs from stale reuse before — most
recently is_high_frequency being read again instead of re-checked.
Inline the expression directly into do_component_phase so there is
nothing tempting to reuse downstream.
This commit is contained in:
J. Nick Koston
2026-04-30 06:34:14 -05:00
parent 1398dcebb4
commit 59a8057e9a
+6 -4
View File
@@ -637,10 +637,12 @@ inline void ESPHOME_ALWAYS_INLINE Application::loop() {
// flag preserves it. wake_request_take() exchange-clears the flag; wakes
// that arrive during Phase B re-set it and run Phase B again on the next
// iteration.
const bool high_frequency = HighFrequencyLoopRequester::is_high_frequency();
const uint32_t elapsed = now - this->last_loop_;
const bool woke = esphome::wake_request_take();
const bool do_component_phase = high_frequency || woke || (elapsed >= this->loop_interval_);
//
// wake_request_take() must always be called first since it does an
// atomic exchange to clear the flag, and we want to run the component phase
// if either the flag was set or the scheduler requested a high-frequency loop.
const bool do_component_phase = esphome::wake_request_take() || HighFrequencyLoopRequester::is_high_frequency() ||
(now - this->last_loop_ >= this->loop_interval_);
if (do_component_phase) {
ComponentPhaseGuard phase_guard{*this};