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);
     }