diff options
| author | Stefan Boberg <[email protected]> | 2021-10-05 16:35:57 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-05 16:35:57 +0200 |
| commit | c6df63ef7f970f2faec0b4f84cdb846f96dace48 (patch) | |
| tree | d1707502b1ca2eccc002419e888110142498f345 /zencore | |
| parent | http: Moved logic for body suppression to a more central location (diff) | |
| download | zen-c6df63ef7f970f2faec0b4f84cdb846f96dace48.tar.xz zen-c6df63ef7f970f2faec0b4f84cdb846f96dace48.zip | |
zencore: Added BlockingQueue (moved from upstreamcache.cpp)
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/include/zencore/blockingqueue.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/zencore/include/zencore/blockingqueue.h b/zencore/include/zencore/blockingqueue.h new file mode 100644 index 000000000..fbb4480a1 --- /dev/null +++ b/zencore/include/zencore/blockingqueue.h @@ -0,0 +1,73 @@ +#pragma once + +#include <atomic> +#include <deque> +#include <mutex> + +namespace zen { + +template<typename T> +class BlockingQueue +{ +public: + BlockingQueue() = default; + + ~BlockingQueue() { CompleteAdding(); } + + void Enqueue(T&& Item) + { + { + std::lock_guard Lock(m_Lock); + m_Queue.emplace_back(std::move(Item)); + m_Size++; + } + + m_NewItemSignal.notify_one(); + } + + bool WaitAndDequeue(T& Item) + { + if (m_CompleteAdding.load()) + { + return false; + } + + std::unique_lock Lock(m_Lock); + m_NewItemSignal.wait(Lock, [this]() { return !m_Queue.empty() || m_CompleteAdding.load(); }); + + if (!m_Queue.empty()) + { + Item = std::move(m_Queue.front()); + m_Queue.pop_front(); + m_Size--; + + return true; + } + + return false; + } + + void CompleteAdding() + { + if (!m_CompleteAdding.load()) + { + m_CompleteAdding.store(true); + m_NewItemSignal.notify_all(); + } + } + + std::size_t Size() const + { + std::unique_lock Lock(m_Lock); + return m_Queue.size(); + } + +private: + mutable std::mutex m_Lock; + std::condition_variable m_NewItemSignal; + std::deque<T> m_Queue; + std::atomic_bool m_CompleteAdding{false}; + std::atomic_uint32_t m_Size; +}; + +} // namespace zen |