This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 23e5e1b86ec mtd/nvs: Save events if not waited 23e5e1b86ec is described below commit 23e5e1b86ecc17d38f96fcee4dcdc867a267c7da Author: wangjianyu3 <wangjian...@xiaomi.com> AuthorDate: Tue Sep 9 17:16:44 2025 +0800 mtd/nvs: Save events if not waited This patch will report events in the following scenarios: 1. Events that have changed but not been waited for before being added to the interest list. 2. Events that occur after `epoll_wait()` returns and before it is called again. Signed-off-by: wangjianyu3 <wangjian...@xiaomi.com> --- drivers/mtd/mtd_config_fs.c | 50 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/mtd_config_fs.c b/drivers/mtd/mtd_config_fs.c index cd869519b8a..0b895206489 100644 --- a/drivers/mtd/mtd_config_fs.c +++ b/drivers/mtd/mtd_config_fs.c @@ -100,6 +100,7 @@ struct nvs_fs uint32_t step_addr; /* For traverse */ mutex_t nvs_lock; FAR struct pollfd *fds; + pollevent_t events; }; /* Allocation Table Entry */ @@ -1095,6 +1096,8 @@ static int nvs_startup(FAR struct nvs_fs *fs) fs->ate_wra = 0; fs->data_wra = 0; + fs->events = 0; + fs->fds = NULL; /* Get the device geometry. (Casting to uintptr_t first eliminates * complaints on some architectures where the sizeof long is different @@ -1989,6 +1992,43 @@ static int nvs_next(FAR struct nvs_fs *fs, return OK; } +/**************************************************************************** + * Name: mtdconfig_notify + * + * Description: + * Notify the poll if any waiter, or save events for next setup. + * + * Input Parameters: + * fs - Pointer to file system. + * eventset - List of events to check for activity + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void mtdconfig_notify(FAR struct nvs_fs *fs, pollevent_t eventset) +{ + /* Handle events in two possible ways: + * 1. Notify waters directly if any exist(`fs->fds` is not NULL) + * 2. Save events for the following scenarios: + * a. Events that have changed but weren't waited for + * before being added to the interest list + * b. Events occurring after `epoll_wait()` returns and + * before it's called again + */ + + if (fs->fds) + { + poll_notify(&fs->fds, 1, eventset | fs->events); + fs->events = 0; + } + else + { + fs->events |= eventset; + } +} + /**************************************************************************** * Name: mtdconfig_open ****************************************************************************/ @@ -2049,9 +2089,9 @@ static int mtdconfig_ioctl(FAR struct file *filep, int cmd, /* Write a nvs item. */ ret = nvs_write(fs, pdata); - if (ret >= 0 && fs->fds) + if (ret >= 0) { - poll_notify(&fs->fds, 1, POLLPRI); + mtdconfig_notify(fs, POLLPRI); } break; @@ -2061,9 +2101,9 @@ static int mtdconfig_ioctl(FAR struct file *filep, int cmd, /* Delete a nvs item. */ ret = nvs_delete(fs, pdata); - if (ret >= 0 && fs->fds) + if (ret >= 0) { - poll_notify(&fs->fds, 1, POLLPRI); + mtdconfig_notify(fs, POLLPRI); } break; @@ -2119,7 +2159,7 @@ static int mtdconfig_poll(FAR struct file *filep, FAR struct pollfd *fds, if (setup) { fs->fds = fds; - poll_notify(&fds, 1, POLLIN | POLLOUT); + mtdconfig_notify(fs, POLLIN | POLLOUT); } else {