usrsock/server: replace the wakeup source to eventfd
Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
parent
2214e51457
commit
084cc55064
@ -28,9 +28,10 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/eventfd.h>
|
||||||
|
|
||||||
#include <nuttx/net/dns.h>
|
#include <nuttx/net/dns.h>
|
||||||
#include <nuttx/net/net.h>
|
#include <nuttx/net/net.h>
|
||||||
#include <nuttx/rptun/openamp.h>
|
#include <nuttx/rptun/openamp.h>
|
||||||
@ -39,13 +40,13 @@
|
|||||||
|
|
||||||
struct usrsock_rpmsg_s
|
struct usrsock_rpmsg_s
|
||||||
{
|
{
|
||||||
pid_t pid;
|
struct file *eventfp;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
pthread_cond_t cond;
|
pthread_cond_t cond;
|
||||||
struct iovec iov[CONFIG_NETUTILS_USRSOCK_NIOVEC];
|
struct iovec iov[CONFIG_NETUTILS_USRSOCK_NIOVEC];
|
||||||
struct socket socks[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
struct socket socks[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
||||||
struct rpmsg_endpoint *epts[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
struct rpmsg_endpoint *epts[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
||||||
struct pollfd pfds[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
struct pollfd pfds[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -108,9 +109,10 @@ static void usrsock_rpmsg_ns_unbind(struct rpmsg_endpoint *ept);
|
|||||||
static int usrsock_rpmsg_ept_cb(struct rpmsg_endpoint *ept, void *data,
|
static int usrsock_rpmsg_ept_cb(struct rpmsg_endpoint *ept, void *data,
|
||||||
size_t len, uint32_t src, void *priv);
|
size_t len, uint32_t src, void *priv);
|
||||||
|
|
||||||
|
static int usrsock_rpmsg_notify_poll(struct usrsock_rpmsg_s *priv);
|
||||||
static int usrsock_rpmsg_prepare_poll(struct usrsock_rpmsg_s *priv,
|
static int usrsock_rpmsg_prepare_poll(struct usrsock_rpmsg_s *priv,
|
||||||
struct pollfd *pfds);
|
struct pollfd *pfds);
|
||||||
static void usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
static bool usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
||||||
struct pollfd *pfds, int count);
|
struct pollfd *pfds, int count);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -235,7 +237,7 @@ static int usrsock_rpmsg_socket_handler(struct rpmsg_endpoint *ept,
|
|||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
priv->pfds[ret].ptr = &priv->socks[ret];
|
priv->pfds[ret].ptr = &priv->socks[ret];
|
||||||
priv->pfds[ret].events = POLLIN;
|
priv->pfds[ret].events = POLLIN;
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
retr = usrsock_rpmsg_send_event(ept, ret, USRSOCK_EVENT_SENDTO_READY);
|
retr = usrsock_rpmsg_send_event(ept, ret, USRSOCK_EVENT_SENDTO_READY);
|
||||||
}
|
}
|
||||||
@ -260,7 +262,7 @@ static int usrsock_rpmsg_close_handler(struct rpmsg_endpoint *ept,
|
|||||||
/* Signal and wait the poll thread to wakeup */
|
/* Signal and wait the poll thread to wakeup */
|
||||||
|
|
||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
kill(priv->pid, SIGUSR1);
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_cond_wait(&priv->cond, &priv->mutex);
|
pthread_cond_wait(&priv->cond, &priv->mutex);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
@ -305,7 +307,7 @@ static int usrsock_rpmsg_connect_handler(struct rpmsg_endpoint *ept,
|
|||||||
priv->pfds[req->usockid].events |= POLLOUT;
|
priv->pfds[req->usockid].events |= POLLOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
if (!inprogress)
|
if (!inprogress)
|
||||||
{
|
{
|
||||||
@ -428,7 +430,7 @@ out:
|
|||||||
{
|
{
|
||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
priv->pfds[req->usockid].events |= POLLOUT;
|
priv->pfds[req->usockid].events |= POLLOUT;
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,7 +492,7 @@ static int usrsock_rpmsg_recvfrom_handler(struct rpmsg_endpoint *ept,
|
|||||||
{
|
{
|
||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
priv->pfds[req->usockid].events |= POLLIN;
|
priv->pfds[req->usockid].events |= POLLIN;
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,7 +627,7 @@ static int usrsock_rpmsg_listen_handler(struct rpmsg_endpoint *ept,
|
|||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
priv->pfds[req->usockid].ptr = &priv->socks[req->usockid];
|
priv->pfds[req->usockid].ptr = &priv->socks[req->usockid];
|
||||||
priv->pfds[req->usockid].events = POLLIN;
|
priv->pfds[req->usockid].events = POLLIN;
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -695,7 +697,7 @@ static int usrsock_rpmsg_accept_handler(struct rpmsg_endpoint *ept,
|
|||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
priv->pfds[i].ptr = &priv->socks[i];
|
priv->pfds[i].ptr = &priv->socks[i];
|
||||||
priv->pfds[i].events = POLLIN;
|
priv->pfds[i].events = POLLIN;
|
||||||
kill(priv->pid, SIGUSR1); /* Wakeup the poll thread */
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
usrsock_rpmsg_send_event(ept, i, USRSOCK_EVENT_SENDTO_READY);
|
usrsock_rpmsg_send_event(ept, i, USRSOCK_EVENT_SENDTO_READY);
|
||||||
}
|
}
|
||||||
@ -807,7 +809,7 @@ static void usrsock_rpmsg_ns_unbind(struct rpmsg_endpoint *ept)
|
|||||||
/* Signal and wait the poll thread to wakeup */
|
/* Signal and wait the poll thread to wakeup */
|
||||||
|
|
||||||
pthread_mutex_lock(&priv->mutex);
|
pthread_mutex_lock(&priv->mutex);
|
||||||
kill(priv->pid, SIGUSR1);
|
usrsock_rpmsg_notify_poll(priv);
|
||||||
pthread_cond_wait(&priv->cond, &priv->mutex);
|
pthread_cond_wait(&priv->cond, &priv->mutex);
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
@ -840,6 +842,13 @@ static int usrsock_rpmsg_ept_cb(struct rpmsg_endpoint *ept, void *data,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int usrsock_rpmsg_notify_poll(struct usrsock_rpmsg_s *priv)
|
||||||
|
{
|
||||||
|
eventfd_t value = 1ULL;
|
||||||
|
|
||||||
|
return file_write(priv->eventfp, &value, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
static int usrsock_rpmsg_prepare_poll(struct usrsock_rpmsg_s *priv,
|
static int usrsock_rpmsg_prepare_poll(struct usrsock_rpmsg_s *priv,
|
||||||
struct pollfd *pfds)
|
struct pollfd *pfds)
|
||||||
{
|
{
|
||||||
@ -861,22 +870,41 @@ static int usrsock_rpmsg_prepare_poll(struct usrsock_rpmsg_s *priv,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pfds[count].ptr = priv->eventfp;
|
||||||
|
pfds[count++].events = POLLIN | POLLFILE;
|
||||||
|
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
static bool usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
||||||
struct pollfd *pfds, int count)
|
struct pollfd *pfds, int count)
|
||||||
{
|
{
|
||||||
|
bool prepare = false;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_lock(&priv->mutex);
|
||||||
|
|
||||||
|
if (pfds[i].ptr == priv->eventfp)
|
||||||
|
{
|
||||||
|
if (pfds[i].revents & POLLIN)
|
||||||
|
{
|
||||||
|
eventfd_t value;
|
||||||
|
|
||||||
|
file_read(priv->eventfp, &value, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
j = (struct socket *)pfds[i].ptr - priv->socks;
|
j = (struct socket *)pfds[i].ptr - priv->socks;
|
||||||
|
|
||||||
pthread_mutex_lock(&priv->mutex);
|
|
||||||
if (priv->epts[j] != NULL)
|
if (priv->epts[j] != NULL)
|
||||||
{
|
{
|
||||||
int events = 0;
|
int events = 0;
|
||||||
@ -916,9 +944,12 @@ static void usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
|||||||
usrsock_rpmsg_send_event(priv->epts[j], j, events);
|
usrsock_rpmsg_send_event(priv->epts[j], j, events);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&priv->mutex);
|
pthread_mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return prepare;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -927,10 +958,11 @@ static void usrsock_rpmsg_process_poll(struct usrsock_rpmsg_s *priv,
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct pollfd pfds[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS];
|
struct pollfd pfds[CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS + 1];
|
||||||
struct usrsock_rpmsg_s *priv;
|
struct usrsock_rpmsg_s *priv;
|
||||||
sigset_t sigmask;
|
bool prepare = true;
|
||||||
int ret;
|
int ret;
|
||||||
|
int fd;
|
||||||
|
|
||||||
priv = calloc(1, sizeof(*priv));
|
priv = calloc(1, sizeof(*priv));
|
||||||
if (priv == NULL)
|
if (priv == NULL)
|
||||||
@ -938,16 +970,21 @@ int main(int argc, char *argv[])
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->pid = getpid();
|
|
||||||
|
|
||||||
pthread_mutex_init(&priv->mutex, NULL);
|
pthread_mutex_init(&priv->mutex, NULL);
|
||||||
pthread_cond_init(&priv->cond, NULL);
|
pthread_cond_init(&priv->cond, NULL);
|
||||||
|
|
||||||
signal(SIGUSR1, SIG_IGN);
|
fd = eventfd(0, 0);
|
||||||
sigprocmask(SIG_SETMASK, NULL, &sigmask);
|
if (fd < 0)
|
||||||
sigaddset(&sigmask, SIGUSR1);
|
{
|
||||||
sigprocmask(SIG_SETMASK, &sigmask, NULL);
|
ret = -errno;
|
||||||
sigdelset(&sigmask, SIGUSR1);
|
goto free_priv;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fs_getfilep(fd, &priv->eventfp);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto free_fd;
|
||||||
|
}
|
||||||
|
|
||||||
ret = rpmsg_register_callback(priv,
|
ret = rpmsg_register_callback(priv,
|
||||||
NULL,
|
NULL,
|
||||||
@ -955,24 +992,25 @@ int main(int argc, char *argv[])
|
|||||||
usrsock_rpmsg_ns_bind);
|
usrsock_rpmsg_ns_bind);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto free_priv;
|
goto free_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
/* Collect all socks which need monitor */
|
||||||
|
|
||||||
|
if (prepare)
|
||||||
|
{
|
||||||
|
ret = usrsock_rpmsg_prepare_poll(priv, pfds);
|
||||||
|
}
|
||||||
|
|
||||||
/* Monitor the state change from them */
|
/* Monitor the state change from them */
|
||||||
|
|
||||||
if (ppoll(pfds, ret, NULL, &sigmask) >= 0)
|
if (poll(pfds, ret, -1) > 0)
|
||||||
{
|
{
|
||||||
/* Process all changed socks */
|
/* Process all changed socks */
|
||||||
|
|
||||||
usrsock_rpmsg_process_poll(priv, pfds, ret);
|
prepare = usrsock_rpmsg_process_poll(priv, pfds, ret);
|
||||||
}
|
|
||||||
else if (errno == EINTR)
|
|
||||||
{
|
|
||||||
/* Collect all socks which need monitor */
|
|
||||||
|
|
||||||
ret = usrsock_rpmsg_prepare_poll(priv, pfds);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -980,6 +1018,8 @@ int main(int argc, char *argv[])
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
usrsock_rpmsg_ns_bind);
|
usrsock_rpmsg_ns_bind);
|
||||||
|
free_fd:
|
||||||
|
close(fd);
|
||||||
free_priv:
|
free_priv:
|
||||||
pthread_cond_destroy(&priv->cond);
|
pthread_cond_destroy(&priv->cond);
|
||||||
pthread_mutex_destroy(&priv->mutex);
|
pthread_mutex_destroy(&priv->mutex);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user