From 94d4467bfe34f38d646b8a5e05fcbd3ba50c45df Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Wed, 12 May 2021 11:12:02 +0100 Subject: [PATCH] Fix tsan reports. This does mean updating to C++11 --- src/StretcherChannelData.h | 9 ++++----- src/StretcherImpl.cpp | 4 ++-- src/base/RingBuffer.h | 23 +++++++++++------------ 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/StretcherChannelData.h b/src/StretcherChannelData.h index 2147571..aa718e3 100644 --- a/src/StretcherChannelData.h +++ b/src/StretcherChannelData.h @@ -27,8 +27,7 @@ #include "StretcherImpl.h" #include - -//#define EXPERIMENT 1 +#include namespace RubberBand { @@ -124,11 +123,11 @@ public: size_t chunkCount; size_t inCount; - long inputSize; // set only after known (when data ended); -1 previously + std::atomic inputSize; // set only after known (when data ended); -1 previously size_t outCount; - bool draining; - bool outputComplete; + std::atomic draining; + std::atomic outputComplete; FFT *fft; std::map ffts; diff --git a/src/StretcherImpl.cpp b/src/StretcherImpl.cpp index 19813a6..a955299 100644 --- a/src/StretcherImpl.cpp +++ b/src/StretcherImpl.cpp @@ -674,7 +674,7 @@ RubberBandStretcher::Impl::configure() Resampler::Parameters params; params.quality = Resampler::FastestTolerable; - params.dynamism = Resampler::RatioOftenChanging; + params.dynamism = Resampler::RatioMostlyFixed; params.ratioChange = Resampler::SmoothRatioChange; params.maxBufferSize = 4096 * 16; params.debugLevel = m_debugLevel; @@ -820,7 +820,7 @@ RubberBandStretcher::Impl::reconfigure() Resampler::Parameters params; params.quality = Resampler::FastestTolerable; - params.dynamism = Resampler::RatioOftenChanging; + params.dynamism = Resampler::RatioMostlyFixed; params.ratioChange = Resampler::SmoothRatioChange; params.maxBufferSize = m_sWindowSize; params.debugLevel = m_debugLevel; diff --git a/src/base/RingBuffer.h b/src/base/RingBuffer.h index 3586b91..cd9df19 100644 --- a/src/base/RingBuffer.h +++ b/src/base/RingBuffer.h @@ -33,6 +33,8 @@ #include +#include + namespace RubberBand { /** @@ -174,11 +176,11 @@ public: int zero(int n); protected: - T *const R__ m_buffer; - int m_writer; - int m_reader; - const int m_size; - bool m_mlocked; + T *const R__ m_buffer; + std::atomic m_writer; + std::atomic m_reader; + const int m_size; + bool m_mlocked; int readSpaceFor(int w, int r) const { int space; @@ -243,7 +245,8 @@ RingBuffer * RingBuffer::resized(int newSize) const { RingBuffer *newBuffer = new RingBuffer(newSize); - + + MBARRIER(); int w = m_writer; int r = m_reader; @@ -273,7 +276,8 @@ RingBuffer::reset() std::cerr << "RingBuffer[" << this << "]::reset" << std::endl; #endif - m_reader = m_writer; + int r = m_reader; + m_writer = r; } template @@ -302,7 +306,6 @@ RingBuffer::read(S *const R__ destination, int n) if (n > available) { std::cerr << "WARNING: RingBuffer::read: " << n << " requested, only " << available << " available" << std::endl; -//!!! v_zero(destination + available, n - available); n = available; } if (n == 0) return n; @@ -320,7 +323,6 @@ RingBuffer::read(S *const R__ destination, int n) r += n; while (r >= m_size) r -= m_size; - MBARRIER(); m_reader = r; return n; @@ -355,7 +357,6 @@ RingBuffer::readAdding(S *const R__ destination, int n) r += n; while (r >= m_size) r -= m_size; - MBARRIER(); m_reader = r; return n; @@ -377,7 +378,6 @@ RingBuffer::readOne() T value = m_buffer[r]; if (++r == m_size) r = 0; - MBARRIER(); m_reader = r; return value; @@ -447,7 +447,6 @@ RingBuffer::skip(int n) r += n; while (r >= m_size) r -= m_size; - // No memory barrier required, because we didn't read any data m_reader = r; return n;