private:
h2o_accept_ctx_t d_h2o_accept_ctx;
- std::atomic<uint64_t> d_refcnt{1};
time_t d_ticketsKeyNextRotation{0};
std::atomic_flag d_rotatingTicketsKey;
};
{
#ifndef USE_SINGLE_ACCEPTOR_THREAD
{
- auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverBlocking, internalPipeBufferSize);
+ auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverBlocking, internalPipeBufferSize);
d_querySender = std::move(sender);
d_queryReceiver = std::move(receiver);
}
#endif /* USE_SINGLE_ACCEPTOR_THREAD */
{
- auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, internalPipeBufferSize);
+ auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, internalPipeBufferSize);
d_responseSender = std::move(sender);
d_responseReceiver = std::move(receiver);
}
ClientState* cs{nullptr};
std::shared_ptr<DOHFrontend> df{nullptr};
#ifndef USE_SINGLE_ACCEPTOR_THREAD
- pdns::channel::Sender<DOHUnit, void(*)(DOHUnit*)> d_querySender;
- pdns::channel::Receiver<DOHUnit, void(*)(DOHUnit*)> d_queryReceiver;
+ pdns::channel::Sender<DOHUnit> d_querySender;
+ pdns::channel::Receiver<DOHUnit> d_queryReceiver;
#endif /* USE_SINGLE_ACCEPTOR_THREAD */
- pdns::channel::Sender<DOHUnit, void(*)(DOHUnit*)> d_responseSender;
- pdns::channel::Receiver<DOHUnit, void(*)(DOHUnit*)> d_responseReceiver;
+ pdns::channel::Sender<DOHUnit> d_responseSender;
+ pdns::channel::Receiver<DOHUnit> d_responseReceiver;
};
/* This internal function sends back the object to the main thread to send a reply.
/* we are doing quite some copies here, sorry about that,
but we can't keep accessing the req object once we are in a different thread
because the request might get killed by h2o at pretty much any time */
- auto du = std::unique_ptr<DOHUnit, void(*)(DOHUnit*)>(new DOHUnit(std::move(query), std::move(path), std::string(req->authority.base, req->authority.len)), DOHUnit::release);
+ auto du = std::make_unique<DOHUnit>(std::move(query), std::move(path), std::string(req->authority.base, req->authority.len));
du->dsc = dsc;
du->req = req;
du->ids.origDest = local;
*(du->self) = du.get();
#ifdef USE_SINGLE_ACCEPTOR_THREAD
- processDOHQuery(DOHUnitUniquePtr(du.release(), DOHUnit::release), true);
+ processDOHQuery(du, true);
#else /* USE_SINGLE_ACCEPTOR_THREAD */
try {
if (!dsc->d_querySender.send(std::move(du))) {
/* query has been parsed by h2o, which called doh_handler() in the main DoH thread.
In order not to block for long, doh_handler() called doh_dispatch_query() which allocated
a DOHUnit object and passed it to us */
-static void dnsdistclient(pdns::channel::Receiver<DOHUnit, void(*)(DOHUnit*)>&& receiver)
+static void dnsdistclient(pdns::channel::Receiver<DOHUnit>&& receiver)
{
setThreadName("dnsdist/doh-cli");
for(;;) {
try {
- auto tmp = receiver.receive(DOHUnit::release);
+ auto tmp = receiver.receive();
if (!tmp) {
continue;
}
memory and likely coming up too late after the client has gone away */
auto* dsc = static_cast<DOHServerConfig*>(listener->data);
while (true) {
- std::unique_ptr<DOHUnit, void(*)(DOHUnit*)> du{nullptr, DOHUnit::release};
+ std::unique_ptr<DOHUnit> du{nullptr};
try {
- auto tmp = dsc->d_responseReceiver.receive(DOHUnit::release);
+ auto tmp = dsc->d_responseReceiver.receive();
if (!tmp) {
return;
}
#ifndef HAVE_DNS_OVER_HTTPS
struct DOHUnit
{
- static void release(DOHUnit*)
- {
- }
-
- void get()
- {
- }
-
- void release()
- {
- }
-
size_t proxyProtocolPayloadSize{0};
uint16_t status_code{200};
};
DOHUnit(const DOHUnit&) = delete;
DOHUnit& operator=(const DOHUnit&) = delete;
- void get()
- {
- ++d_refcnt;
- }
-
- void release()
- {
- if (--d_refcnt == 0) {
- if (self) {
- *self = nullptr;
- }
-
- delete this;
- }
- }
-
- static void release(DOHUnit* ptr)
- {
- if (ptr) {
- ptr->release();
- }
- }
-
InternalQueryState ids;
std::string sni;
std::string path;
st_h2o_req_t* req{nullptr};
DOHUnit** self{nullptr};
DOHServerConfig* dsc{nullptr};
- pdns::channel::Sender<DOHUnit, void(*)(DOHUnit*)>* responseSender{nullptr};
- std::atomic<uint64_t> d_refcnt{1};
+ pdns::channel::Sender<DOHUnit>* responseSender{nullptr};
size_t query_at{0};
size_t proxyProtocolPayloadSize{0};
int rsock{-1};
void setHTTPResponse(uint16_t statusCode, PacketBuffer&& body, const std::string& contentType="");
};
-void handleUDPResponseForDoH(std::unique_ptr<DOHUnit, void(*)(DOHUnit*)>&&, PacketBuffer&& response, InternalQueryState&& state);
+void handleUDPResponseForDoH(std::unique_ptr<DOHUnit>&&, PacketBuffer&& response, InternalQueryState&& state);
struct CrossProtocolQuery;
struct DNSQuestion;
#endif /* HAVE_LIBH2OEVLOOP */
#endif /* HAVE_DNS_OVER_HTTPS */
-using DOHUnitUniquePtr = std::unique_ptr<DOHUnit, void(*)(DOHUnit*)>;
+using DOHUnitUniquePtr = std::unique_ptr<DOHUnit>;
void handleDOHTimeout(DOHUnitUniquePtr&& oldDU);