forked from espressif/esp-idf
vfs: add default initializer for vfs_eventfd
This commit is contained in:
@@ -26,9 +26,13 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t eventfd_max_num;
|
size_t max_fds;
|
||||||
} esp_vfs_eventfd_config_t;
|
} esp_vfs_eventfd_config_t;
|
||||||
|
|
||||||
|
#define ESP_VFS_EVENTD_CONFIG_DEFAULT() (esp_vfs_eventfd_config_t) { \
|
||||||
|
.max_fds = 5, \
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Registers the event vfs.
|
* @brief Registers the event vfs.
|
||||||
*
|
*
|
||||||
|
@@ -24,9 +24,7 @@
|
|||||||
|
|
||||||
TEST_CASE("eventfd create and close", "[vfs][eventfd]")
|
TEST_CASE("eventfd create and close", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
TEST_ASSERT_GREATER_OR_EQUAL(0, fd);
|
TEST_ASSERT_GREATER_OR_EQUAL(0, fd);
|
||||||
@@ -40,9 +38,7 @@ TEST_CASE("eventfd create and close", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd reject unknown flags", "[vfs][eventfd]")
|
TEST_CASE("eventfd reject unknown flags", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 1);
|
int fd = eventfd(0, 1);
|
||||||
@@ -57,9 +53,7 @@ TEST_CASE("eventfd reject unknown flags", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd read", "[vfs][eventfd]")
|
TEST_CASE("eventfd read", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
unsigned int initval = 123;
|
unsigned int initval = 123;
|
||||||
@@ -77,9 +71,7 @@ TEST_CASE("eventfd read", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd read invalid size", "[vfs][eventfd]")
|
TEST_CASE("eventfd read invalid size", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -94,9 +86,7 @@ TEST_CASE("eventfd read invalid size", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd write invalid size", "[vfs][eventfd]")
|
TEST_CASE("eventfd write invalid size", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -111,9 +101,7 @@ TEST_CASE("eventfd write invalid size", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd write then read", "[vfs][eventfd]")
|
TEST_CASE("eventfd write then read", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -135,9 +123,7 @@ TEST_CASE("eventfd write then read", "[vfs][eventfd]")
|
|||||||
|
|
||||||
TEST_CASE("eventfd instant select", "[vfs][eventfd]")
|
TEST_CASE("eventfd instant select", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -153,7 +139,6 @@ TEST_CASE("eventfd instant select", "[vfs][eventfd]")
|
|||||||
FD_ZERO(&write_fds);
|
FD_ZERO(&write_fds);
|
||||||
FD_ZERO(&error_fds);
|
FD_ZERO(&error_fds);
|
||||||
FD_SET(fd, &read_fds);
|
FD_SET(fd, &read_fds);
|
||||||
printf("fd %d\n", fd);
|
|
||||||
int ret = select(fd + 1, &read_fds, &write_fds, &error_fds, &zero_time);
|
int ret = select(fd + 1, &read_fds, &write_fds, &error_fds, &zero_time);
|
||||||
TEST_ASSERT_EQUAL(0, ret);
|
TEST_ASSERT_EQUAL(0, ret);
|
||||||
TEST_ASSERT(!FD_ISSET(fd, &read_fds));
|
TEST_ASSERT(!FD_ISSET(fd, &read_fds));
|
||||||
@@ -191,9 +176,7 @@ static void signal_task(void *arg)
|
|||||||
|
|
||||||
TEST_CASE("eventfd signal from task", "[vfs][eventfd]")
|
TEST_CASE("eventfd signal from task", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd0 = eventfd(0, 0);
|
int fd0 = eventfd(0, 0);
|
||||||
@@ -215,7 +198,6 @@ TEST_CASE("eventfd signal from task", "[vfs][eventfd]")
|
|||||||
zero_time.tv_usec = 0;
|
zero_time.tv_usec = 0;
|
||||||
|
|
||||||
int ret = select(max_fd + 1, &read_fds, NULL, NULL, &wait_time);
|
int ret = select(max_fd + 1, &read_fds, NULL, NULL, &wait_time);
|
||||||
printf("Frist select returned\n");
|
|
||||||
TEST_ASSERT_EQUAL(1, ret);
|
TEST_ASSERT_EQUAL(1, ret);
|
||||||
TEST_ASSERT(FD_ISSET(fd0, &read_fds));
|
TEST_ASSERT(FD_ISSET(fd0, &read_fds));
|
||||||
|
|
||||||
@@ -246,9 +228,7 @@ static void IRAM_ATTR eventfd_select_test_isr(void *arg)
|
|||||||
|
|
||||||
TEST_CASE("eventfd signal from ISR", "[vfs][eventfd]")
|
TEST_CASE("eventfd signal from ISR", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, EFD_SUPPORT_ISR);
|
int fd = eventfd(0, EFD_SUPPORT_ISR);
|
||||||
@@ -299,9 +279,7 @@ static void close_task(void *arg)
|
|||||||
|
|
||||||
TEST_CASE("eventfd select closed fd", "[vfs][eventfd]")
|
TEST_CASE("eventfd select closed fd", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -350,9 +328,7 @@ static void select_task(void *arg)
|
|||||||
|
|
||||||
TEST_CASE("eventfd multiple selects", "[vfs][eventfd]")
|
TEST_CASE("eventfd multiple selects", "[vfs][eventfd]")
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 5,
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
TEST_ESP_OK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
int fd = eventfd(0, 0);
|
int fd = eventfd(0, 0);
|
||||||
@@ -380,4 +356,3 @@ TEST_CASE("eventfd multiple selects", "[vfs][eventfd]")
|
|||||||
TEST_ASSERT_EQUAL(0, close(fd));
|
TEST_ASSERT_EQUAL(0, close(fd));
|
||||||
TEST_ESP_OK(esp_vfs_eventfd_unregister());
|
TEST_ESP_OK(esp_vfs_eventfd_unregister());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ typedef struct event_select_args_t {
|
|||||||
esp_vfs_select_sem_t signal_sem;
|
esp_vfs_select_sem_t signal_sem;
|
||||||
struct event_select_args_t *prev_in_fd;
|
struct event_select_args_t *prev_in_fd;
|
||||||
struct event_select_args_t *next_in_fd;
|
struct event_select_args_t *next_in_fd;
|
||||||
struct event_select_args_t *next_in_args;
|
struct event_select_args_t *next_in_args; // a linked list for all pending select args for one select call
|
||||||
} event_select_args_t;
|
} event_select_args_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -49,7 +49,7 @@ typedef struct {
|
|||||||
bool support_isr;
|
bool support_isr;
|
||||||
volatile bool is_set;
|
volatile bool is_set;
|
||||||
volatile uint64_t value;
|
volatile uint64_t value;
|
||||||
event_select_args_t *select_args;
|
event_select_args_t *select_args; // a double-linked list for all pending select args with this fd
|
||||||
_lock_t lock;
|
_lock_t lock;
|
||||||
spinlock_t data_spin_lock; // only for event fds that support ISR.
|
spinlock_t data_spin_lock; // only for event fds that support ISR.
|
||||||
} event_context_t;
|
} event_context_t;
|
||||||
@@ -336,14 +336,14 @@ static int event_close(int fd)
|
|||||||
|
|
||||||
esp_err_t esp_vfs_eventfd_register(const esp_vfs_eventfd_config_t *config)
|
esp_err_t esp_vfs_eventfd_register(const esp_vfs_eventfd_config_t *config)
|
||||||
{
|
{
|
||||||
if (config == NULL || config->eventfd_max_num >= MAX_FDS) {
|
if (config == NULL || config->max_fds >= MAX_FDS) {
|
||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
if (s_eventfd_vfs_id != -1) {
|
if (s_eventfd_vfs_id != -1) {
|
||||||
return ESP_ERR_INVALID_STATE;
|
return ESP_ERR_INVALID_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_event_size = config->eventfd_max_num;
|
s_event_size = config->max_fds;
|
||||||
s_events = (event_context_t *)calloc(s_event_size, sizeof(event_context_t));
|
s_events = (event_context_t *)calloc(s_event_size, sizeof(event_context_t));
|
||||||
for (size_t i = 0; i < s_event_size; i++) {
|
for (size_t i = 0; i < s_event_size; i++) {
|
||||||
_lock_init_recursive(&s_events[i].lock);
|
_lock_init_recursive(&s_events[i].lock);
|
||||||
@@ -362,12 +362,6 @@ esp_err_t esp_vfs_eventfd_register(const esp_vfs_eventfd_config_t *config)
|
|||||||
.access = NULL,
|
.access = NULL,
|
||||||
.start_select = &event_start_select,
|
.start_select = &event_start_select,
|
||||||
.end_select = &event_end_select,
|
.end_select = &event_end_select,
|
||||||
#ifdef CONFIG_SUPPORT_TERMIOS
|
|
||||||
.tcsetattr = NULL,
|
|
||||||
.tcgetattr = NULL,
|
|
||||||
.tcdrain = NULL,
|
|
||||||
.tcflush = NULL,
|
|
||||||
#endif // CONFIG_SUPPORT_TERMIOS
|
|
||||||
};
|
};
|
||||||
return esp_vfs_register_with_id(&vfs, NULL, &s_eventfd_vfs_id);
|
return esp_vfs_register_with_id(&vfs, NULL, &s_eventfd_vfs_id);
|
||||||
}
|
}
|
||||||
|
@@ -90,9 +90,7 @@ static void worker_task(void *arg)
|
|||||||
|
|
||||||
static void collector_task(void *arg)
|
static void collector_task(void *arg)
|
||||||
{
|
{
|
||||||
esp_vfs_eventfd_config_t config = {
|
esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT();
|
||||||
.eventfd_max_num = 2,
|
|
||||||
};
|
|
||||||
ESP_ERROR_CHECK(esp_vfs_eventfd_register(&config));
|
ESP_ERROR_CHECK(esp_vfs_eventfd_register(&config));
|
||||||
|
|
||||||
s_timer_fd = eventfd(0, EFD_SUPPORT_ISR);
|
s_timer_fd = eventfd(0, EFD_SUPPORT_ISR);
|
||||||
|
Reference in New Issue
Block a user