From 509585523cccdf8e33578152669e8cf22b1070a2 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Mon, 10 Feb 2025 11:24:28 +0100 Subject: [PATCH] dnsdist-1.9.x: Fix compatibility with boost::lockfree >= 1.87.0 In https://github.com/boostorg/lockfree/pull/90 `boost::lockfree::spsc_queue` introduced moved semantics, which is great, but added restrictions to the callback functor that did not exist before, breaking the API. This PR fixes that by updating our callbacks to expect an object instead of a reference. (cherry picked from commit 05543aed8ccff2270a65d3f9b75e6e9d894b8b45) --- pdns/dnsdistdist/dnsdist-xsk.cc | 6 +++--- pdns/xsk.cc | 4 ++-- pdns/xsk.hh | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-xsk.cc b/pdns/dnsdistdist/dnsdist-xsk.cc index 7e83c51009..dcbd794597 100644 --- a/pdns/dnsdistdist/dnsdist-xsk.cc +++ b/pdns/dnsdistdist/dnsdist-xsk.cc @@ -48,7 +48,7 @@ void XskResponderThread(std::shared_ptr dss, std::shared_ptrcleanSocketNotification(); - xskInfo->processIncomingFrames([&](XskPacket& packet) { + xskInfo->processIncomingFrames([&](XskPacket packet) { if (packet.getDataLen() < sizeof(dnsheader)) { xskInfo->markAsFree(packet); return; @@ -167,7 +167,7 @@ void XskRouter(std::shared_ptr xsk) if ((fds.at(fdIndex).revents & POLLIN) != 0) { ready--; const auto& info = xsk->getWorkerByDescriptor(fds.at(fdIndex).fd); - info->processOutgoingFrames([&](XskPacket& packet) { + info->processOutgoingFrames([&](XskPacket packet) { if ((packet.getFlags() & XskPacket::UPDATE) == 0) { xsk->markAsFree(packet); return; @@ -202,7 +202,7 @@ void XskClientThread(ClientState* clientState) while (!xskInfo->hasIncomingFrames()) { xskInfo->waitForXskSocket(); } - xskInfo->processIncomingFrames([&](XskPacket& packet) { + xskInfo->processIncomingFrames([&](XskPacket packet) { if (XskProcessQuery(*clientState, holders, packet)) { packet.updatePacket(); xskInfo->pushToSendQueue(packet); diff --git a/pdns/xsk.cc b/pdns/xsk.cc index 5851f1b9b7..d246a1d72e 100644 --- a/pdns/xsk.cc +++ b/pdns/xsk.cc @@ -1185,7 +1185,7 @@ bool XskWorker::hasIncomingFrames() return d_incomingPacketsQueue.read_available() != 0U; } -void XskWorker::processIncomingFrames(const std::function& callback) +void XskWorker::processIncomingFrames(const std::function& callback) { if (d_type == Type::OutgoingOnly) { throw std::runtime_error("Looking for incoming packets in an outgoing-only XSK Worker"); @@ -1194,7 +1194,7 @@ void XskWorker::processIncomingFrames(const std::function& callback) +void XskWorker::processOutgoingFrames(const std::function& callback) { d_outgoingPacketsQueue.consume_all(callback); } diff --git a/pdns/xsk.hh b/pdns/xsk.hh index 2f3e7c372e..ff36be5ecd 100644 --- a/pdns/xsk.hh +++ b/pdns/xsk.hh @@ -312,8 +312,8 @@ public: void pushToProcessingQueue(XskPacket& packet); void pushToSendQueue(XskPacket& packet); bool hasIncomingFrames(); - void processIncomingFrames(const std::function& callback); - void processOutgoingFrames(const std::function& callback); + void processIncomingFrames(const std::function& callback); + void processOutgoingFrames(const std::function& callback); void markAsFree(const XskPacket& packet); // notify worker that at least one packet is available for processing void notifyWorker() const; -- 2.47.2