diff --git a/src/platforms/esp32/components/avm_sys/include/esp32_sys.h b/src/platforms/esp32/components/avm_sys/include/esp32_sys.h index e38368d3db..a432b9f15c 100644 --- a/src/platforms/esp32/components/avm_sys/include/esp32_sys.h +++ b/src/platforms/esp32/components/avm_sys/include/esp32_sys.h @@ -89,7 +89,7 @@ struct ESP32PlatformData extern QueueSetHandle_t event_set; extern QueueHandle_t event_queue; -void esp32_sys_queue_init(); +void esp32_sys_queue_init(void); void socket_init(Context *ctx, term opts); diff --git a/src/platforms/esp32/components/avm_sys/sys.c b/src/platforms/esp32/components/avm_sys/sys.c index 10909d9750..b3cb55a718 100644 --- a/src/platforms/esp32/components/avm_sys/sys.c +++ b/src/platforms/esp32/components/avm_sys/sys.c @@ -113,8 +113,12 @@ static const char *const revision_atom = "\x8" "revision"; QueueHandle_t event_queue = NULL; QueueSetHandle_t event_set = NULL; -void esp32_sys_queue_init() +void esp32_sys_queue_init(void) { + if (event_set != NULL) { + return; + } + event_set = xQueueCreateSet(EVENT_QUEUE_LEN * 4); event_queue = xQueueCreate(EVENT_QUEUE_LEN, sizeof(void *)); xQueueAddToSet(event_queue, event_set); diff --git a/src/platforms/esp32/test/main/test_main.c b/src/platforms/esp32/test/main/test_main.c index 1fc46f33f0..ca4f4acb4b 100644 --- a/src/platforms/esp32/test/main/test_main.c +++ b/src/platforms/esp32/test/main/test_main.c @@ -132,10 +132,28 @@ static void eth_stop(esp_netif_t *eth_netif) } #endif -term avm_test_case(const char *test_module) +static void prepare_event_queue(void) { esp32_sys_queue_init(); + QueueSetMemberHandle_t source; + while ((source = xQueueSelectFromSet(event_set, 0)) != NULL) { + if (UNLIKELY(source != event_queue)) { + fprintf(stderr, "Stale member in ESP32 event queue set.\n"); + AVM_ABORT(); + } + + void *ignored; + if (UNLIKELY(xQueueReceive(event_queue, &ignored, 0) != pdTRUE)) { + AVM_ABORT(); + } + } +} + +term avm_test_case(const char *test_module) +{ + prepare_event_queue(); + GlobalContext *glb = globalcontext_new(); TEST_ASSERT(glb != NULL); @@ -183,7 +201,7 @@ term avm_test_case(const char *test_module) #ifndef AVM_NO_JIT TEST_CASE("test_jit_compile", "[test_run]") { - esp32_sys_queue_init(); + prepare_event_queue(); GlobalContext *glb = globalcontext_new(); TEST_ASSERT(glb != NULL); diff --git a/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2 b/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2 new file mode 100644 index 0000000000..37268b9af7 --- /dev/null +++ b/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2 @@ -0,0 +1 @@ +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=6 diff --git a/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2.license b/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2.license new file mode 100644 index 0000000000..b805ab2cac --- /dev/null +++ b/src/platforms/esp32/test/sdkconfig.ci.wokwi.esp32s2.license @@ -0,0 +1,2 @@ +SPDX-License-Identifier: Apache-2.0 +SPDX-FileCopyrightText: AtomVM Contributors