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/01/17 18:11:26 UTC
[nuttx] 04/04: rpmsg_socket: destroy_ept only at close
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
commit 1b333bfad5f282c8eeceeee44555284f7056ed6b
Author: ligd <li...@xiaomi.com>
AuthorDate: Tue Jan 10 17:19:01 2023 +0800
rpmsg_socket: destroy_ept only at close
Signed-off-by: ligd <li...@xiaomi.com>
---
net/rpmsg/rpmsg_sockif.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c
index e674795bc8..3852be3d2b 100644
--- a/net/rpmsg/rpmsg_sockif.c
+++ b/net/rpmsg/rpmsg_sockif.c
@@ -85,6 +85,7 @@ struct rpmsg_socket_conn_s
struct socket_conn_s sconn;
+ bool unbind;
struct rpmsg_endpoint ept;
struct sockaddr_rpmsg rpaddr;
@@ -247,7 +248,7 @@ static int rpmsg_socket_wakeup(FAR struct rpmsg_socket_conn_s *conn)
uint32_t space;
int ret = 0;
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
return ret;
}
@@ -410,7 +411,21 @@ static void rpmsg_socket_ns_bound(struct rpmsg_endpoint *ept)
static void rpmsg_socket_ns_unbind(FAR struct rpmsg_endpoint *ept)
{
- rpmsg_socket_destroy_ept(ept->priv);
+ FAR struct rpmsg_socket_conn_s *conn = ept->priv;
+
+ if (!conn)
+ {
+ return;
+ }
+
+ nxmutex_lock(&conn->recvlock);
+
+ conn->unbind = true;
+ rpmsg_socket_post(&conn->sendsem);
+ rpmsg_socket_post(&conn->recvsem);
+ rpmsg_socket_poll_notify(conn, POLLIN | POLLOUT);
+
+ nxmutex_unlock(&conn->recvlock);
}
static void rpmsg_socket_device_created(FAR struct rpmsg_device *rdev,
@@ -856,7 +871,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock,
}
else if (_SS_ISCONNECTED(conn->sconn.s_flags))
{
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
eventset |= POLLHUP;
}
@@ -956,7 +971,7 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
{
ret = net_sem_timedwait(&conn->sendsem,
_SO_TIMEOUT(conn->sconn.s_sndtimeo));
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
ret = -ECONNRESET;
}
@@ -1008,7 +1023,6 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
conn->lastpos = conn->recvpos;
conn->sendpos += msg->len;
-
ret = rpmsg_sendto_nocopy(&conn->ept, msg, block + sizeof(*msg),
conn->ept.dest_addr);
nxmutex_unlock(&conn->sendlock);
@@ -1056,7 +1070,7 @@ static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
{
ret = net_sem_timedwait(&conn->sendsem,
_SO_TIMEOUT(conn->sconn.s_sndtimeo));
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
ret = -ECONNRESET;
}
@@ -1111,7 +1125,6 @@ static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
conn->lastpos = conn->recvpos;
conn->sendpos += len + sizeof(uint32_t);
-
ret = rpmsg_sendto_nocopy(&conn->ept, msg, total, conn->ept.dest_addr);
nxmutex_unlock(&conn->sendlock);
if (ret < 0)
@@ -1147,7 +1160,7 @@ static ssize_t rpmsg_socket_sendmsg(FAR struct socket *psock,
}
}
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
/* return ECONNRESET if lower IPC closed */
@@ -1221,7 +1234,7 @@ static ssize_t rpmsg_socket_recvmsg(FAR struct socket *psock,
goto out;
}
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
/* return EOF if lower IPC closed */
@@ -1242,7 +1255,7 @@ static ssize_t rpmsg_socket_recvmsg(FAR struct socket *psock,
ret = net_sem_timedwait(&conn->recvsem,
_SO_TIMEOUT(conn->sconn.s_rcvtimeo));
- if (!conn->ept.rdev)
+ if (!conn->ept.rdev || conn->unbind)
{
ret = -ECONNRESET;
}