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 06a10202af usrsock_server: fix issues with usrsock_rpmsg_sendto_handler
06a10202af is described below

commit 06a10202af23181ce0629c5067d822a1d949d109
Author: zhanghongyu <[email protected]>
AuthorDate: Thu May 11 21:25:02 2023 +0800

    usrsock_server: fix issues with usrsock_rpmsg_sendto_handler
    
    If the current poll setup only has POLLIN, adding POLLOUT does not cause the
    protocol stack to refocus on flags such as TCP_ACK or UDP_POLL, the user is
    not notified when flags for POLLOUT relationships appear and vice versa,
    so we have to call poll_setup again.
    
    Signed-off-by: zhanghongyu <[email protected]>
---
 drivers/usrsock/usrsock_rpmsg_server.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/drivers/usrsock/usrsock_rpmsg_server.c 
b/drivers/usrsock/usrsock_rpmsg_server.c
index fd6b6baa6e..26a49d6c92 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -496,7 +496,8 @@ out:
   retr = usrsock_rpmsg_send_ack(ept, events, req->head.xid, ret);
   if (retr >= 0 && events == 0)
     {
-      usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid], POLLOUT);
+      usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid],
+                               priv->pfds[req->usockid].events | POLLOUT);
     }
 
   if (priv->iov[0].iov_base)
@@ -640,7 +641,8 @@ static int usrsock_rpmsg_recvfrom_handler(FAR struct 
rpmsg_endpoint *ept,
 
   if (retr >= 0 && events == 0)
     {
-      usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid], POLLIN);
+      usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid],
+                               priv->pfds[req->usockid].events | POLLIN);
     }
 
   return retr;
@@ -1054,15 +1056,20 @@ static void usrsock_rpmsg_poll_setup(FAR struct pollfd 
*pfds,
 
   if (events)
     {
-      if (!pfds->events)
+      if (pfds->events)
         {
-          pfds->revents = 0;
-          pfds->events = events;
-          ret = psock_poll(psock, pfds, true);
+          ret = psock_poll(psock, pfds, false);
         }
-      else
+
+      if (ret >= 0)
         {
+          /* The protocol stack monitor flag is different when the events is
+           * POLLIN or POLLOUT, so we have to call poll_setup again.
+           */
+
+          pfds->revents = 0;
           pfds->events = events;
+          ret = psock_poll(psock, pfds, true);
         }
     }
   else
@@ -1127,13 +1134,9 @@ static void usrsock_rpmsg_poll_cb(FAR struct pollfd 
*pfds)
         }
     }
 
-  if (!(pfds->events & (POLLIN | POLLOUT)))
-    {
-      usrsock_rpmsg_poll_setup(pfds, 0);
-    }
-
   if (events != 0)
     {
+      usrsock_rpmsg_poll_setup(pfds, pfds->events);
       usrsock_rpmsg_send_event(priv->epts[pfds->fd], pfds->fd, events);
     }
 

Reply via email to