dpdk: Change client to wait on member variable

Waiting on queue status seems to not always work, the queue state seems
to not be updated immediately after pushing an item onto it when queried
from a different thread.
This commit is contained in:
Ciro Nishiguchi 2019-12-17 15:05:58 -06:00 committed by Brent Stapleton
parent 2b550eb2d8
commit 0bf495f970

View file

@ -132,7 +132,7 @@ public:
std::unique_lock<std::mutex> lock(_waiter->mutex);
wait_req_get(_waiter);
_waiter->complete = false;
auto is_complete = [this] { return !rte_ring_empty(_buffer_queue); };
auto is_complete = [this] { return _waiter->complete; };
if (timeout_ms < 0) {
_waiter->cond.wait(lock, is_complete);
} else {
@ -141,9 +141,11 @@ public:
return frame_buff::uptr();
}
}
if (rte_ring_dequeue(_buffer_queue, (void**)&buff_ptr)) {
return frame_buff::uptr();
}
// Occasionally the conditional variable wait method returns but the
// first dequeue operation fails, even though we push onto it before
// setting complete to true. Retrying successfully dequeues a value
// in those cases.
while (rte_ring_dequeue(_buffer_queue, (void**)&buff_ptr)) {}
}
return frame_buff::uptr(buff_ptr);
}
@ -240,7 +242,7 @@ public:
std::unique_lock<std::mutex> lock(_waiter->mutex);
wait_req_get(_waiter);
_waiter->complete = false;
auto is_complete = [this] { return !rte_ring_empty(_recv_queue); };
auto is_complete = [this] { return _waiter->complete; };
if (timeout_ms < 0) {
_waiter->cond.wait(lock, is_complete);
} else {
@ -249,9 +251,11 @@ public:
return frame_buff::uptr();
}
}
if (rte_ring_dequeue(_recv_queue, (void**)&buff_ptr)) {
return frame_buff::uptr();
}
// Occasionally the conditional variable wait method returns but the
// first dequeue operation fails, even though we push onto it before
// setting complete to true. Retrying successfully dequeues a value
// in those cases.
while (rte_ring_dequeue(_recv_queue, (void**)&buff_ptr)) {}
}
return frame_buff::uptr(buff_ptr);
}