Fix tsan reports. This does mean updating to C++11

This commit is contained in:
Chris Cannam
2021-05-12 11:12:02 +01:00
parent b7770c8832
commit 94d4467bfe
3 changed files with 17 additions and 19 deletions

View File

@@ -27,8 +27,7 @@
#include "StretcherImpl.h" #include "StretcherImpl.h"
#include <set> #include <set>
#include <atomic>
//#define EXPERIMENT 1
namespace RubberBand namespace RubberBand
{ {
@@ -124,11 +123,11 @@ public:
size_t chunkCount; size_t chunkCount;
size_t inCount; size_t inCount;
long inputSize; // set only after known (when data ended); -1 previously std::atomic<int64_t> inputSize; // set only after known (when data ended); -1 previously
size_t outCount; size_t outCount;
bool draining; std::atomic<bool> draining;
bool outputComplete; std::atomic<bool> outputComplete;
FFT *fft; FFT *fft;
std::map<size_t, FFT *> ffts; std::map<size_t, FFT *> ffts;

View File

@@ -674,7 +674,7 @@ RubberBandStretcher::Impl::configure()
Resampler::Parameters params; Resampler::Parameters params;
params.quality = Resampler::FastestTolerable; params.quality = Resampler::FastestTolerable;
params.dynamism = Resampler::RatioOftenChanging; params.dynamism = Resampler::RatioMostlyFixed;
params.ratioChange = Resampler::SmoothRatioChange; params.ratioChange = Resampler::SmoothRatioChange;
params.maxBufferSize = 4096 * 16; params.maxBufferSize = 4096 * 16;
params.debugLevel = m_debugLevel; params.debugLevel = m_debugLevel;
@@ -820,7 +820,7 @@ RubberBandStretcher::Impl::reconfigure()
Resampler::Parameters params; Resampler::Parameters params;
params.quality = Resampler::FastestTolerable; params.quality = Resampler::FastestTolerable;
params.dynamism = Resampler::RatioOftenChanging; params.dynamism = Resampler::RatioMostlyFixed;
params.ratioChange = Resampler::SmoothRatioChange; params.ratioChange = Resampler::SmoothRatioChange;
params.maxBufferSize = m_sWindowSize; params.maxBufferSize = m_sWindowSize;
params.debugLevel = m_debugLevel; params.debugLevel = m_debugLevel;

View File

@@ -33,6 +33,8 @@
#include <iostream> #include <iostream>
#include <atomic>
namespace RubberBand { namespace RubberBand {
/** /**
@@ -174,11 +176,11 @@ public:
int zero(int n); int zero(int n);
protected: protected:
T *const R__ m_buffer; T *const R__ m_buffer;
int m_writer; std::atomic<int> m_writer;
int m_reader; std::atomic<int> m_reader;
const int m_size; const int m_size;
bool m_mlocked; bool m_mlocked;
int readSpaceFor(int w, int r) const { int readSpaceFor(int w, int r) const {
int space; int space;
@@ -244,6 +246,7 @@ RingBuffer<T>::resized(int newSize) const
{ {
RingBuffer<T> *newBuffer = new RingBuffer<T>(newSize); RingBuffer<T> *newBuffer = new RingBuffer<T>(newSize);
MBARRIER();
int w = m_writer; int w = m_writer;
int r = m_reader; int r = m_reader;
@@ -273,7 +276,8 @@ RingBuffer<T>::reset()
std::cerr << "RingBuffer<T>[" << this << "]::reset" << std::endl; std::cerr << "RingBuffer<T>[" << this << "]::reset" << std::endl;
#endif #endif
m_reader = m_writer; int r = m_reader;
m_writer = r;
} }
template <typename T> template <typename T>
@@ -302,7 +306,6 @@ RingBuffer<T>::read(S *const R__ destination, int n)
if (n > available) { if (n > available) {
std::cerr << "WARNING: RingBuffer::read: " << n << " requested, only " std::cerr << "WARNING: RingBuffer::read: " << n << " requested, only "
<< available << " available" << std::endl; << available << " available" << std::endl;
//!!! v_zero(destination + available, n - available);
n = available; n = available;
} }
if (n == 0) return n; if (n == 0) return n;
@@ -320,7 +323,6 @@ RingBuffer<T>::read(S *const R__ destination, int n)
r += n; r += n;
while (r >= m_size) r -= m_size; while (r >= m_size) r -= m_size;
MBARRIER();
m_reader = r; m_reader = r;
return n; return n;
@@ -355,7 +357,6 @@ RingBuffer<T>::readAdding(S *const R__ destination, int n)
r += n; r += n;
while (r >= m_size) r -= m_size; while (r >= m_size) r -= m_size;
MBARRIER();
m_reader = r; m_reader = r;
return n; return n;
@@ -377,7 +378,6 @@ RingBuffer<T>::readOne()
T value = m_buffer[r]; T value = m_buffer[r];
if (++r == m_size) r = 0; if (++r == m_size) r = 0;
MBARRIER();
m_reader = r; m_reader = r;
return value; return value;
@@ -447,7 +447,6 @@ RingBuffer<T>::skip(int n)
r += n; r += n;
while (r >= m_size) r -= m_size; while (r >= m_size) r -= m_size;
// No memory barrier required, because we didn't read any data
m_reader = r; m_reader = r;
return n; return n;