poll: pollsetup should notify only one fd passd by caller

since it's redundant to iterate the whole fds array in setup

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao
2023-11-19 19:19:53 +08:00
committed by Alin Jerpelea
parent 11b3adf17f
commit eddd90de78
84 changed files with 373 additions and 396 deletions
+6 -6
View File
@@ -52,9 +52,9 @@ static int can_setup(FAR struct socket *psock);
static sockcaps_t can_sockcaps(FAR struct socket *psock);
static void can_addref(FAR struct socket *psock);
static int can_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr, socklen_t addrlen);
static int can_poll_local(FAR struct socket *psock, FAR struct pollfd *fds,
bool setup);
bool setup);
static int can_close(FAR struct socket *psock);
/****************************************************************************
@@ -394,9 +394,9 @@ static int can_poll_local(FAR struct socket *psock, FAR struct pollfd *fds,
* during callback processing.
*/
cb->flags = NETDEV_DOWN;
cb->priv = (FAR void *)info;
cb->event = can_poll_eventhandler;
cb->flags = NETDEV_DOWN;
cb->priv = info;
cb->event = can_poll_eventhandler;
if ((fds->events & POLLOUT) != 0)
{
@@ -412,7 +412,7 @@ static int can_poll_local(FAR struct socket *psock, FAR struct pollfd *fds,
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check for read data availability now */
+2 -2
View File
@@ -190,7 +190,7 @@ int icmp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
*/
cb->flags = NETDEV_DOWN;
cb->priv = (FAR void *)info;
cb->priv = info;
cb->event = icmp_poll_eventhandler;
if ((fds->events & POLLIN) != 0)
@@ -202,7 +202,7 @@ int icmp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check for read data availability now */
+5 -3
View File
@@ -50,13 +50,15 @@ static int icmp_setup(FAR struct socket *psock);
static sockcaps_t icmp_sockcaps(FAR struct socket *psock);
static void icmp_addref(FAR struct socket *psock);
static int icmp_netpoll(FAR struct socket *psock,
FAR struct pollfd *fds, bool setup);
FAR struct pollfd *fds, bool setup);
static int icmp_close(FAR struct socket *psock);
#ifdef CONFIG_NET_SOCKOPTS
static int icmp_getsockopt(FAR struct socket *psock, int level,
int option, FAR void *value, FAR socklen_t *value_len);
int option, FAR void *value,
FAR socklen_t *value_len);
static int icmp_setsockopt(FAR struct socket *psock, int level,
int option, FAR const void *value, socklen_t value_len);
int option, FAR const void *value,
socklen_t value_len);
#endif
/****************************************************************************
+2 -2
View File
@@ -189,7 +189,7 @@ int icmpv6_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
*/
cb->flags = NETDEV_DOWN;
cb->priv = (FAR void *)info;
cb->priv = info;
cb->event = icmpv6_poll_eventhandler;
if ((fds->events & POLLIN) != 0)
@@ -201,7 +201,7 @@ int icmpv6_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check for read data availability now */
+25 -17
View File
@@ -66,42 +66,50 @@ static int inet_setup(FAR struct socket *psock);
static sockcaps_t inet_sockcaps(FAR struct socket *psock);
static void inet_addref(FAR struct socket *psock);
static int inet_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int inet_getsockname(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int inet_getpeername(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int inet_listen(FAR struct socket *psock, int backlog);
static int inet_connect(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int inet_accept(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen,
FAR struct socket *newsock, int flags);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen,
FAR struct socket *newsock, int flags);
static int inet_poll(FAR struct socket *psock,
FAR struct pollfd *fds, bool setup);
FAR struct pollfd *fds, bool setup);
static ssize_t inet_send(FAR struct socket *psock, FAR const void *buf,
size_t len, int flags);
size_t len, int flags);
static ssize_t inet_sendto(FAR struct socket *psock, FAR const void *buf,
size_t len, int flags, FAR const struct sockaddr *to,
socklen_t tolen);
size_t len, int flags,
FAR const struct sockaddr *to,
socklen_t tolen);
static ssize_t inet_sendmsg(FAR struct socket *psock,
FAR struct msghdr *msg, int flags);
FAR struct msghdr *msg, int flags);
static ssize_t inet_recvmsg(FAR struct socket *psock,
FAR struct msghdr *msg, int flags);
FAR struct msghdr *msg, int flags);
static int inet_ioctl(FAR struct socket *psock,
int cmd, unsigned long arg);
int cmd, unsigned long arg);
static int inet_socketpair(FAR struct socket *psocks[2]);
static int inet_shutdown(FAR struct socket *psock, int how);
#ifdef CONFIG_NET_SOCKOPTS
static int inet_getsockopt(FAR struct socket *psock, int level,
int option, FAR void *value, FAR socklen_t *value_len);
int option, FAR void *value,
FAR socklen_t *value_len);
static int inet_setsockopt(FAR struct socket *psock, int level,
int option, FAR const void *value, socklen_t value_len);
int option, FAR const void *value,
socklen_t value_len);
#endif
#ifdef CONFIG_NET_SENDFILE
static ssize_t inet_sendfile(FAR struct socket *psock,
FAR struct file *infile, FAR off_t *offset,
size_t count);
FAR struct file *infile, FAR off_t *offset,
size_t count);
#endif
/****************************************************************************
+1 -1
View File
@@ -87,7 +87,7 @@ static int local_event_pollsetup(FAR struct local_conn_s *conn,
eventset |= POLLIN;
}
local_event_pollnotify(conn, eventset);
poll_notify(&fds, 1, eventset);
}
else
{
+14 -8
View File
@@ -51,25 +51,31 @@ static int local_setup(FAR struct socket *psock);
static sockcaps_t local_sockcaps(FAR struct socket *psock);
static void local_sockaddref(FAR struct socket *psock);
static int local_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int local_getsockname(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int local_getpeername(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int local_connect(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int local_poll(FAR struct socket *psock,
FAR struct pollfd *fds, bool setup);
FAR struct pollfd *fds, bool setup);
static int local_close(FAR struct socket *psock);
static int local_ioctl(FAR struct socket *psock,
int cmd, unsigned long arg);
int cmd, unsigned long arg);
static int local_socketpair(FAR struct socket *psocks[2]);
static int local_shutdown(FAR struct socket *psock, int how);
#ifdef CONFIG_NET_SOCKOPTS
static int local_getsockopt(FAR struct socket *psock, int level,
int option, FAR void *value, FAR socklen_t *value_len);
int option, FAR void *value,
FAR socklen_t *value_len);
static int local_setsockopt(FAR struct socket *psock, int level,
int option, FAR const void *value, socklen_t value_len);
int option, FAR const void *value,
socklen_t value_len);
#endif
/****************************************************************************
+8 -5
View File
@@ -51,15 +51,18 @@ static int netlink_setup(FAR struct socket *psock);
static sockcaps_t netlink_sockcaps(FAR struct socket *psock);
static void netlink_addref(FAR struct socket *psock);
static int netlink_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr, socklen_t addrlen);
static int netlink_getsockname(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int netlink_getpeername(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int netlink_connect(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds,
bool setup);
bool setup);
static ssize_t netlink_sendmsg(FAR struct socket *psock,
FAR struct msghdr *msg, int flags);
static ssize_t netlink_recvmsg(FAR struct socket *psock,
+18 -12
View File
@@ -141,30 +141,36 @@ static int rpmsg_socket_setup(FAR struct socket *psock);
static sockcaps_t rpmsg_socket_sockcaps(FAR struct socket *psock);
static void rpmsg_socket_addref(FAR struct socket *psock);
static int rpmsg_socket_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int rpmsg_socket_getsockname(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int rpmsg_socket_getconnname(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen);
static int rpmsg_socket_listen(FAR struct socket *psock, int backlog);
static int rpmsg_socket_connect(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen);
FAR const struct sockaddr *addr,
socklen_t addrlen);
static int rpmsg_socket_accept(FAR struct socket *psock,
FAR struct sockaddr *addr, FAR socklen_t *addrlen,
FAR struct socket *newsock, int flags);
FAR struct sockaddr *addr,
FAR socklen_t *addrlen,
FAR struct socket *newsock, int flags);
static int rpmsg_socket_poll(FAR struct socket *psock,
FAR struct pollfd *fds, bool setup);
FAR struct pollfd *fds, bool setup);
static ssize_t rpmsg_socket_sendmsg(FAR struct socket *psock,
FAR struct msghdr *msg, int flags);
FAR struct msghdr *msg, int flags);
static ssize_t rpmsg_socket_recvmsg(FAR struct socket *psock,
FAR struct msghdr *msg, int flags);
FAR struct msghdr *msg, int flags);
static int rpmsg_socket_close(FAR struct socket *psock);
static int rpmsg_socket_ioctl(FAR struct socket *psock,
int cmd, unsigned long arg);
#ifdef CONFIG_NET_SOCKOPTS
static int rpmsg_socket_getsockopt(FAR struct socket *psock,
int level, int option, FAR void *value,
FAR socklen_t *value_len);
int level, int option,
FAR void *value,
FAR socklen_t *value_len);
#endif
/****************************************************************************
@@ -943,7 +949,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock,
}
}
rpmsg_socket_poll_notify(conn, eventset);
poll_notify(&fds, 1, eventset);
}
else
{
+9 -10
View File
@@ -165,9 +165,9 @@ static uint16_t tcp_poll_eventhandler(FAR struct net_driver_s *dev,
{
/* Stop further callbacks */
info->cb->flags = 0;
info->cb->priv = NULL;
info->cb->event = NULL;
info->cb->flags = 0;
info->cb->priv = NULL;
info->cb->event = NULL;
}
}
@@ -256,17 +256,16 @@ int tcp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* callback processing.
*/
cb->flags = TCP_DISCONN_EVENTS;
cb->priv = (FAR void *)info;
cb->event = tcp_poll_eventhandler;
cb->flags = TCP_DISCONN_EVENTS;
cb->priv = info;
cb->event = tcp_poll_eventhandler;
if ((fds->events & POLLOUT) != 0)
{
cb->flags |= TCP_POLL
cb->flags |= TCP_POLL;
#if defined(CONFIG_NET_TCP_WRITE_BUFFERS)
| TCP_ACKDATA
cb->flags |= TCP_ACKDATA;
#endif
;
/* Monitor the connected event */
@@ -285,7 +284,7 @@ int tcp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check for read data or backlogged connection availability now */
+4 -4
View File
@@ -186,9 +186,9 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* callback processing.
*/
cb->flags = NETDEV_DOWN;
cb->priv = (FAR void *)info;
cb->event = udp_poll_eventhandler;
cb->flags = NETDEV_DOWN;
cb->priv = info;
cb->event = udp_poll_eventhandler;
if ((fds->events & POLLOUT) != 0)
{
@@ -204,7 +204,7 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check for read data availability now */
+6 -6
View File
@@ -174,17 +174,17 @@ static int usrsock_pollsetup(FAR struct socket *psock,
* callback processing.
*/
cb->flags = USRSOCK_EVENT_ABORT | USRSOCK_EVENT_CONNECT_READY |
USRSOCK_EVENT_SENDTO_READY | USRSOCK_EVENT_RECVFROM_AVAIL |
USRSOCK_EVENT_REMOTE_CLOSED;
cb->priv = (FAR void *)info;
cb->event = poll_event;
cb->flags = USRSOCK_EVENT_ABORT | USRSOCK_EVENT_CONNECT_READY |
USRSOCK_EVENT_SENDTO_READY | USRSOCK_EVENT_RECVFROM_AVAIL |
USRSOCK_EVENT_REMOTE_CLOSED;
cb->priv = info;
cb->event = poll_event;
/* Save the reference in the poll info structure as fds private as well
* for use during poll teardown as well.
*/
fds->priv = (FAR void *)info;
fds->priv = info;
/* Check if socket is in error state */