# HG changeset patch # User Chris Cannam # Date 1237211771 0 # Node ID 2d551c765d5182dd9766db7ddceefee5f1a0fc30 # Parent bdc9bb371a9fe8066473d799219fe554822ecde0 * thread tidying fix, etc diff -r bdc9bb371a9f -r 2d551c765d51 base/RingBuffer.h --- a/base/RingBuffer.h Fri Mar 13 17:53:43 2009 +0000 +++ b/base/RingBuffer.h Mon Mar 16 13:56:11 2009 +0000 @@ -160,11 +160,11 @@ size_t zero(size_t n); protected: - T *m_buffer; - volatile size_t m_writer; - volatile size_t m_readers[N]; - size_t m_size; - bool m_mlocked; + T *m_buffer; + bool m_mlocked; + size_t m_writer; + size_t *m_readers; + size_t m_size; static Scavenger > m_scavenger; @@ -179,14 +179,17 @@ template RingBuffer::RingBuffer(size_t n) : m_buffer(new T[n + 1]), + m_mlocked(false), m_writer(0), - m_size(n + 1), - m_mlocked(false) + m_readers(new size_t[N]), + m_size(n + 1) { #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::RingBuffer(" << n << ")" << std::endl; #endif + std::cerr << "note: sizeof(RingBuffer = " << sizeof(RingBuffer) << std::endl; + for (int i = 0; i < N; ++i) m_readers[i] = 0; m_scavenger.scavenge(); @@ -199,6 +202,8 @@ std::cerr << "RingBuffer[" << this << "]::~RingBuffer" << std::endl; #endif + delete[] m_readers; + if (m_mlocked) { MUNLOCK((void *)m_buffer, m_size * sizeof(T)); } diff -r bdc9bb371a9f -r 2d551c765d51 transform/TransformFactory.cpp --- a/transform/TransformFactory.cpp Fri Mar 13 17:53:43 2009 +0000 +++ b/transform/TransformFactory.cpp Mon Mar 16 13:56:11 2009 +0000 @@ -49,15 +49,30 @@ return m_instance; } +void +TransformFactory::deleteInstance() +{ + std::cerr << "TransformFactory::deleteInstance called" << std::endl; + delete m_instance; + m_instance = 0; +} + TransformFactory::TransformFactory() : m_transformsPopulated(false), m_uninstalledTransformsPopulated(false), - m_thread(0) + m_thread(0), + m_exiting(false) { } TransformFactory::~TransformFactory() { + m_exiting = true; + if (m_thread) { + std::cerr << "TransformFactory::~TransformFactory: waiting on thread" << std::endl; + m_thread->wait(); + delete m_thread; + } } void @@ -694,6 +709,8 @@ m_uninstalledTransforms[tid] = td; } + + if (m_exiting) break; } m_uninstalledTransformsPopulated = true; diff -r bdc9bb371a9f -r 2d551c765d51 transform/TransformFactory.h --- a/transform/TransformFactory.h Fri Mar 13 17:53:43 2009 +0000 +++ b/transform/TransformFactory.h Mon Mar 16 13:56:11 2009 +0000 @@ -39,6 +39,7 @@ virtual ~TransformFactory(); static TransformFactory *getInstance(); + static void deleteInstance(); // only when exiting /** * TransformFactory has a background thread that can populate @@ -224,6 +225,7 @@ }; UninstalledTransformsPopulateThread *m_thread; + bool m_exiting; bool m_populatingSlowly; static TransformFactory *m_instance;