28#ifndef HORIZON_CORE_MULTITHREADING_THREADSAFEQUEUE_HPP
29#define HORIZON_CORE_MULTITHREADING_THREADSAFEQUEUE_HPP
42 std::unique_ptr<node>
next;
46 std::unique_ptr<node>
head;
52 std::unique_lock<std::mutex> tail_lock(
tail_mutex);
58 std::unique_lock<std::mutex> head_lock(
head_mutex);
63 std::unique_ptr<node> old_head = std::move(
head);
64 head = std::move(old_head->next);
75 std::size_t qsize =
size();
77 for (std::size_t i = 0; i < qsize; i++)
86 std::unique_ptr<node> old_head =
pop_head();
87 return old_head ? old_head->data : std::shared_ptr<T>();
92 std::shared_ptr<T> new_data(
93 std::make_shared<T>(std::move(new_value)));
94 std::unique_ptr<node> p(
new node);
95 node *new_tail = p.get();
96 std::unique_lock<std::mutex> tail_lock(
tail_mutex);
105 std::unique_lock<std::mutex> head_lock(
head_mutex);
106 std::unique_lock<std::mutex> tail_lock(
tail_mutex);
109 while ((n = n->
next.get())) {
118 std::unique_lock<std::mutex> head_lock(
head_mutex);
128 std::unique_lock<std::mutex> head_lock(
head_mutex);
129 std::shared_ptr<T>
front =
head !=
nullptr ? std::make_shared<T>(*
head->data) :
nullptr;
130 return std::move(
front);
Definition: ThreadSafeQueue.hpp:37
ThreadSafeQueue()
Definition: ThreadSafeQueue.hpp:69
ThreadSafeQueue(const ThreadSafeQueue &other)=delete
std::size_t size()
Definition: ThreadSafeQueue.hpp:102
bool empty()
Definition: ThreadSafeQueue.hpp:116
node * get_tail()
Definition: ThreadSafeQueue.hpp:50
std::mutex tail_mutex
Definition: ThreadSafeQueue.hpp:47
std::unique_ptr< node > pop_head()
Definition: ThreadSafeQueue.hpp:56
std::shared_ptr< T > front()
Definition: ThreadSafeQueue.hpp:126
ThreadSafeQueue & operator=(const ThreadSafeQueue &other)=delete
void push(T &&new_value)
Definition: ThreadSafeQueue.hpp:90
node * tail
Definition: ThreadSafeQueue.hpp:48
~ThreadSafeQueue()
Definition: ThreadSafeQueue.hpp:73
std::mutex head_mutex
Definition: ThreadSafeQueue.hpp:45
std::unique_ptr< node > head
Definition: ThreadSafeQueue.hpp:46
std::shared_ptr< T > try_pop()
Definition: ThreadSafeQueue.hpp:84
size_t count(GridTypeListContainer< SPECIFIC_TYPE > const &elements, SPECIFIC_TYPE *)
Definition: GridReferenceContainer.hpp:100
Definition: ThreadSafeQueue.hpp:40
std::shared_ptr< T > data
Definition: ThreadSafeQueue.hpp:41
std::unique_ptr< node > next
Definition: ThreadSafeQueue.hpp:42