You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/05/04 13:20:10 UTC

[incubator-nuttx] 01/05: fs/vfs: Add nx_poll function

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

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

commit 1da8cd6b89e78cf332d18f0fd4c27c88f61a32f4
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon May 4 01:51:42 2020 +0800

    fs/vfs: Add nx_poll function
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 fs/vfs/fs_poll.c      | 99 +++++++++++++++++++++++++++++++--------------------
 include/nuttx/fs/fs.h | 17 +++++++++
 2 files changed, 77 insertions(+), 39 deletions(-)

diff --git a/fs/vfs/fs_poll.c b/fs/vfs/fs_poll.c
index 737d9d3..c90c931 100644
--- a/fs/vfs/fs_poll.c
+++ b/fs/vfs/fs_poll.c
@@ -88,13 +88,12 @@ static int poll_fdsetup(int fd, FAR struct pollfd *fds, bool setup)
 {
   /* Check for a valid file descriptor */
 
-  if ((unsigned int)fd >= CONFIG_NFILE_DESCRIPTORS)
+  if (fd >= CONFIG_NFILE_DESCRIPTORS)
     {
       /* Perform the socket ioctl */
 
 #ifdef CONFIG_NET
-      if ((unsigned int)fd < (CONFIG_NFILE_DESCRIPTORS +
-                              CONFIG_NSOCKET_DESCRIPTORS))
+      if (fd < (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS))
         {
           return net_poll(fd, fds, setup);
         }
@@ -360,7 +359,7 @@ int file_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup)
 }
 
 /****************************************************************************
- * Name: fdesc_poll
+ * Name: fs_poll
  *
  * Description:
  *   The standard poll() operation redirects operations on file descriptors
@@ -399,49 +398,29 @@ int fs_poll(int fd, FAR struct pollfd *fds, bool setup)
 }
 
 /****************************************************************************
- * Name: poll
+ * Name: nx_poll
  *
  * Description:
- *   poll() waits for one of a set of file descriptors to become ready to
- *   perform I/O.  If none of the events requested (and no error) has
- *   occurred for any of  the  file  descriptors,  then  poll() blocks until
- *   one of the events occurs.
+ *   nx_poll() is similar to the standard 'poll' interface except that is
+ *   not a cancellation point and it does not modify the errno variable.
  *
- * Input Parameters:
- *   fds  - List of structures describing file descriptors to be monitored
- *   nfds - The number of entries in the list
- *   timeout - Specifies an upper limit on the time for which poll() will
- *     block in milliseconds.  A negative value of timeout means an infinite
- *     timeout.
+ *   nx_poll() is an internal NuttX interface and should not be called from
+ *   applications.
  *
  * Returned Value:
- *   On success, the number of structures that have non-zero revents fields.
- *   A value of 0 indicates that the call timed out and no file descriptors
- *   were ready.  On error, -1 is returned, and errno is set appropriately:
- *
- *   EBADF  - An invalid file descriptor was given in one of the sets.
- *   EFAULT - The fds address is invalid
- *   EINTR  - A signal occurred before any requested event.
- *   EINVAL - The nfds value exceeds a system limit.
- *   ENOMEM - There was no space to allocate internal data structures.
- *   ENOSYS - One or more of the drivers supporting the file descriptor
- *     does not support the poll method.
+ *   Zero is returned on success; a negated value is returned on any failure.
  *
  ****************************************************************************/
 
-int poll(FAR struct pollfd *fds, nfds_t nfds, int timeout)
+int nx_poll(FAR struct pollfd *fds, unsigned int nfds, int timeout)
 {
   sem_t sem;
   int count = 0;
-  int errcode;
+  int ret2;
   int ret;
 
   DEBUGASSERT(nfds == 0 || fds != NULL);
 
-  /* poll() is a cancellation point */
-
-  enter_cancellation_point();
-
   /* This semaphore is used for signaling and, hence, should not have
    * priority inheritance enabled.
    */
@@ -515,23 +494,65 @@ int poll(FAR struct pollfd *fds, nfds_t nfds, int timeout)
        * Preserve ret, if negative, since it holds the result of the wait.
        */
 
-      errcode = poll_teardown(fds, nfds, &count, ret);
-      if (errcode < 0 && ret >= 0)
+      ret2 = poll_teardown(fds, nfds, &count, ret);
+      if (ret2 < 0 && ret >= 0)
         {
-          ret = errcode;
+          ret = ret2;
         }
     }
 
   nxsem_destroy(&sem);
-  leave_cancellation_point();
+  return ret < 0 ? ret : count;
+}
+
+/****************************************************************************
+ * Name: poll
+ *
+ * Description:
+ *   poll() waits for one of a set of file descriptors to become ready to
+ *   perform I/O.  If none of the events requested (and no error) has
+ *   occurred for any of  the  file  descriptors,  then  poll() blocks until
+ *   one of the events occurs.
+ *
+ * Input Parameters:
+ *   fds  - List of structures describing file descriptors to be monitored
+ *   nfds - The number of entries in the list
+ *   timeout - Specifies an upper limit on the time for which poll() will
+ *     block in milliseconds.  A negative value of timeout means an infinite
+ *     timeout.
+ *
+ * Returned Value:
+ *   On success, the number of structures that have non-zero revents fields.
+ *   A value of 0 indicates that the call timed out and no file descriptors
+ *   were ready.  On error, -1 is returned, and errno is set appropriately:
+ *
+ *   EBADF  - An invalid file descriptor was given in one of the sets.
+ *   EFAULT - The fds address is invalid
+ *   EINTR  - A signal occurred before any requested event.
+ *   EINVAL - The nfds value exceeds a system limit.
+ *   ENOMEM - There was no space to allocate internal data structures.
+ *   ENOSYS - One or more of the drivers supporting the file descriptor
+ *     does not support the poll method.
+ *
+ ****************************************************************************/
 
-  /* Check for errors */
+int poll(FAR struct pollfd *fds, nfds_t nfds, int timeout)
+{
+  int ret;
+
+  /* poll() is a cancellation point */
+
+  enter_cancellation_point();
+
+  /* Let nx_poll() do all of the work */
 
+  ret = nx_poll(fds, nfds, timeout);
   if (ret < 0)
     {
       set_errno(-ret);
-      return ERROR;
+      ret = ERROR;
     }
 
-  return count;
+  leave_cancellation_point();
+  return ret;
 }
diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h
index 4221d85..8343c36 100644
--- a/include/nuttx/fs/fs.h
+++ b/include/nuttx/fs/fs.h
@@ -1376,6 +1376,23 @@ int file_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup);
 int fs_poll(int fd, FAR struct pollfd *fds, bool setup);
 
 /****************************************************************************
+ * Name: nx_poll
+ *
+ * Description:
+ *   nx_poll() is similar to the standard 'poll' interface except that is
+ *   not a cancellation point and it does not modify the errno variable.
+ *
+ *   nx_poll() is an internal NuttX interface and should not be called from
+ *   applications.
+ *
+ * Returned Value:
+ *   Zero is returned on success; a negated value is returned on any failure.
+ *
+ ****************************************************************************/
+
+int nx_poll(FAR struct pollfd *fds, unsigned int nfds, int timeout);
+
+/****************************************************************************
  * Name: file_fstat
  *
  * Description: