You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/06/13 07:33:12 UTC
[nuttx] branch master updated: usrsock_rpmsg_server: fix poll recursive when revent POLLHUP or POLLERR
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
The following commit(s) were added to refs/heads/master by this push:
new aa43f6ff1a usrsock_rpmsg_server: fix poll recursive when revent POLLHUP or POLLERR
aa43f6ff1a is described below
commit aa43f6ff1a8d4cc50f46a7c943967632aea07ced
Author: zhanghongyu <zh...@xiaomi.com>
AuthorDate: Wed May 17 00:48:01 2023 +0800
usrsock_rpmsg_server: fix poll recursive when revent POLLHUP or POLLERR
the previous patch can not handle the revent is POLLHUP or POLLERR,
poll_setup needs to be executed only when the POLLIN or POLLOUT event
changes.
Signed-off-by: zhanghongyu <zh...@xiaomi.com>
---
drivers/usrsock/usrsock_rpmsg_server.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/usrsock/usrsock_rpmsg_server.c b/drivers/usrsock/usrsock_rpmsg_server.c
index 821479bba1..1ef562b580 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -1096,6 +1096,7 @@ static void usrsock_rpmsg_poll_setup(FAR struct pollfd *pfds,
static void usrsock_rpmsg_poll_cb(FAR struct pollfd *pfds)
{
FAR struct usrsock_rpmsg_s *priv = (FAR struct usrsock_rpmsg_s *)pfds->arg;
+ int oldevents;
int events = 0;
nxrmutex_lock(&priv->mutex);
@@ -1106,6 +1107,7 @@ static void usrsock_rpmsg_poll_cb(FAR struct pollfd *pfds)
return;
}
+ oldevents = pfds->events;
if (pfds->revents & POLLIN)
{
events |= USRSOCK_EVENT_RECVFROM_AVAIL;
@@ -1138,9 +1140,13 @@ static void usrsock_rpmsg_poll_cb(FAR struct pollfd *pfds)
}
}
- if (events != 0)
+ if (oldevents != pfds->events)
{
usrsock_rpmsg_poll_setup(pfds, pfds->events);
+ }
+
+ if (events != 0)
+ {
usrsock_rpmsg_send_event(priv->epts[pfds->fd], pfds->fd, events);
}