OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs > Class Template Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp>

Inheritance diagram for Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >:
Collaboration diagram for Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >:

Public Member Functions

template<class Fn>
bool consume_one (const BlockingWait &blkw, Fn &&fn)
template<class Fn>
bool consume_one (Fn &&fn)
template<class... TArgs>
void push (TArgs &&...el)
bool empty () const
size_t size () const
void clear ()

Private Attributes

std::queue< T, Container< T, ContainerArgs... > > m_queue
std::mutex m_mutex
std::condition_variable m_cond_var

Detailed Description

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
class Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >

Member Function Documentation

◆ clear()

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
void Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::clear ( )
inline
118 {
120 while (!m_queue.empty())
121 m_queue.pop();
122 }
Definition ThreadSafeQueue.hpp:33
std::queue< T, Container< T, ContainerArgs... > > m_queue
Definition ThreadSafeQueue.hpp:34
std::mutex m_mutex
Definition ThreadSafeQueue.hpp:35

◆ consume_one() [1/2]

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
template<class Fn>
bool Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::consume_one ( const BlockingWait & blkw,
Fn && fn )
inline
41 {
42 static_assert(!std::is_reference_v<T>, "");
43 static_assert(std::is_default_constructible_v<T>, "");
45
46 T el;
47 {
49
50 auto pred = [this]{ return !m_queue.empty(); };
51 if (blkw.timeout_ms > 0) {
52 auto timeout = std::chrono::milliseconds(blkw.timeout_ms);
53 if (!m_cond_var.wait_for(lk, timeout, pred))
54 return false;
55 }
56 else
57 m_cond_var.wait(lk, pred);
58
59 if constexpr (std::is_move_assignable_v<T>)
60 el = std::move(m_queue.front());
61 else
62 el = m_queue.front();
63
64 m_queue.pop();
65
66 if (blkw.pop_flag)
67 // The optional flag is set before the lock us unlocked.
68 blkw.pop_flag->store(true);
69 }
70
71 fn(el);
72 return true;
73 }
std::condition_variable m_cond_var
Definition ThreadSafeQueue.hpp:36

◆ consume_one() [2/2]

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
template<class Fn>
bool Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::consume_one ( Fn && fn)
inline
77 {
78 T el;
79 {
81 if (!m_queue.empty()) {
82 if constexpr (std::is_move_assignable_v<T>)
83 el = std::move(m_queue.front());
84 else
85 el = m_queue.front();
86
87 m_queue.pop();
88 } else
89 return false;
90 }
91
92 fn(el);
93
94 return true;
95 }

◆ empty()

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
bool Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::empty ( ) const
inline
106 {
108 return m_queue.empty();
109 }

◆ push()

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
template<class... TArgs>
void Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::push ( TArgs &&... el)
inline
99 {
101 m_queue.emplace(std::forward<TArgs>(el)...);
102 m_cond_var.notify_one();
103 }

◆ size()

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
size_t Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::size ( ) const
inline
112 {
114 return m_queue.size();
115 }

Member Data Documentation

◆ m_cond_var

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
std::condition_variable Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::m_cond_var
private

◆ m_mutex

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
std::mutex Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::m_mutex
mutableprivate

◆ m_queue

template<class T, template< class, class... > class Container = std::deque, class... ContainerArgs>
std::queue<T, Container<T, ContainerArgs...> > Slic3r::GUI::ThreadSafeQueueSPSC< T, Container, ContainerArgs >::m_queue
private

The documentation for this class was generated from the following file: