mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 10:47:19 +02:00
Merge branch 'feature/move_eloop_to_pptask_v5.0' into 'release/v5.0'
wpa_supplicant: Run eloop timer in ppTask context (v5.0) See merge request espressif/esp-idf!20864
This commit is contained in:
@ -16,6 +16,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "eloop.h"
|
#include "eloop.h"
|
||||||
|
#include "esp_wifi_driver.h"
|
||||||
|
|
||||||
struct eloop_timeout {
|
struct eloop_timeout {
|
||||||
struct dl_list list;
|
struct dl_list list;
|
||||||
@ -42,12 +43,29 @@ static void *eloop_data_lock = NULL;
|
|||||||
|
|
||||||
static struct eloop_data eloop;
|
static struct eloop_data eloop;
|
||||||
|
|
||||||
|
static int eloop_run_wrapper(void *data)
|
||||||
|
{
|
||||||
|
eloop_run();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void eloop_run_timer(void)
|
||||||
|
{
|
||||||
|
/* Execute timers in pptask context to make it thread safe */
|
||||||
|
wifi_ipc_config_t cfg;
|
||||||
|
|
||||||
|
cfg.fn = eloop_run_wrapper;
|
||||||
|
cfg.arg = NULL;
|
||||||
|
cfg.arg_size = 0;
|
||||||
|
esp_wifi_ipc_internal(&cfg, false);
|
||||||
|
}
|
||||||
|
|
||||||
int eloop_init(void)
|
int eloop_init(void)
|
||||||
{
|
{
|
||||||
os_memset(&eloop, 0, sizeof(eloop));
|
os_memset(&eloop, 0, sizeof(eloop));
|
||||||
dl_list_init(&eloop.timeout);
|
dl_list_init(&eloop.timeout);
|
||||||
os_timer_disarm(&eloop.eloop_timer);
|
os_timer_disarm(&eloop.eloop_timer);
|
||||||
os_timer_setfn(&eloop.eloop_timer, (ETSTimerFunc *)eloop_run, NULL);
|
os_timer_setfn(&eloop.eloop_timer, (ETSTimerFunc *)eloop_run_timer, NULL);
|
||||||
|
|
||||||
eloop_data_lock = os_recursive_mutex_create();
|
eloop_data_lock = os_recursive_mutex_create();
|
||||||
|
|
||||||
|
@ -54,14 +54,20 @@ extern const wifi_osi_funcs_t *wifi_funcs;
|
|||||||
/* Check if eloop runs its timers correctly & in correct order */
|
/* Check if eloop runs its timers correctly & in correct order */
|
||||||
TEST_CASE("Test eloop timers run", "[eloop]")
|
TEST_CASE("Test eloop timers run", "[eloop]")
|
||||||
{
|
{
|
||||||
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
|
cfg.nvs_enable = false;
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||||
|
TEST_ESP_OK(esp_wifi_stop());
|
||||||
|
TEST_ESP_OK(esp_wifi_deinit());
|
||||||
|
/* Reset memory stats since some is leaked during the first initialization */
|
||||||
|
test_utils_record_free_mem();
|
||||||
|
|
||||||
int execution_order[6] = {1, 5, 3, 0, 2, 4};
|
int execution_order[6] = {1, 5, 3, 0, 2, 4};
|
||||||
int index[6] = {0,1,2,3,4,5};
|
int index[6] = {0,1,2,3,4,5};
|
||||||
|
t = 0;
|
||||||
|
|
||||||
wifi_funcs = WIFI_OSI_FUNCS_INITIALIZER();
|
/* We need pptask to run eloop, wifi init will do that */
|
||||||
if (!wifi_funcs) {
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||||
TEST_ASSERT(1);
|
|
||||||
}
|
|
||||||
eloop_init();
|
|
||||||
os_get_reltime(&ts);
|
os_get_reltime(&ts);
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
eloop_register_timeout(timeouts_sec[i], timeouts_usec[i],
|
eloop_register_timeout(timeouts_sec[i], timeouts_usec[i],
|
||||||
@ -70,8 +76,9 @@ TEST_CASE("Test eloop timers run", "[eloop]")
|
|||||||
|
|
||||||
/* wait for all timers to run */
|
/* wait for all timers to run */
|
||||||
os_sleep(20, 0);
|
os_sleep(20, 0);
|
||||||
t = 0;
|
|
||||||
/* check the execution order, this will also check whether they were fired at correct time */
|
/* check the execution order, this will also check whether they were fired at correct time */
|
||||||
TEST_ASSERT(memcmp(execution_order, executed_order, 6*sizeof(int)) == 0);
|
TEST_ASSERT(memcmp(execution_order, executed_order, 6*sizeof(int)) == 0);
|
||||||
eloop_destroy();
|
TEST_ESP_OK(esp_wifi_stop());
|
||||||
|
TEST_ESP_OK(esp_wifi_deinit());
|
||||||
|
os_sleep(3, 0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user