PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
command_queue.h
1#pragma once
2
3#include <chrono>
4#include <condition_variable>
5#include <functional>
6#include <mutex>
7#include <queue>
8#include <utility>
9
10namespace pixelbullet::audio_internal
11{
14{
15public:
16 enum class PopStatus
17 {
18 Command,
19 Timeout,
20 Closed,
21 };
22
24 bool push(std::function<void()> command)
25 {
26 if (!command)
27 {
28 return false;
29 }
30
31 {
32 std::lock_guard<std::mutex> lock(mutex_);
33 if (closed_)
34 {
35 return false;
36 }
37 queue_.push(std::move(command));
38 }
39 cond_.notify_one();
40 return true;
41 }
42
43 PopStatus pop_for(std::function<void()>& command, const std::chrono::milliseconds timeout)
44 {
45 std::unique_lock<std::mutex> lock(mutex_);
46 cond_.wait_for(lock, timeout, [this]() { return closed_ || !queue_.empty(); });
47
48 if (!queue_.empty())
49 {
50 command = std::move(queue_.front());
51 queue_.pop();
52 return PopStatus::Command;
53 }
54
55 return closed_ ? PopStatus::Closed : PopStatus::Timeout;
56 }
57
59 bool pop(std::function<void()>& command)
60 {
61 std::unique_lock<std::mutex> lock(mutex_);
62 cond_.wait(lock, [this]() { return closed_ || !queue_.empty(); });
63
64 if (!queue_.empty())
65 {
66 command = std::move(queue_.front());
67 queue_.pop();
68 return true;
69 }
70
71 return false;
72 }
73
74 void close()
75 {
76 {
77 std::lock_guard<std::mutex> lock(mutex_);
78 closed_ = true;
79 }
80 cond_.notify_all();
81 }
82
83private:
84 std::mutex mutex_;
85 std::condition_variable cond_;
86 std::queue<std::function<void()>> queue_;
87 bool closed_ = false;
88};
89} // namespace pixelbullet::audio_internal
A simple thread-safe command queue.
Definition command_queue.h:14
bool pop(std::function< void()> &command)
Blocks until a command is available or the queue is closed.
Definition command_queue.h:59
bool push(std::function< void()> command)
Push a new command into the queue.
Definition command_queue.h:24