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;