]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix compatibility with boost::lockfree >= 1.87.0 15137/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 10 Feb 2025 10:24:28 +0000 (11:24 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 10 Feb 2025 10:24:28 +0000 (11:24 +0100)
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
pdns/dnsdistdist/xsk.cc
pdns/dnsdistdist/xsk.hh

index 5572ce61e102d499353546948a5e74db23d265fd..ff65b5c7cb503734436e2c02e1858b73be5c9036 100644 (file)
@@ -46,7 +46,7 @@ void XskResponderThread(std::shared_ptr<DownstreamState> dss, std::shared_ptr<Xs
       if ((pollfds[0].revents & POLLIN) != 0) {
         needNotify = true;
         xskInfo->cleanSocketNotification();
-        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<XskSocket> 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);
index 5851f1b9b79ee341f35851420895cd598e464123..d246a1d72e833794487b4573fe70610f8aa9c806 100644 (file)
@@ -1185,7 +1185,7 @@ bool XskWorker::hasIncomingFrames()
   return d_incomingPacketsQueue.read_available() != 0U;
 }
 
-void XskWorker::processIncomingFrames(const std::function<void(XskPacket& packet)>& callback)
+void XskWorker::processIncomingFrames(const std::function<void(XskPacket packet)>& 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<void(XskPacket& packet
   d_incomingPacketsQueue.consume_all(callback);
 }
 
-void XskWorker::processOutgoingFrames(const std::function<void(XskPacket& packet)>& callback)
+void XskWorker::processOutgoingFrames(const std::function<void(XskPacket packet)>& callback)
 {
   d_outgoingPacketsQueue.consume_all(callback);
 }
index 2f3e7c372e352a232e19f42dbba1219935f62596..ff36be5ecd96c9d7d2a0b0026728a1d94f75ea7a 100644 (file)
@@ -312,8 +312,8 @@ public:
   void pushToProcessingQueue(XskPacket& packet);
   void pushToSendQueue(XskPacket& packet);
   bool hasIncomingFrames();
-  void processIncomingFrames(const std::function<void(XskPacket& packet)>& callback);
-  void processOutgoingFrames(const std::function<void(XskPacket& packet)>& callback);
+  void processIncomingFrames(const std::function<void(XskPacket packet)>& callback);
+  void processOutgoingFrames(const std::function<void(XskPacket packet)>& callback);
   void markAsFree(const XskPacket& packet);
   // notify worker that at least one packet is available for processing
   void notifyWorker() const;