Merge pull request #861 from Alexays/fix-network
revert: restore eventfd
This commit is contained in:
		
						commit
						43ca8f7050
					
				|  | @ -54,6 +54,8 @@ class Network : public ALabel { | |||
|   struct sockaddr_nl nladdr_ = {0}; | ||||
|   struct nl_sock*    sock_ = nullptr; | ||||
|   struct nl_sock*    ev_sock_ = nullptr; | ||||
|   int                efd_; | ||||
|   int                ev_fd_; | ||||
|   int                nl80211_id_; | ||||
|   std::mutex         mutex_; | ||||
| 
 | ||||
|  |  | |||
|  | @ -83,6 +83,8 @@ waybar::modules::Network::Network(const std::string &id, const Json::Value &conf | |||
|     : ALabel(config, "network", id, "{ifname}", 60), | ||||
|       ifid_(-1), | ||||
|       family_(config["family"] == "ipv6" ? AF_INET6 : AF_INET), | ||||
|       efd_(-1), | ||||
|       ev_fd_(-1), | ||||
|       cidr_(-1), | ||||
|       signal_strength_dbm_(0), | ||||
|       signal_strength_(0), | ||||
|  | @ -119,6 +121,12 @@ waybar::modules::Network::Network(const std::string &id, const Json::Value &conf | |||
| } | ||||
| 
 | ||||
| waybar::modules::Network::~Network() { | ||||
|   if (ev_fd_ > -1) { | ||||
|     close(ev_fd_); | ||||
|   } | ||||
|   if (efd_ > -1) { | ||||
|     close(efd_); | ||||
|   } | ||||
|   if (ev_sock_ != nullptr) { | ||||
|     nl_socket_drop_membership(ev_sock_, RTNLGRP_LINK); | ||||
|     if (family_ == AF_INET) { | ||||
|  | @ -150,6 +158,30 @@ void waybar::modules::Network::createEventSocket() { | |||
|   } else { | ||||
|     nl_socket_add_membership(ev_sock_, RTNLGRP_IPV6_IFADDR); | ||||
|   } | ||||
|   efd_ = epoll_create1(EPOLL_CLOEXEC); | ||||
|   if (efd_ < 0) { | ||||
|     throw std::runtime_error("Can't create epoll"); | ||||
|   } | ||||
|   { | ||||
|     ev_fd_ = eventfd(0, EFD_NONBLOCK); | ||||
|     struct epoll_event event; | ||||
|     memset(&event, 0, sizeof(event)); | ||||
|     event.events = EPOLLIN | EPOLLET; | ||||
|     event.data.fd = ev_fd_; | ||||
|     if (epoll_ctl(efd_, EPOLL_CTL_ADD, ev_fd_, &event) == -1) { | ||||
|       throw std::runtime_error("Can't add epoll event"); | ||||
|     } | ||||
|   } | ||||
|   { | ||||
|     auto               fd = nl_socket_get_fd(ev_sock_); | ||||
|     struct epoll_event event; | ||||
|     memset(&event, 0, sizeof(event)); | ||||
|     event.events = EPOLLIN | EPOLLET | EPOLLRDHUP; | ||||
|     event.data.fd = fd; | ||||
|     if (epoll_ctl(efd_, EPOLL_CTL_ADD, fd, &event) == -1) { | ||||
|       throw std::runtime_error("Can't add epoll event"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void waybar::modules::Network::createInfoSocket() { | ||||
|  | @ -192,6 +224,19 @@ void waybar::modules::Network::worker() { | |||
| #else | ||||
|     spdlog::warn("Waybar has been built without rfkill support."); | ||||
| #endif | ||||
|   thread_ = [this] { | ||||
|     std::array<struct epoll_event, EPOLL_MAX> events{}; | ||||
| 
 | ||||
|     int ec = epoll_wait(efd_, events.data(), EPOLL_MAX, -1); | ||||
|     if (ec > 0) { | ||||
|       for (auto i = 0; i < ec; i++) { | ||||
|         if (events[i].data.fd != nl_socket_get_fd(ev_sock_) || nl_recvmsgs_default(ev_sock_) < 0) { | ||||
|           thread_.stop(); | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| const std::string waybar::modules::Network::getNetworkState() const { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue