// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include template class ThreadSafeQueue { public: ThreadSafeQueue() = default; ThreadSafeQueue(const ThreadSafeQueue&) = delete; ThreadSafeQueue& operator=(const ThreadSafeQueue&) = delete; ThreadSafeQueue(ThreadSafeQueue&& other) { std::lock_guard lock(_mutex); _queue = std::move(other._queue); } virtual ~ThreadSafeQueue() { } unsigned long size() const { std::lock_guard lock(_mutex); return _queue.size(); } std::optional pop() { std::lock_guard lock(_mutex); if (_queue.empty()) { return {}; } T tmp = _queue.front(); _queue.pop(); return tmp; } void push(const T& item) { std::lock_guard lock(_mutex); _queue.push(item); } T front() { std::lock_guard lock(_mutex); return _queue.front(); } private: // Moved out of public interface to prevent races between this // and pop(). bool empty() const { return _queue.empty(); } std::queue _queue; mutable std::mutex _mutex; };