mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
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:
parent
2b550eb2d8
commit
0bf495f970
1 changed files with 12 additions and 8 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue