|
- #include <ecs/core/utils/fixed_function.inl>
- #include <ecs/core/utils/thread_pool/task_queue.inl>
-
- using namespace ::ecs::core::utils;
-
- concurrent_task_queue
- ::concurrent_task_queue()
- : _count (0)
- , _inner_queue ()
- { }
-
- void concurrent_task_queue
- ::push(task&& t)
- {
- if (!_inner_queue.enqueue(std::move(t)))
- {
- throw std::overflow_error("task queue is out of memory");
- }
- _count++;
- }
-
- bool concurrent_task_queue
- ::pop(task& t)
- {
- ssize_t old_count = _count.load(std::memory_order_relaxed);
- while (old_count > 0)
- {
- if (_count.compare_exchange_weak(old_count, old_count - 1, std::memory_order_acquire, std::memory_order_relaxed))
- {
- while (!_inner_queue.try_dequeue(t))
- {
- continue;
- }
- return true;
- }
- }
- return false;
- }
|