network: Read all available messages on ev_sock_
When more than one message is available to read on the ev_sock_ socket, only the first one is read. Make some changes to be able to read all the messages available by setting the socket to non-blocking. This way we can detect when there's nothing left to read and loop back to wait with epoll.pull/1106/head
parent
9357a6cb88
commit
63fdf66ad6
|
@ -160,6 +160,9 @@ void waybar::modules::Network::createEventSocket() {
|
||||||
if (nl_connect(ev_sock_, NETLINK_ROUTE) != 0) {
|
if (nl_connect(ev_sock_, NETLINK_ROUTE) != 0) {
|
||||||
throw std::runtime_error("Can't connect network socket");
|
throw std::runtime_error("Can't connect network socket");
|
||||||
}
|
}
|
||||||
|
if (nl_socket_set_nonblocking(ev_sock_)) {
|
||||||
|
throw std::runtime_error("Can't set non-blocking on network socket");
|
||||||
|
}
|
||||||
nl_socket_add_membership(ev_sock_, RTNLGRP_LINK);
|
nl_socket_add_membership(ev_sock_, RTNLGRP_LINK);
|
||||||
if (family_ == AF_INET) {
|
if (family_ == AF_INET) {
|
||||||
nl_socket_add_membership(ev_sock_, RTNLGRP_IPV4_IFADDR);
|
nl_socket_add_membership(ev_sock_, RTNLGRP_IPV4_IFADDR);
|
||||||
|
@ -235,7 +238,23 @@ void waybar::modules::Network::worker() {
|
||||||
int ec = epoll_wait(efd_, events.data(), EPOLL_MAX, -1);
|
int ec = epoll_wait(efd_, events.data(), EPOLL_MAX, -1);
|
||||||
if (ec > 0) {
|
if (ec > 0) {
|
||||||
for (auto i = 0; i < ec; i++) {
|
for (auto i = 0; i < ec; i++) {
|
||||||
if (events[i].data.fd != nl_socket_get_fd(ev_sock_) || nl_recvmsgs_default(ev_sock_) < 0) {
|
if (events[i].data.fd == nl_socket_get_fd(ev_sock_)) {
|
||||||
|
int rc = 0;
|
||||||
|
// Read as many message as possible, until the socket blocks
|
||||||
|
while (true) {
|
||||||
|
errno = 0;
|
||||||
|
rc = nl_recvmsgs_default(ev_sock_);
|
||||||
|
if (rc == -NLE_AGAIN || errno == EAGAIN) {
|
||||||
|
rc = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rc < 0) {
|
||||||
|
spdlog::error("nl_recvmsgs_default error: {}", nl_geterror(-rc));
|
||||||
|
thread_.stop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
thread_.stop();
|
thread_.stop();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue