1 #ifndef BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_DEQUE_BASE_HPP
2 #define BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_DEQUE_BASE_HPP
4 //////////////////////////////////////////////////////////////////////////////
6 // (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
7 // Software License, Version 1.0. (See accompanying file
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 // See http://www.boost.org/libs/thread for documentation.
12 //////////////////////////////////////////////////////////////////////////////
14 #include <boost/thread/detail/config.hpp>
15 #include <boost/thread/condition_variable.hpp>
16 #include <boost/thread/detail/move.hpp>
17 #include <boost/thread/mutex.hpp>
18 #include <boost/thread/concurrent_queues/queue_op_status.hpp>
20 #include <boost/chrono/duration.hpp>
21 #include <boost/chrono/time_point.hpp>
22 #include <boost/chrono/system_clocks.hpp>
23 #include <boost/throw_exception.hpp>
25 #include <boost/config/abi_prefix.hpp>
34 template <class ValueType, class Queue>
38 typedef ValueType value_type;
39 typedef Queue underlying_queue_type;
40 typedef typename Queue::size_type size_type;
41 typedef queue_op_status op_status;
43 typedef typename chrono::steady_clock clock;
44 typedef typename clock::duration duration;
45 typedef typename clock::time_point time_point;
47 // Constructors/Assignment/Destructors
48 BOOST_THREAD_NO_COPYABLE(sync_deque_base)
49 inline sync_deque_base();
50 //template <typename Range>
51 //inline explicit sync_deque(Range range);
52 inline ~sync_deque_base();
55 inline bool empty() const;
56 inline bool full() const;
57 inline size_type size() const;
58 inline bool closed() const;
63 inline underlying_queue_type underlying_queue() {
64 lock_guard<mutex> lk(mtx_);
65 return boost::move(data_);
70 condition_variable not_empty_;
71 underlying_queue_type data_;
74 inline bool empty(unique_lock<mutex>& ) const BOOST_NOEXCEPT
78 inline bool empty(lock_guard<mutex>& ) const BOOST_NOEXCEPT
83 inline size_type size(lock_guard<mutex>& ) const BOOST_NOEXCEPT
87 inline bool closed(unique_lock<mutex>& lk) const;
88 inline bool closed(lock_guard<mutex>& lk) const;
90 inline void throw_if_closed(unique_lock<mutex>&);
91 inline void throw_if_closed(lock_guard<mutex>&);
93 inline void wait_until_not_empty(unique_lock<mutex>& lk);
94 inline bool wait_until_not_empty_or_closed(unique_lock<mutex>& lk);
95 inline queue_op_status wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&);
97 inline void notify_not_empty_if_needed(unique_lock<mutex>& )
99 not_empty_.notify_one();
101 inline void notify_not_empty_if_needed(lock_guard<mutex>& )
103 not_empty_.notify_one();
108 template <class ValueType, class Queue>
109 sync_deque_base<ValueType, Queue>::sync_deque_base() :
110 data_(), closed_(false)
112 BOOST_ASSERT(data_.empty());
115 template <class ValueType, class Queue>
116 sync_deque_base<ValueType, Queue>::~sync_deque_base()
120 template <class ValueType, class Queue>
121 void sync_deque_base<ValueType, Queue>::close()
124 lock_guard<mutex> lk(mtx_);
127 not_empty_.notify_all();
130 template <class ValueType, class Queue>
131 bool sync_deque_base<ValueType, Queue>::closed() const
133 lock_guard<mutex> lk(mtx_);
136 template <class ValueType, class Queue>
137 bool sync_deque_base<ValueType, Queue>::closed(unique_lock<mutex>&) const
141 template <class ValueType, class Queue>
142 bool sync_deque_base<ValueType, Queue>::closed(lock_guard<mutex>&) const
147 template <class ValueType, class Queue>
148 bool sync_deque_base<ValueType, Queue>::empty() const
150 lock_guard<mutex> lk(mtx_);
153 template <class ValueType, class Queue>
154 bool sync_deque_base<ValueType, Queue>::full() const
159 template <class ValueType, class Queue>
160 typename sync_deque_base<ValueType, Queue>::size_type sync_deque_base<ValueType, Queue>::size() const
162 lock_guard<mutex> lk(mtx_);
166 template <class ValueType, class Queue>
167 void sync_deque_base<ValueType, Queue>::throw_if_closed(unique_lock<mutex>& lk)
171 BOOST_THROW_EXCEPTION( sync_deque_is_closed() );
174 template <class ValueType, class Queue>
175 void sync_deque_base<ValueType, Queue>::throw_if_closed(lock_guard<mutex>& lk)
179 BOOST_THROW_EXCEPTION( sync_deque_is_closed() );
183 template <class ValueType, class Queue>
184 void sync_deque_base<ValueType, Queue>::wait_until_not_empty(unique_lock<mutex>& lk)
188 if (! empty(lk)) break;
193 template <class ValueType, class Queue>
194 bool sync_deque_base<ValueType, Queue>::wait_until_not_empty_or_closed(unique_lock<mutex>& lk)
198 if (! empty(lk)) break;
199 if (closed(lk)) return true;
205 template <class ValueType, class Queue>
206 queue_op_status sync_deque_base<ValueType, Queue>::wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&tp)
210 if (! empty(lk)) return queue_op_status::success;
212 if (not_empty_.wait_until(lk, tp) == cv_status::timeout ) return queue_op_status::timeout;
221 #include <boost/config/abi_suffix.hpp>