From 21c7d7a9d2ab9b1bd8ed8a1c78aade6e73b9a9d6 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Fri, 8 Mar 2024 12:27:10 +0800 Subject: [PATCH] fix(vfs): fix eventfd select --- .../vfs/test_apps/main/test_vfs_eventfd.c | 47 ++++++++++++++++++- components/vfs/vfs_eventfd.c | 2 +- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/components/vfs/test_apps/main/test_vfs_eventfd.c b/components/vfs/test_apps/main/test_vfs_eventfd.c index 906bdecd1c..11ea46997d 100644 --- a/components/vfs/test_apps/main/test_vfs_eventfd.c +++ b/components/vfs/test_apps/main/test_vfs_eventfd.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -349,3 +349,48 @@ TEST_CASE("eventfd multiple selects", "[vfs][eventfd]") TEST_ASSERT_EQUAL(0, close(fd)); TEST_ESP_OK(esp_vfs_eventfd_unregister()); } + +typedef struct { + int *value; + int fd; +} select_block_task_args_t; + +static void select_block_task(void *arg) +{ + int fd = ((select_block_task_args_t *)arg)->fd; + fd_set read_fds; + + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + + select(fd + 1, &read_fds, NULL, NULL, NULL); + *(((select_block_task_args_t *)arg)->value) = 1; + vTaskDelete(NULL); +} + +TEST_CASE("eventfd select block", "[vfs][eventfd]") +{ + esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT(); + TEST_ESP_OK(esp_vfs_eventfd_register(&config)); + + select_block_task_args_t args; + args.fd = eventfd(0, 0); + TEST_ASSERT_GREATER_OR_EQUAL(0, args.fd); + int a = 0; + args.value = &a; + + int fd_write = eventfd(0, 0); + TEST_ASSERT_GREATER_OR_EQUAL(0, fd_write); + + xTaskCreate(select_block_task, "select_block_task", 2048, &args, 5, NULL); + vTaskDelay(pdMS_TO_TICKS(2000)); + + uint64_t val = 1; + TEST_ASSERT_EQUAL(sizeof(val), write(fd_write, &val, sizeof(val))); + vTaskDelay(pdMS_TO_TICKS(2000)); + + TEST_ASSERT_EQUAL(0, *(args.value)); + TEST_ASSERT_EQUAL(0, close(args.fd)); + TEST_ASSERT_EQUAL(0, close(fd_write)); + TEST_ESP_OK(esp_vfs_eventfd_unregister()); +} diff --git a/components/vfs/vfs_eventfd.c b/components/vfs/vfs_eventfd.c index 11ff2fb7e7..a9a979cf9c 100644 --- a/components/vfs/vfs_eventfd.c +++ b/components/vfs/vfs_eventfd.c @@ -106,7 +106,7 @@ static esp_err_t event_start_select(int nfds, for (int i = 0; i < nfds; i++) { _lock_acquire_recursive(&s_events[i].lock); - if (s_events[i].fd == i) { + if (s_events[i].fd == i && (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds))) { if (s_events[i].support_isr) { portENTER_CRITICAL(&s_events[i].data_spin_lock); }