Fix tsan reports. This does mean updating to C++11
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -243,7 +245,8 @@ RingBuffer<T> *
|
|||||||
RingBuffer<T>::resized(int newSize) const
|
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user