4#include "../Executor.hpp"
6#include <condition_variable>
12namespace Lightweight::Async::detail
35 std::scoped_lock
const lock(_mutex);
36 _queue.push_back(std::move(work));
38 _condition.notify_one();
44 bool TryPop(Work& out)
46 std::scoped_lock
const lock(_mutex);
49 out = std::move(_queue.front());
62 template <
typename Wake>
63 bool WaitAndPop(Work& out, Wake wake)
65 std::unique_lock lock(_mutex);
66 _condition.wait(lock, [&] {
return !_queue.empty() || wake(); });
69 out = std::move(_queue.front());
82 std::scoped_lock
const lock(_mutex);
84 _condition.notify_all();
88 [[nodiscard]] std::size_t Size()
const
90 std::scoped_lock
const lock(_mutex);
95 mutable std::mutex _mutex;
96 std::condition_variable _condition;
97 std::deque<Work> _queue;
107class SerialDrainQueue
115 bool PushAndClaimDrain(Work work)
117 std::scoped_lock
const lock(_mutex);
118 _queue.push_back(std::move(work));
130 bool PopOrEndDrain(Work& out)
132 std::scoped_lock
const lock(_mutex);
138 out = std::move(_queue.front());
145 std::deque<Work> _queue;
146 bool _draining =
false;