aboutsummaryrefslogtreecommitdiff
path: root/externals/discord-rpc/src/msg_queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/discord-rpc/src/msg_queue.h')
-rw-r--r--externals/discord-rpc/src/msg_queue.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/externals/discord-rpc/src/msg_queue.h b/externals/discord-rpc/src/msg_queue.h
new file mode 100644
index 0000000000..77f380e705
--- /dev/null
+++ b/externals/discord-rpc/src/msg_queue.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <atomic>
+
+// A simple queue. No locks, but only works with a single thread as producer and a single thread as
+// a consumer. Mutex up as needed.
+
+template <typename ElementType, size_t QueueSize>
+class MsgQueue {
+ ElementType queue_[QueueSize];
+ std::atomic_uint nextAdd_{0};
+ std::atomic_uint nextSend_{0};
+ std::atomic_uint pendingSends_{0};
+
+public:
+ MsgQueue() {}
+
+ ElementType* GetNextAddMessage()
+ {
+ // if we are falling behind, bail
+ if (pendingSends_.load() >= QueueSize) {
+ return nullptr;
+ }
+ auto index = (nextAdd_++) % QueueSize;
+ return &queue_[index];
+ }
+ void CommitAdd() { ++pendingSends_; }
+
+ bool HavePendingSends() const { return pendingSends_.load() != 0; }
+ ElementType* GetNextSendMessage()
+ {
+ auto index = (nextSend_++) % QueueSize;
+ return &queue_[index];
+ }
+ void CommitSend() { --pendingSends_; }
+};