{
std::lock_guard<std::mutex> lock(state->socketsLock);
- state->mplexer->getAvailableFDs(ready, -1);
+ state->mplexer->getAvailableFDs(ready, 1000);
}
}
std::vector<int> sockets;
sockets.reserve(dss->sockets.size());
- for(; !dss->isStopped(); ) {
+ for(;;) {
dnsheader* dh = reinterpret_cast<struct dnsheader*>(packet);
try {
pickBackendSocketsReadyForReceiving(dss, sockets);
+ if (dss->isStopped()) {
+ break;
+ }
+
for (const auto& fd : sockets) {
ssize_t got = recv(fd, packet, sizeof(packet), 0);
char * response = packet;
bool DownstreamState::reconnect()
{
std::unique_lock<std::mutex> tl(connectLock, std::try_to_lock);
- if (!tl.owns_lock()) {
- /* we are already reconnecting */
+ if (!tl.owns_lock() || isStopped()) {
+ /* we are already reconnecting or stopped anyway */
return false;
}
void DownstreamState::stop()
{
- std::unique_lock<std::mutex> tl(connectLock);
- std::lock_guard<std::mutex> slock(socketsLock);
d_stopped = true;
- for (auto& fd : sockets) {
- if (fd != -1) {
- /* shutdown() is needed to wake up recv() in the responderThread */
- shutdown(fd, SHUT_RDWR);
+ {
+ std::lock_guard<std::mutex> tl(connectLock);
+ std::lock_guard<std::mutex> slock(socketsLock);
+
+ for (auto& fd : sockets) {
+ if (fd != -1) {
+ /* shutdown() is needed to wake up recv() in the responderThread */
+ shutdown(fd, SHUT_RDWR);
+ }
}
}
}