Commit Graph
26371 Commits
Author SHA1 Message Date
J. Nick Koston f789767614 Merge remote-tracking branch 'upstream/encode-to-buffer-combine-resize-v2' into integration 2026-04-01 10:58:42 -10:00
J. Nick Koston 09648b86f9 [api] Combine reserve_and_resize + resize in encode_to_buffer
For non-first batch messages, fold the payload resize into the
reserve_and_resize call. This eliminates a redundant size() read,
a redundant capacity check, and an extra jump on the hot path.

Saves 17 bytes in encode_to_buffer (130 → 113) and ~5 instructions
on the second-message path.
2026-04-01 10:57:46 -10:00
J. Nick Koston fd4d6beef2 Merge branch 'inline-push-item' into integration 2026-04-01 10:33:49 -10:00
J. Nick Koston 702093fae6 [api] Inline get_batch_delay_ms_ — trivial forwarder 2026-04-01 10:14:08 -10:00
J. Nick Koston e2e2b7d699 [api] Move schedule_message_front_ out-of-line to avoid cold path bloat
schedule_message_front_ is only called from cold paths (on_shutdown,
check_keepalive_). Moving it out-of-line prevents add_item_front and
push_back from being inlined into those callers.
2026-04-01 10:09:20 -10:00
J. Nick Koston 475927e3c4 [api] Revert add_item_front back to inline — single call site 2026-04-01 10:08:24 -10:00
J. Nick Koston 4f385fc2ec [api] Keep add_item_front out-of-line to avoid bloating cold callers
add_item_front is only called from on_shutdown and check_keepalive_
which are cold paths. Keeping it out-of-line prevents inlining
push_back into those callers.
2026-04-01 10:07:09 -10:00
J. Nick Koston 6d18422216 [api] Use this-> for member access in inline methods 2026-04-01 09:57:29 -10:00
J. Nick Koston b236d09734 [api] Move add_item/add_item_front inline and remove push_item
Both are only called from one site each. Moving them inline lets the
compiler inline push_back directly into the caller without a function
call barrier. Removes the now-unnecessary push_item wrapper.
2026-04-01 09:56:44 -10:00
J. Nick Koston 83f8a95e28 [api] Flatten add_item and add_item_front to inline push_back
Add __attribute__((flatten)) to add_item and add_item_front so the
compiler inlines push_item → push_back and all their callees directly
into these functions, eliminating the function call barrier.
2026-04-01 09:55:02 -10:00
J. Nick Koston 44be29789a [api] Inline push_item to allow push_back to be inlined into caller
The out-of-line push_item with __attribute__((flatten)) inlined
push_back's callees into push_item, but push_item itself remained
a function call barrier. Moving push_item inline lets the compiler
inline push_back into the actual call sites (add_item, add_item_front).
2026-04-01 09:53:37 -10:00
J. Nick Koston 18b00fb3fc [api] Revert push_item inline — CodSpeed shows 46% regression
Inlining push_item into add_item bloated the dedup loop, causing
the compiler to make worse inlining decisions. Total time went from
44µs to 64.5µs. Restore out-of-line with __attribute__((flatten))
which keeps add_item's dedup loop tight while still inlining
push_back's callees into push_item.
2026-04-01 09:51:55 -10:00
J. Nick Koston 2b8d4af1e7 [api] Inline DeferredBatch::push_item to avoid call overhead
push_item was defined out-of-line in the .cpp to avoid duplicate
_M_realloc_insert instantiation, but the function call overhead
on every add_item was visible in benchmarks. Move it inline since
it's a one-liner wrapper around push_back.
2026-04-01 09:46:04 -10:00
J. Nick Koston d82cc0c08a [api] Guard benchmark friend declarations with USE_BENCHMARK 2026-04-01 09:43:47 -10:00
J. Nick Koston 34cbe0abe1 [api] Fix stale comment: 1MB → 16MB socket buffers 2026-04-01 09:40:25 -10:00
J. Nick Koston 9fb8594a16 [api] Fix lint false positive on 'byte' in comment 2026-04-01 09:06:07 -10:00
J. Nick Koston c09d5d783c [api] Fix immediate benchmark to set batch_delay=0
should_send_immediately_ requires both should_try_send_immediately
flag AND batch_delay==0. Without setting batch_delay to 0, all
sends were falling back to the batch path.
2026-04-01 09:00:59 -10:00
J. Nick Koston d717c7b46c [api] Use large socket buffers and remove mid-loop draining
Increase socket buffer to 16MB so benchmarks never hit WOULD_BLOCK
during an inner loop iteration. Remove per-iteration drain_socket
calls that were adding noise and causing the immediate path to
fall back to batching. Drain only between outer iterations.
2026-04-01 08:54:30 -10:00
J. Nick Koston f469a7ced2 [api] Add process_batch benchmarks for single and multi-sensor
Add ProcessBatch_SingleSensor and ProcessBatch_5Sensors benchmarks
that measure the full batch processing path: queue → process_batch_ →
dispatch → encode → frame → TCP write.
2026-04-01 08:49:33 -10:00
J. Nick Koston 3a4a88df29 [api] Add warm batch benchmark and bench_clear_batch friend
Add SendSensorState_Batch_Warm that pre-warms the deferred batch vector
before benchmarking to isolate steady-state cost from allocation.
2026-04-01 08:43:38 -10:00
J. Nick Koston d3f3f89c59 [api] Extract shared TCP loopback helper for API benchmarks
Deduplicate the TCP loopback socket setup between bench_plaintext_frame
and bench_send_sensor_state into a shared bench_helpers.h header.
2026-04-01 07:48:12 -10:00
J. Nick Koston dcac526a34 [api] Add send_sensor_state benchmarks
Add benchmarks for the full send_sensor_state path covering both
immediate send and batch paths. This measures the end-to-end cost
of sending a sensor state update through an APIConnection including
entity field population, proto encode, framing, and TCP write.
2026-04-01 07:42:58 -10:00
J. Nick Koston 12ab72fb21 Merge remote-tracking branch 'upstream/dev' into integration 2026-04-01 07:13:34 -10:00
Jonathan Swoboda 2e3ea2152d [esp32_camera] Bump esp32-camera to v2.1.6 (#15349) 2026-04-01 07:13:23 -10:00
J. Nick Koston 87a0d0d858 Merge remote-tracking branch 'upstream/dev' into integration 2026-04-01 07:12:13 -10:00
J. Nick Koston ea609d3552 [runtime_stats] Store stats inline on Component to eliminate std::map lookup (#15345) 2026-04-01 07:09:04 -10:00
f33fd047ee [hdc2080] Add support for HDC2080 sensor (#9331)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: Big Mike <mikelawrence@users.noreply.github.com>
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-04-01 12:09:22 -04:00
cc88896280 [debug] add peripherals status (#12053)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-04-01 15:04:22 +00:00
J. Nick Koston bac0a23f20 Merge branch 'bluetooth-proxy-set-interval' into integration 2026-04-01 00:35:00 -10:00
J. Nick Koston 7ac7155c74 Merge remote-tracking branch 'upstream/runtime-stats-inline-recording' into integration 2026-04-01 00:32:06 -10:00
J. Nick Koston a9e81e6c42 Remove unnecessary nullptr guard — component is never null 2026-04-01 00:31:31 -10:00
J. Nick Koston 9f92df69f8 Fix clang-tidy: single-pass collection, add NOLINT for global 2026-04-01 00:29:54 -10:00
J. Nick Koston 1020f68188 Add nullptr guard in record_runtime_stats_ for scheduler items 2026-04-01 00:29:18 -10:00
J. Nick Koston c5623f5175 [bluetooth_proxy] Replace loop() with set_interval for advertisement flushing
bluetooth_proxy's loop() ran every main loop iteration (~7400 times/60s)
but only flushed advertisements every 100ms (~600 times/60s). The remaining
~6800 iterations just checked a timestamp and returned, wasting loop
framework overhead.

Replace with set_interval(100ms) so the component only runs when there's
work to do. Move flush_pending_advertisements to an inline method in the
header to avoid out-of-line call overhead in the hot parse_devices path.
Remove redundant is_connected/api_connection checks from flush since all
callers already guard.
2026-04-01 00:26:33 -10:00
J. Nick Koston 843b1c052a Merge remote-tracking branch 'upstream/libretiny-wifi-queue-abstraction' into integration 2026-03-31 23:25:15 -10:00
J. Nick Koston 08ed0840ca Merge branch 'runtime-stats-inline-recording' into integration 2026-03-31 23:21:07 -10:00
J. Nick Koston 0daa0fb29d Fix clang-tidy: remove trailing underscore from static methods 2026-03-31 23:17:18 -10:00
J. Nick Koston 695b41763a Add WarnIfComponentBlockingGuard as friend for runtime_stats_ access 2026-03-31 23:12:42 -10:00
J. Nick Koston 0b59acb922 Fix access: use friend + static comparators for protected member access 2026-03-31 23:11:33 -10:00
J. Nick Koston b63dc719e5 Fix protected access: move ComponentRuntimeStats before Component class 2026-03-31 23:08:23 -10:00
J. Nick Koston bd4bc24bcc Merge branch 'dev' into runtime-stats-inline-recording 2026-03-31 23:00:30 -10:00
J. Nick Koston d1ef6bf604 [runtime_stats] Store stats inline on Component to eliminate std::map lookup
The runtime_stats component used a std::map<Component*, ComponentRuntimeStats>
to record per-component timing data. Every loop iteration for every component
required a red-black tree lookup to record its time, adding ~2-3µs of
measurement overhead per component — often exceeding the actual work done
by lightweight components like OTA idle checks.

Move RuntimeStats struct directly onto Component (behind #ifdef USE_RUNTIME_STATS)
so recording is a direct member access with zero lookup cost. The
RuntimeStatsCollector now iterates App.components_ to collect stats instead of
maintaining its own map, eliminating ~2KB of red-black tree code.
2026-03-31 22:58:18 -10:00
Edward Firmoandpre-commit-ci-lite[bot] fbfb5d401f [nextion] Fix memory leak in reset_() (#15344)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
2026-03-31 22:34:29 -10:00
J. Nick Koston 249a4bdcf0 Add configASSERT checks for pvPortMalloc failures
Matches ESP-IDF's assert pattern for the static allocation callbacks.
2026-03-31 22:27:19 -10:00
J. Nick Koston b726d108f8 Only enable configSUPPORT_STATIC_ALLOCATION on BK72xx
RTL87xx loses 280 bytes heap with it enabled. BK72xx gains 712 bytes.
Keep it BK72xx-only where it's a clear win.
2026-03-31 22:06:35 -10:00
J. Nick Koston 08eccb081c Revert "Revert: only enable configSUPPORT_STATIC_ALLOCATION on BK72xx"
This reverts commit 444ee47ecb.
2026-03-31 22:04:44 -10:00
J. Nick Koston 444ee47ecb Revert: only enable configSUPPORT_STATIC_ALLOCATION on BK72xx
RTL87xx loses 472 bytes heap with it enabled due to different FreeRTOS
internals. BK72xx gains 712 bytes, so keep it there only.
2026-03-31 22:04:14 -10:00
J. Nick Koston bdb9618938 Enable configSUPPORT_STATIC_ALLOCATION for all LibreTiny platforms
The FreeRTOS timer command queue moves from heap to BSS on all
LibreTiny targets, not just BK72xx. RTL87xx and LN882x benefit
from the same heap savings.
2026-03-31 22:00:22 -10:00
J. Nick Koston d3545c960f Document intentional no-destructor and fast-path read rationale 2026-03-31 21:45:15 -10:00
J. Nick Koston 6e9ebf6b1b Fix scoping: declare count outside portENTER_CRITICAL block
BK72xx portENTER_CRITICAL expands to something that introduces a
scope, so variables declared between ENTER/EXIT are not visible after.
2026-03-31 21:43:21 -10:00