Skip to content

Ci fix esp32s2 wifi - #2382

Open
petermm wants to merge 3 commits into
atomvm:release-0.7from
petermm:ci-fix-esp32s2-wifi-harness
Open

Ci fix esp32s2 wifi#2382
petermm wants to merge 3 commits into
atomvm:release-0.7from
petermm:ci-fix-esp32s2-wifi-harness

Conversation

@petermm

@petermm petermm commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

ESP32 CI harness had a leak of the xQueue - LLM estimated close to 0.5kb times 22 leaks for a total of around 10kb leak.

Heap instrumentation with the queue fix already applied showed a further drop from approximately 75,288 to 63,744 bytes of free heap across repeated Wi-Fi teardown and reinitialization: about 11.5kb of additional retained memory.

A smaller leak came from the ESP32 network driver. Each network:start/1 allocated a 32-byte ClientData structure, plus allocator metadata, which was not released after unregistering the event handlers. This is approximately 0.04kb per network start, or around 0.1kb for the three Wi-Fi starts exercised by the ESP32-S2 test run.

Together with the queue leak, the harness was retaining roughly 21-22kb of heap during the test run. This was enough to prevent the Wi-Fi driver from allocating all of its static RX buffers on memory-constrained ESP32-S2 configurations.

The fixes:

  • Add a ValuesHashTable destructor and use it in initialization failure paths and final teardown.
  • Destroy remaining contexts and release the module index, module hash table, and atom table from globalcontext_destroy().
  • Track the ESP32 network callback data in the platform data and free it after the handlers, Wi-Fi driver, and network interfaces have been shut down.

These changes are made under both the "Apache 2.0" and the "GNU Lesser General
Public License 2.1 or later" license terms (dual license).

SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later

petermm added 3 commits July 24, 2026 16:26
The ESP32 event queue and queue set are process-global, but every test VM initialized them again and overwrote the existing handles. Each invocation leaked both FreeRTOS allocations and gradually exhausted heap on memory-constrained targets.

Make queue initialization idempotent and drain retained sender events in the test harness before creating each new GlobalContext. Draining through the queue set prevents stale pointers from a destroyed VM from being delivered to the next one without adding test lifecycle handling to production firmware.

Use an explicit void parameter list for the queue initializer declaration and definition.

Signed-off-by: Peter M <petermm@gmail.com>
globalcontext_destroy did not release live contexts, the module index and hash table, or the atom table. Repeated test VMs therefore steadily exhausted heap on memory-constrained targets.

Add a ValuesHashTable destructor, use it in initialization failure paths and final teardown, destroy remaining contexts, and exercise hash-table destruction in the structure test.

Signed-off-by: Peter M <petermm@gmail.com>
network:start allocates ClientData shared by registered event handlers, but teardown only unregistered the callbacks. Repeated network-driver lifecycles therefore leaked the allocation.

Track the callback data in ESP32PlatformData and release it after the handlers, Wi-Fi driver, and network interfaces are shut down.

Signed-off-by: Peter M <petermm@gmail.com>
@petermm
petermm force-pushed the ci-fix-esp32s2-wifi-harness branch from 13bbf17 to 5289683 Compare August 21, 2026 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant