From c03dd86796b8fa91ba58bf24d157373175ced17e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 16 Mar 2026 12:03:10 -1000 Subject: [PATCH] Replace modulo with compare-and-reset for circular buffer indices Modulo generates a full division on ESP8266 since API_MAX_SEND_QUEUE is not a power of 2. Use increment + compare instead. --- esphome/components/api/api_overflow_buffer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/api/api_overflow_buffer.cpp b/esphome/components/api/api_overflow_buffer.cpp index af3b670e0e..76b70c624e 100644 --- a/esphome/components/api/api_overflow_buffer.cpp +++ b/esphome/components/api/api_overflow_buffer.cpp @@ -31,7 +31,8 @@ ssize_t APIOverflowBuffer::try_drain(socket::Socket *socket) { // Entry fully sent — free it and advance Entry::destroy(front); this->queue_[this->head_] = nullptr; - this->head_ = (this->head_ + 1) % API_MAX_SEND_QUEUE; + if (++this->head_ >= API_MAX_SEND_QUEUE) + this->head_ = 0; this->count_--; } @@ -62,7 +63,8 @@ bool APIOverflowBuffer::enqueue_iov(const struct iovec *iov, int iovcnt, uint16_ } } - this->tail_ = (this->tail_ + 1) % API_MAX_SEND_QUEUE; + if (++this->tail_ >= API_MAX_SEND_QUEUE) + this->tail_ = 0; this->count_++; return true; }