Mercurial > hg > svcore
comparison base/RingBuffer.h @ 574:2d551c765d51
* thread tidying fix, etc
author | Chris Cannam |
---|---|
date | Mon, 16 Mar 2009 13:56:11 +0000 |
parents | 9eb7ef610d7f |
children | 8688430850d6 |
comparison
equal
deleted
inserted
replaced
573:bdc9bb371a9f | 574:2d551c765d51 |
---|---|
158 * Returns the number of zeroes actually written. | 158 * Returns the number of zeroes actually written. |
159 */ | 159 */ |
160 size_t zero(size_t n); | 160 size_t zero(size_t n); |
161 | 161 |
162 protected: | 162 protected: |
163 T *m_buffer; | 163 T *m_buffer; |
164 volatile size_t m_writer; | 164 bool m_mlocked; |
165 volatile size_t m_readers[N]; | 165 size_t m_writer; |
166 size_t m_size; | 166 size_t *m_readers; |
167 bool m_mlocked; | 167 size_t m_size; |
168 | 168 |
169 static Scavenger<ScavengerArrayWrapper<T> > m_scavenger; | 169 static Scavenger<ScavengerArrayWrapper<T> > m_scavenger; |
170 | 170 |
171 private: | 171 private: |
172 RingBuffer(const RingBuffer &); // not provided | 172 RingBuffer(const RingBuffer &); // not provided |
177 Scavenger<ScavengerArrayWrapper<T> > RingBuffer<T, N>::m_scavenger; | 177 Scavenger<ScavengerArrayWrapper<T> > RingBuffer<T, N>::m_scavenger; |
178 | 178 |
179 template <typename T, int N> | 179 template <typename T, int N> |
180 RingBuffer<T, N>::RingBuffer(size_t n) : | 180 RingBuffer<T, N>::RingBuffer(size_t n) : |
181 m_buffer(new T[n + 1]), | 181 m_buffer(new T[n + 1]), |
182 m_mlocked(false), | |
182 m_writer(0), | 183 m_writer(0), |
183 m_size(n + 1), | 184 m_readers(new size_t[N]), |
184 m_mlocked(false) | 185 m_size(n + 1) |
185 { | 186 { |
186 #ifdef DEBUG_RINGBUFFER | 187 #ifdef DEBUG_RINGBUFFER |
187 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::RingBuffer(" << n << ")" << std::endl; | 188 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::RingBuffer(" << n << ")" << std::endl; |
188 #endif | 189 #endif |
189 | 190 |
191 std::cerr << "note: sizeof(RingBuffer<T,N> = " << sizeof(RingBuffer<T,N>) << std::endl; | |
192 | |
190 for (int i = 0; i < N; ++i) m_readers[i] = 0; | 193 for (int i = 0; i < N; ++i) m_readers[i] = 0; |
191 | 194 |
192 m_scavenger.scavenge(); | 195 m_scavenger.scavenge(); |
193 } | 196 } |
194 | 197 |
196 RingBuffer<T, N>::~RingBuffer() | 199 RingBuffer<T, N>::~RingBuffer() |
197 { | 200 { |
198 #ifdef DEBUG_RINGBUFFER | 201 #ifdef DEBUG_RINGBUFFER |
199 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::~RingBuffer" << std::endl; | 202 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::~RingBuffer" << std::endl; |
200 #endif | 203 #endif |
204 | |
205 delete[] m_readers; | |
201 | 206 |
202 if (m_mlocked) { | 207 if (m_mlocked) { |
203 MUNLOCK((void *)m_buffer, m_size * sizeof(T)); | 208 MUNLOCK((void *)m_buffer, m_size * sizeof(T)); |
204 } | 209 } |
205 delete[] m_buffer; | 210 delete[] m_buffer; |