[api] Remove single-buffer write_raw_slow_ overload to save 33 bytes

Callers construct iovec inline instead of going through a 33-byte
wrapper function. The iovec construction is trivial at each call site.
This commit is contained in:
J. Nick Koston
2026-03-29 11:40:22 -10:00
parent 9df835600c
commit d7464f94b8
4 changed files with 10 additions and 14 deletions
+1 -7
View File
@@ -112,13 +112,7 @@ APIError APIFrameHelper::drain_overflow_and_handle_errors_() {
return APIError::OK;
}
// Single-buffer slow path: wraps data in iovec and delegates to the iovec slow path.
APIError APIFrameHelper::write_raw_slow_(const void *data, uint16_t len, ssize_t sent) {
struct iovec iov = {const_cast<void *>(data), len};
return this->write_raw_slow_(&iov, 1, len, sent);
}
// Multi-buffer slow path: handles partial writes, errors, and overflow buffering.
// Slow path: handles partial writes, errors, and overflow buffering.
// Called when the inline fast path in the header couldn't complete the write.
// sent == -1 means either the fast path write returned -1, or there was overflow backlog.
APIError APIFrameHelper::write_raw_slow_(const struct iovec *iov, int iovcnt, uint16_t total_write_len, ssize_t sent) {
+3 -4
View File
@@ -200,7 +200,8 @@ class APIFrameHelper {
if (sent == static_cast<ssize_t>(len)) [[likely]]
return APIError::OK;
}
return this->write_raw_slow_(data, len, sent);
struct iovec iov = {const_cast<void *>(data), len};
return this->write_raw_slow_(&iov, 1, len, sent);
}
inline APIError ESPHOME_ALWAYS_INLINE write_raw_fast_(const struct iovec *iov, int iovcnt, uint16_t total_write_len) {
ssize_t sent = -1;
@@ -212,9 +213,7 @@ class APIFrameHelper {
return this->write_raw_slow_(iov, iovcnt, total_write_len, sent);
}
// Write methods — used by cold paths (handshake, error handling)
// These go through the slow path directly, avoiding inlining the fast path at the call site.
APIError write_raw_slow_(const void *data, uint16_t len, ssize_t sent);
// Slow path (out-of-line): handle partial writes, errors, overflow buffering
APIError write_raw_slow_(const struct iovec *iov, int iovcnt, uint16_t total_write_len, ssize_t sent);
// Socket ownership (4 bytes on 32-bit, 8 bytes on 64-bit)
@@ -540,7 +540,8 @@ APIError APINoiseFrameHelper::write_frame_(const uint8_t *data, uint16_t len) {
header[2] = (uint8_t) len;
if (len == 0) {
return this->write_raw_slow_(header, 3, -1);
struct iovec iov = {header, 3};
return this->write_raw_slow_(&iov, 1, 3, -1);
}
struct iovec iov[2];
iov[0].iov_base = header;
@@ -219,11 +219,13 @@ APIError APIPlaintextFrameHelper::read_packet(ReadPacketBuffer *buffer) {
"Bad indicator byte";
char msg[INDICATOR_MSG_SIZE];
memcpy_P(msg, MSG_PROGMEM, INDICATOR_MSG_SIZE);
this->write_raw_slow_(msg, INDICATOR_MSG_SIZE, -1);
struct iovec iov = {msg, INDICATOR_MSG_SIZE};
this->write_raw_slow_(&iov, 1, INDICATOR_MSG_SIZE, -1);
#else
static const char MSG[] = "\x00"
"Bad indicator byte";
this->write_raw_slow_(MSG, INDICATOR_MSG_SIZE, -1);
struct iovec iov = {const_cast<char *>(MSG), INDICATOR_MSG_SIZE};
this->write_raw_slow_(&iov, 1, INDICATOR_MSG_SIZE, -1);
#endif
}
return aerr;