This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 77a04780955d7087b2e5afe6cb868b8097f00088
Author: dongjiuzhu1 <dongjiuz...@xiaomi.com>
AuthorDate: Tue Mar 25 11:36:02 2025 +0800

    fs/epoll: using filep with reference counting instead of file descriptors
    
    Signed-off-by: dongjiuzhu1 <dongjiuz...@xiaomi.com>
---
 fs/vfs/fs_epoll.c | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/fs/vfs/fs_epoll.c b/fs/vfs/fs_epoll.c
index dc78f935d2..f61cf9f631 100644
--- a/fs/vfs/fs_epoll.c
+++ b/fs/vfs/fs_epoll.c
@@ -56,6 +56,7 @@ struct epoll_node_s
   epoll_data_t             data;
   bool                     notified;
   struct pollfd            pfd;
+  FAR struct file         *filep;
   FAR struct epoll_head_s *eph;
 };
 
@@ -198,7 +199,8 @@ static int epoll_do_close(FAR struct file *filep)
       nxmutex_destroy(&eph->lock);
       list_for_every_entry(&eph->setup, epn, epoll_node_t, node)
         {
-          poll_fdsetup(epn->pfd.fd, &epn->pfd, false);
+          file_poll(epn->filep, &epn->pfd, false);
+          fs_putfilep(epn->filep);
         }
 
       list_for_every_entry_safe(&eph->extend, epn, tmp, epoll_node_t, node)
@@ -302,11 +304,11 @@ static int epoll_setup(FAR epoll_head_t *eph)
 
       epn->notified    = false;
       epn->pfd.revents = 0;
-      ret = poll_fdsetup(epn->pfd.fd, &epn->pfd, true);
+      ret = file_poll(epn->filep, &epn->pfd, true);
       if (ret < 0)
         {
-          ferr("epoll setup failed, fd=%d, events=%08" PRIx32 ", ret=%d\n",
-               epn->pfd.fd, epn->pfd.events, ret);
+          ferr("epoll setup failed, filep=%p, events=%08" PRIx32 ", "
+               "ret=%d\n", epn->filep, epn->pfd.events, ret);
           break;
         }
 
@@ -356,7 +358,7 @@ static int epoll_teardown(FAR epoll_head_t *eph, FAR struct 
epoll_event *evs,
 
       /* Teradown all the notified fd */
 
-      poll_fdsetup(epn->pfd.fd, &epn->pfd, false);
+      file_poll(epn->filep, &epn->pfd, false);
       list_delete(&epn->node);
 
       if (epn->pfd.revents != 0 && i < maxevents)
@@ -488,6 +490,7 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
   eph = epoll_head_from_fd(epfd, &filep);
   if (eph == NULL)
     {
+      set_errno(EBADF);
       return ERROR;
     }
 
@@ -565,9 +568,17 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
         epn->pfd.cb      = epoll_default_cb;
         epn->pfd.revents = 0;
 
-        ret = poll_fdsetup(fd, &epn->pfd, true);
+        ret = fs_getfilep(fd, &epn->filep);
+        if (ret < 0)
+          {
+            list_add_tail(&eph->free, &epn->node);
+            goto err;
+          }
+
+        ret = file_poll(epn->filep, &epn->pfd, true);
         if (ret < 0)
           {
+            fs_putfilep(epn->filep);
             list_add_tail(&eph->free, &epn->node);
             goto err;
           }
@@ -581,7 +592,8 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
           {
             if (epn->pfd.fd == fd)
               {
-                poll_fdsetup(fd, &epn->pfd, false);
+                file_poll(epn->filep, &epn->pfd, false);
+                fs_putfilep(epn->filep);
                 list_delete(&epn->node);
                 list_add_tail(&eph->free, &epn->node);
                 goto out;
@@ -592,6 +604,7 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
           {
             if (epn->pfd.fd == fd)
               {
+                fs_putfilep(epn->filep);
                 list_delete(&epn->node);
                 list_add_tail(&eph->free, &epn->node);
                 goto out;
@@ -602,6 +615,7 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
           {
             if (epn->pfd.fd == fd)
               {
+                fs_putfilep(epn->filep);
                 list_delete(&epn->node);
                 list_add_tail(&eph->free, &epn->node);
                 goto out;
@@ -618,15 +632,14 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
               {
                 if (epn->pfd.events != (ev->events | POLLALWAYS))
                   {
-                    poll_fdsetup(fd, &epn->pfd, false);
+                    file_poll(epn->filep, &epn->pfd, false);
 
                     epn->notified    = false;
                     epn->data        = ev->data;
                     epn->pfd.events  = ev->events | POLLALWAYS;
-                    epn->pfd.fd      = fd;
                     epn->pfd.revents = 0;
 
-                    ret = poll_fdsetup(fd, &epn->pfd, true);
+                    ret = file_poll(epn->filep, &epn->pfd, true);
                     if (ret < 0)
                       {
                         goto err;
@@ -646,10 +659,9 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
                     epn->notified    = false;
                     epn->data        = ev->data;
                     epn->pfd.events  = ev->events | POLLALWAYS;
-                    epn->pfd.fd      = fd;
                     epn->pfd.revents = 0;
 
-                    ret = poll_fdsetup(fd, &epn->pfd, true);
+                    ret = file_poll(epn->filep, &epn->pfd, true);
                     if (ret < 0)
                       {
                         goto err;
@@ -670,10 +682,9 @@ int epoll_ctl(int epfd, int op, int fd, FAR struct 
epoll_event *ev)
                 epn->notified    = false;
                 epn->data        = ev->data;
                 epn->pfd.events  = ev->events | POLLALWAYS;
-                epn->pfd.fd      = fd;
                 epn->pfd.revents = 0;
 
-                ret = poll_fdsetup(fd, &epn->pfd, true);
+                ret = file_poll(epn->filep, &epn->pfd, true);
                 if (ret < 0)
                   {
                     goto err;

Reply via email to