Always remove all the DNS sockets on an c-ares event
Because c-ares may close one of its socket, even if it’s not the one that has the event. Otherwise we may not know when a socket has been removed from our poller (automatically, when close()ed) and this leads to bugs.
This commit is contained in:
@@ -37,6 +37,7 @@ ares_channel& DNSHandler::get_channel()
|
||||
|
||||
void DNSHandler::destroy()
|
||||
{
|
||||
this->remove_all_sockets_from_poller();
|
||||
this->socket_handlers.clear();
|
||||
::ares_destroy(this->channel);
|
||||
::ares_library_cleanup();
|
||||
@@ -95,7 +96,7 @@ void DNSHandler::watch_dns_sockets(std::shared_ptr<Poller>& poller)
|
||||
if (it == this->socket_handlers.end())
|
||||
{
|
||||
this->socket_handlers.emplace(this->socket_handlers.begin(),
|
||||
std::make_unique<DNSSocketHandler>(poller, i));
|
||||
std::make_unique<DNSSocketHandler>(poller, *this, i));
|
||||
it = this->socket_handlers.begin();
|
||||
}
|
||||
poller->add_socket_handler(it->get());
|
||||
@@ -122,4 +123,12 @@ void DNSHandler::watch_dns_sockets(std::shared_ptr<Poller>& poller)
|
||||
}
|
||||
}
|
||||
|
||||
void DNSHandler::remove_all_sockets_from_poller()
|
||||
{
|
||||
for (const auto& socket_handler: this->socket_handlers)
|
||||
{
|
||||
socket_handler->remove_from_poller();
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CARES_FOUND */
|
||||
|
||||
Reference in New Issue
Block a user