mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-25 23:22:28 +02:00 
			
		
		
		
	fix: cancel thread and fix window close
This commit is contained in:
		| @@ -63,22 +63,20 @@ auto waybar::modules::MPD::update() -> void { | ||||
|  | ||||
| std::thread waybar::modules::MPD::event_listener() { | ||||
|   return std::thread([this] { | ||||
|     while (true) { | ||||
|       try { | ||||
|         if (connection_ == nullptr) { | ||||
|           // Retry periodically if no connection | ||||
|           dp.emit(); | ||||
|           std::this_thread::sleep_for(interval_); | ||||
|         } else { | ||||
|           waitForEvent(); | ||||
|           dp.emit(); | ||||
|         } | ||||
|       } catch (const std::exception& e) { | ||||
|         if (strcmp(e.what(), "Connection to MPD closed") == 0) { | ||||
|           spdlog::debug("{}: {}", module_name_, e.what()); | ||||
|         } else { | ||||
|           spdlog::warn("{}: {}", module_name_, e.what()); | ||||
|         } | ||||
|     try { | ||||
|       if (connection_ == nullptr) { | ||||
|         // Retry periodically if no connection | ||||
|         dp.emit(); | ||||
|         std::this_thread::sleep_for(interval_); | ||||
|       } else { | ||||
|         waitForEvent(); | ||||
|         dp.emit(); | ||||
|       } | ||||
|     } catch (const std::exception& e) { | ||||
|       if (strcmp(e.what(), "Connection to MPD closed") == 0) { | ||||
|         spdlog::debug("{}: {}", module_name_, e.what()); | ||||
|       } else { | ||||
|         spdlog::warn("{}: {}", module_name_, e.what()); | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
|   | ||||
| @@ -81,8 +81,6 @@ 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), | ||||
| @@ -117,14 +115,6 @@ waybar::modules::Network::Network(const std::string &id, const Json::Value &conf | ||||
| } | ||||
|  | ||||
| waybar::modules::Network::~Network() { | ||||
|   if (ev_fd_ > -1) { | ||||
|     eventfd_write(ev_fd_, 1); | ||||
|     std::this_thread::sleep_for(std::chrono::milliseconds(150)); | ||||
|     close(ev_fd_); | ||||
|   } | ||||
|   if (efd_ > -1) { | ||||
|     close(efd_); | ||||
|   } | ||||
|   if (ev_sock_ != nullptr) { | ||||
|     nl_socket_drop_membership(ev_sock_, RTNLGRP_LINK); | ||||
|     if (family_ == AF_INET) { | ||||
| @@ -156,30 +146,6 @@ 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() { | ||||
| @@ -218,19 +184,6 @@ void waybar::modules::Network::worker() { | ||||
|       } | ||||
|     } | ||||
|   }; | ||||
|   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 { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alex
					Alex