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:
louiz’
2016-07-28 10:34:01 +02:00
parent de0eff6e94
commit 11a1c0cc99
4 changed files with 26 additions and 5 deletions
+10 -1
View File
@@ -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 */