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)
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;
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;
while (!xskInfo->hasIncomingFrames()) {
xskInfo->waitForXskSocket();
}
- xskInfo->processIncomingFrames([&](XskPacket& packet) {
+ xskInfo->processIncomingFrames([&](XskPacket packet) {
if (XskProcessQuery(*clientState, holders, packet)) {
packet.updatePacket();
xskInfo->pushToSendQueue(packet);
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");
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);
}
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;