From 05543aed8ccff2270a65d3f9b75e6e9d894b8b45 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Mon, 10 Feb 2025 11:24:28 +0100 Subject: [PATCH] dnsdist: 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. --- pdns/dnsdistdist/dnsdist-xsk.cc | 6 +++--- pdns/dnsdistdist/xsk.cc | 4 ++-- pdns/dnsdistdist/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 5572ce61e1..ff65b5c7cb 100644 --- a/pdns/dnsdistdist/dnsdist-xsk.cc +++ b/pdns/dnsdistdist/dnsdist-xsk.cc @@ -46,7 +46,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; @@ -165,7 +165,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; @@ -199,7 +199,7 @@ void XskClientThread(ClientState* clientState) while (!xskInfo->hasIncomingFrames()) { xskInfo->waitForXskSocket(); } - xskInfo->processIncomingFrames([&](XskPacket& packet) { + xskInfo->processIncomingFrames([&](XskPacket packet) { if (XskProcessQuery(*clientState, packet)) { packet.updatePacket(); xskInfo->pushToSendQueue(packet); diff --git a/pdns/dnsdistdist/xsk.cc b/pdns/dnsdistdist/xsk.cc index 5851f1b9b7..d246a1d72e 100644 --- a/pdns/dnsdistdist/xsk.cc +++ b/pdns/dnsdistdist/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/dnsdistdist/xsk.hh b/pdns/dnsdistdist/xsk.hh index 2f3e7c372e..ff36be5ecd 100644 --- a/pdns/dnsdistdist/xsk.hh +++ b/pdns/dnsdistdist/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