summaryrefslogtreecommitdiff
path: root/src/utils/sem_queue.h
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-11-29 23:59:50 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2025-11-29 23:59:50 +0100
commit73f978f1e1e42ec2b7445dd77ec35a58ff08cf20 (patch)
treeecbaa33787212180156e84813473c16b6977b329 /src/utils/sem_queue.h
parent5edbc081d61d47e5938a76fcb201aed4b148f1b4 (diff)
parent1664027209ea3b8eb327b7755e4111577e66a2ee (diff)
merge and use 16 threadsradxa_imx287
Diffstat (limited to 'src/utils/sem_queue.h')
-rw-r--r--src/utils/sem_queue.h35
1 files changed, 35 insertions, 0 deletions
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};
+};