diff options
Diffstat (limited to 'externals/discord-rpc/src/msg_queue.h')
-rw-r--r-- | externals/discord-rpc/src/msg_queue.h | 36 |
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_; } +}; |