From a4c794c9fa3141ad09273fff34b6ac8e0f5dd76a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Oct 2025 20:34:51 +0200 Subject: [PATCH 1/2] tweak, compiler optimizes it away anyways though --- esphome/components/api/api_frame_helper.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/esphome/components/api/api_frame_helper.cpp b/esphome/components/api/api_frame_helper.cpp index 08ed375a0d..f0a6d92d8b 100644 --- a/esphome/components/api/api_frame_helper.cpp +++ b/esphome/components/api/api_frame_helper.cpp @@ -109,9 +109,11 @@ void APIFrameHelper::buffer_data_from_iov_(const struct iovec *iov, int iovcnt, return; } - auto buffer = std::make_unique(); - buffer->size = total_write_len - offset; - buffer->data = std::make_unique(buffer->size); + uint16_t buffer_size = total_write_len - offset; + auto &buffer = this->tx_buf_[this->tx_buf_tail_]; + buffer = std::make_unique(); + buffer->size = buffer_size; + buffer->data = std::make_unique(buffer_size); uint16_t to_skip = offset; uint16_t write_pos = 0; @@ -130,8 +132,7 @@ void APIFrameHelper::buffer_data_from_iov_(const struct iovec *iov, int iovcnt, } } - // Add to circular buffer - this->tx_buf_[this->tx_buf_tail_] = std::move(buffer); + // Update circular buffer tracking this->tx_buf_tail_ = (this->tx_buf_tail_ + 1) % API_MAX_SEND_QUEUE; this->tx_buf_count_++; } From 4b10bf09be76c69d564da360bc09a8da053d1d11 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Oct 2025 20:36:40 +0200 Subject: [PATCH 2/2] tweak, compiler optimizes it away anyways though --- esphome/components/api/api_frame_helper.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/esphome/components/api/api_frame_helper.cpp b/esphome/components/api/api_frame_helper.cpp index f0a6d92d8b..c9a5b2885e 100644 --- a/esphome/components/api/api_frame_helper.cpp +++ b/esphome/components/api/api_frame_helper.cpp @@ -111,9 +111,11 @@ void APIFrameHelper::buffer_data_from_iov_(const struct iovec *iov, int iovcnt, uint16_t buffer_size = total_write_len - offset; auto &buffer = this->tx_buf_[this->tx_buf_tail_]; - buffer = std::make_unique(); - buffer->size = buffer_size; - buffer->data = std::make_unique(buffer_size); + buffer = std::make_unique(SendBuffer{ + .data = std::make_unique(buffer_size), + .size = buffer_size, + .offset = 0, + }); uint16_t to_skip = offset; uint16_t write_pos = 0;