mirror of
https://github.com/esphome/esphome.git
synced 2026-09-23 21:14:03 +00:00
[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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user