summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-11-29 18:49:35 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2025-11-29 18:49:35 +0100
commitc657073f8ebe84505613b593db4a41f30f86c970 (patch)
tree2774796d44ae38852fbbea9af0cdb82899c806d0 /src/utils
parentfe1a89dbd83e10bfb480962a511fa0f43885eb77 (diff)
introduce sem_queue
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/sem_queue.cpp1
-rw-r--r--src/utils/sem_queue.h35
2 files changed, 36 insertions, 0 deletions
diff --git a/src/utils/sem_queue.cpp b/src/utils/sem_queue.cpp
new file mode 100644
index 0000000..a3ca6e6
--- /dev/null
+++ b/src/utils/sem_queue.cpp
@@ -0,0 +1 @@
+#include "sem_queue.h"
diff --git a/src/utils/sem_queue.h b/src/utils/sem_queue.h
new file mode 100644
index 0000000..6987d88
--- /dev/null
+++ b/src/utils/sem_queue.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <mutex>
+#include <queue>
+#include <semaphore>
+
+template<typename T, size_t S>
+class sem_queue
+{
+public:
+ inline void enqueue(const T &value)
+ {
+ m_free.acquire();
+ std::lock_guard l{m_mtx};
+ m_queue.push(value);
+ m_used.release();
+ }
+
+ inline T dequeue()
+ {
+ m_used.acquire();
+ std::lock_guard l{m_mtx};
+ const auto result = m_queue.front();
+ m_queue.pop();
+ m_free.release();
+
+ return result;
+ }
+
+private:
+ std::queue<T> m_queue;
+ std::mutex m_mtx;
+ std::counting_semaphore<S> m_free{S};
+ std::counting_semaphore<S> m_used{0};
+};