diff options
Diffstat (limited to 'boost/lockfree/spsc_queue.hpp')
-rw-r--r-- | boost/lockfree/spsc_queue.hpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/boost/lockfree/spsc_queue.hpp b/boost/lockfree/spsc_queue.hpp index 24790e4988..444e681200 100644 --- a/boost/lockfree/spsc_queue.hpp +++ b/boost/lockfree/spsc_queue.hpp @@ -44,6 +44,7 @@ template <typename T> class ringbuffer_base { #ifndef BOOST_DOXYGEN_INVOKED +protected: typedef std::size_t size_t; static const int padding_size = BOOST_LOCKFREE_CACHELINE_BYTES - sizeof(size_t); atomic<size_t> write_index_; @@ -462,13 +463,13 @@ public: } template <typename Functor> - bool consume_all(Functor & f) + size_type consume_all(Functor & f) { return ringbuffer_base<T>::consume_all(f, data(), max_size); } template <typename Functor> - bool consume_all(Functor const & f) + size_type consume_all(Functor const & f) { return ringbuffer_base<T>::consume_all(f, data(), max_size); } @@ -953,6 +954,24 @@ public: BOOST_ASSERT(read_available() > 0); return base_type::front(); } + + /** reset the ringbuffer + * + * \note Not thread-safe + * */ + void reset(void) + { + if ( !boost::has_trivial_destructor<T>::value ) { + // make sure to call all destructors! + + T dummy_element; + while (pop(dummy_element)) + {} + } else { + base_type::write_index_.store(0, memory_order_relaxed); + base_type::read_index_.store(0, memory_order_release); + } + } }; } /* namespace lockfree */ |