std::cout << "Exiting on user request" << std::endl;
#endif /* __SANITIZE_THREAD__ */
#if defined(__SANITIZE_ADDRESS__) && defined(HAVE_LEAK_SANITIZER_INTERFACE)
- auto lock = g_lua.lock();
- cleanupLuaObjects();
- *lock = LuaContext();
+ if (dnsdist::g_asyncHolder) {
+ dnsdist::g_asyncHolder->stop();
+ }
+ {
+ auto lock = g_lua.lock();
+ cleanupLuaObjects();
+ *lock = LuaContext();
+ }
__lsan_do_leak_check();
#endif /* __SANITIZE_ADDRESS__ && HAVE_LEAK_SANITIZER_INTERFACE */
_exit(EXIT_SUCCESS);
std::set<std::string, std::less<>> paths;
h2o_globalconf_t h2o_config{};
h2o_context_t h2o_ctx{};
+ std::unique_ptr<h2o_socket_t,decltype(&h2o_socket_close)> h2o_socket{nullptr, h2o_socket_close};
std::shared_ptr<DOHAcceptContext> accept_ctx{nullptr};
ClientState* clientState{nullptr};
std::shared_ptr<DOHFrontend> dohFrontend{nullptr};
static int create_listener(std::shared_ptr<DOHServerConfig>& dsc, int descriptor)
{
- auto* sock = h2o_evloop_socket_create(dsc->h2o_ctx.loop, descriptor, H2O_SOCKET_FLAG_DONT_READ);
- sock->data = dsc.get();
- h2o_socket_read_start(sock, on_accept);
+ dsc->h2o_socket = std::unique_ptr<h2o_socket_t, decltype(&h2o_socket_close)>{h2o_evloop_socket_create(dsc->h2o_ctx.loop, descriptor, H2O_SOCKET_FLAG_DONT_READ), &h2o_socket_close};
+ dsc->h2o_socket->data = dsc.get();
+ h2o_socket_read_start(dsc->h2o_socket.get(), on_accept);
return 0;
}
dsc->h2o_ctx.storage.entries[0].data = dsc.get();
++dsc->h2o_ctx.storage.size;
- auto* sock = h2o_evloop_socket_create(dsc->h2o_ctx.loop, dsc->d_responseReceiver.getDescriptor(), H2O_SOCKET_FLAG_DONT_READ);
+ auto sock = std::unique_ptr<h2o_socket_t, decltype(&h2o_socket_close)>{h2o_evloop_socket_create(dsc->h2o_ctx.loop, dsc->d_responseReceiver.getDescriptor(), H2O_SOCKET_FLAG_DONT_READ), &h2o_socket_close};
sock->data = dsc.get();
// this listens to responses from dnsdist to turn into http responses
- h2o_socket_read_start(sock, on_dnsdist);
+ h2o_socket_read_start(sock.get(), on_dnsdist);
setupAcceptContext(*dsc->accept_ctx, *dsc, false);
}
while (!stop);
+ h2o_evloop_destroy(dsc->h2o_ctx.loop);
}
catch (const std::exception& e) {
throw runtime_error("DOH thread failed to launch: " + std::string(e.what()));
return DNSResponseAction.Allow
end
+ function atExit()
+ listener = nil
+ collectgarbage()
+ end
+
-- this only matters for tests actually reaching the backend
addAction('tcp-only.async.tests.powerdns.com', PoolAction('tcp-only', false))
addAction('cache.async.tests.powerdns.com', PoolAction('cache', false))
return DNSResponseAction.Allow
end
+ function atExit()
+ listener = nil
+ collectgarbage()
+ end
+
-- this only matters for tests actually reaching the backend
addAction('tcp-only.async.tests.powerdns.com', PoolAction('tcp-only', false))
addAction('cache.async.tests.powerdns.com', PoolAction('cache', false))