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: