mixxxdj / mixxx

Mixxx is Free DJ software that gives you everything you need to perform live mixes.
http://mixxx.org
Other
4.55k stars 1.29k forks source link

thread sanitizer warning PaUtil_WriteRingBuffer / PaUtil_ReadRingBuffer #13863

Open m0dB opened 3 weeks ago

m0dB commented 3 weeks ago

Bug Description

PaUtil_WriteRingBuffer / PaUtil_ReadRingBuffer

Fixed by replacing PaUtil ring buffer with a custom implrmentation. The PR needs some final polishing.

Details

```cpp ================== WARNING: ThreadSanitizer: data race (pid=48840) Read of size 4 at 0x000112915ef8 by thread T71 (mutexes: write M0, write M1): #0 PaUtil_WriteRingBuffer :230508612 (mixxx:arm64+0x1021108e8) #1 FIFO::write(float const*, int) fifo.h:34 (mixxx:arm64+0x1009dd6dc) #2 EngineSideChain::writeSamples(float const*, int) enginesidechain.cpp:81 (mixxx:arm64+0x1009dd440) #3 EngineMixer::process(int) enginemixer.cpp:757 (mixxx:arm64+0x1009a9740) #4 SoundManager::onDeviceOutputCallback(long) soundmanager.cpp:599 (mixxx:arm64+0x10117ac44) #5 SoundDevicePortAudio::callbackProcessClkRef(long, float*, float const*, PaStreamCallbackTimeInfo const*, unsigned long) sounddeviceportaudio.cpp:998 (mixxx:arm64+0x101172984) #6 (anonymous namespace)::paV19CallbackClkRef(void const*, void*, unsigned long, PaStreamCallbackTimeInfo const*, unsigned long, void*) sounddeviceportaudio.cpp:69 (mixxx:arm64+0x10116fe5c) #7 AdaptingOutputOnlyProcess :230508612 (mixxx:arm64+0x10210fed4) #8 PaUtil_EndBufferProcessing :230508612 (mixxx:arm64+0x10210e09c) #9 AudioIOProc :230508612 (mixxx:arm64+0x1021185a8) #10 :230508612 (CoreAudio:arm64e+0xa8d8) Previous write of size 4 at 0x000112915ef8 by thread T16: #0 PaUtil_ReadRingBuffer :230508612 (mixxx:arm64+0x102110bd0) #1 FIFO::read(float*, int) fifo.h:31 (mixxx:arm64+0x1009d2580) #2 EngineSideChain::run() enginesidechain.cpp:111 (mixxx:arm64+0x1009dd9a8) #3 QThreadPrivate::start(void*) :230508612 (mixxx:arm64+0x100248f60) Location is heap block of size 176 at 0x000112915ea0 allocated by main thread: #0 operator new(unsigned long) :230508612 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x83de0) #1 EngineMixer::EngineMixer(QSharedPointer>, QString const&, EffectsManager*, std::__1::shared_ptr, bool) enginemixer.cpp:168 (mixxx:arm64+0x1009a45bc) #2 EngineMixer::EngineMixer(QSharedPointer>, QString const&, EffectsManager*, std::__1::shared_ptr, bool) enginemixer.cpp:52 (mixxx:arm64+0x1009a0018) #3 EngineMixer* std::__1::construct_at[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, EngineMixer*>(EngineMixer*, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) construct_at.h:38 (mixxx:arm64+0x100647ae0) #4 void std::__1::allocator_traits>::construct[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void, void>(std::__1::allocator&, EngineMixer*, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) allocator_traits.h:304 (mixxx:arm64+0x100647754) #5 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool>(std::__1::allocator, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:284 (mixxx:arm64+0x1006475c0) #6 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool>(std::__1::allocator, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:276 (mixxx:arm64+0x100646fd8) #7 std::__1::shared_ptr std::__1::allocate_shared[abi:v160006], QSharedPointer>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void>(std::__1::allocator const&, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:995 (mixxx:arm64+0x100646dbc) #8 std::__1::shared_ptr std::__1::make_shared[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void>(QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:1004 (mixxx:arm64+0x100638fcc) #9 mixxx::CoreServices::initialize(QApplication*) coreservices.cpp:264 (mixxx:arm64+0x10063735c) #10 (anonymous namespace)::runMixxx(MixxxApplication*, CmdlineArgs const&) main.cpp:87 (mixxx:arm64+0x100010fcc) #11 main main.cpp:243 (mixxx:arm64+0x10000ff08) Mutex M0 (0x000132118e18) created at: #0 pthread_mutex_init :230508612 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x30e30) #1 HALB_Mutex::HALB_Mutex() :230508612 (CoreAudio:arm64e+0x582f70) #2 Pa_Initialize :230508612 (mixxx:arm64+0x10210b61c) #3 SoundManager::queryDevicesPortaudio() soundmanager.cpp:261 (mixxx:arm64+0x101176d00) #4 SoundManager::queryDevices() soundmanager.cpp:239 (mixxx:arm64+0x1011750c4) #5 SoundManager::SoundManager(QSharedPointer>, EngineMixer*) soundmanager.cpp:77 (mixxx:arm64+0x101174b18) #6 SoundManager::SoundManager(QSharedPointer>, EngineMixer*) soundmanager.cpp:59 (mixxx:arm64+0x101175324) #7 SoundManager* std::__1::construct_at[abi:v160006]>&, EngineMixer*, SoundManager*>(SoundManager*, QSharedPointer>&, EngineMixer*&&) construct_at.h:38 (mixxx:arm64+0x100648e68) #8 void std::__1::allocator_traits>::construct[abi:v160006]>&, EngineMixer*, void, void>(std::__1::allocator&, SoundManager*, QSharedPointer>&, EngineMixer*&&) allocator_traits.h:304 (mixxx:arm64+0x100648b48) #9 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, EngineMixer*>(std::__1::allocator, QSharedPointer>&, EngineMixer*&&) shared_ptr.h:284 (mixxx:arm64+0x1006489e4) #10 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, EngineMixer*>(std::__1::allocator, QSharedPointer>&, EngineMixer*&&) shared_ptr.h:276 (mixxx:arm64+0x10064842c) #11 std::__1::shared_ptr std::__1::allocate_shared[abi:v160006], QSharedPointer>&, EngineMixer*, void>(std::__1::allocator const&, QSharedPointer>&, EngineMixer*&&) shared_ptr.h:995 (mixxx:arm64+0x100648240) #12 std::__1::shared_ptr std::__1::make_shared[abi:v160006]>&, EngineMixer*, void>(QSharedPointer>&, EngineMixer*&&) shared_ptr.h:1004 (mixxx:arm64+0x100639118) #13 mixxx::CoreServices::initialize(QApplication*) coreservices.cpp:274 (mixxx:arm64+0x1006373ec) #14 (anonymous namespace)::runMixxx(MixxxApplication*, CmdlineArgs const&) main.cpp:87 (mixxx:arm64+0x100010fcc) #15 main main.cpp:243 (mixxx:arm64+0x10000ff08) Mutex M1 (0x000113b29b60) created at: #0 pthread_mutex_init :230508612 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x30e30) #1 CADeprecated::CAMutex::CAMutex(char const*) :230508612 (libAudioToolboxUtility.dylib:arm64e+0x2920c) #2 OpenStream :230508612 (mixxx:arm64+0x102115abc) #3 Pa_OpenStream :230508612 (mixxx:arm64+0x10210c704) #4 SoundDevicePortAudio::open(bool, int) sounddeviceportaudio.cpp:338 (mixxx:arm64+0x10116f380) #5 SoundManager::setupDevices() soundmanager.cpp:475 (mixxx:arm64+0x101178660) #6 MixxxMainWindow::initialize() mixxxmainwindow.cpp:346 (mixxx:arm64+0x100f321e4) #7 QtPrivate::FunctorCall, QtPrivate::List<>, void, void (MixxxMainWindow::*)()>::call(void (MixxxMainWindow::*)(), MixxxMainWindow*, void**) qobjectdefs_impl.h:137 (mixxx:arm64+0x100f46a14) #8 void QtPrivate::FunctionPointer::call, void>(void (MixxxMainWindow::*)(), MixxxMainWindow*, void**) qobjectdefs_impl.h:174 (mixxx:arm64+0x100f468e0) #9 QtPrivate::QSlotObject, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) qobjectdefs_impl.h:432 (mixxx:arm64+0x100f46744) #10 void doActivate(QObject*, int, void**) :230508612 (mixxx:arm64+0x10011ef08) #11 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) :230508612 (mixxx:arm64+0x10011db88) #12 WInitialGLWidget::onInitialized() moc_winitialglwidget.cpp:160 (mixxx:arm64+0x1015c2d78) #13 WInitialGLWidget::initializeGL() winitialglwidget.cpp:17 (mixxx:arm64+0x1015c3294) #14 OpenGLWindow::initializeGL() openglwindow.cpp:31 (mixxx:arm64+0x1015c00b8) #15 QOpenGLWindowPrivate::initialize() :230508612 (mixxx:arm64+0x1044fcd88) #16 QOpenGLWindow::resizeEvent(QResizeEvent*) :230508612 (mixxx:arm64+0x1044fdd78) #17 QWindow::event(QEvent*) :230508612 (mixxx:arm64+0x104cdbd1c) #18 QPaintDeviceWindow::event(QEvent*) :230508612 (mixxx:arm64+0x104ca4814) #19 OpenGLWindow::event(QEvent*) openglwindow.cpp:70 (mixxx:arm64+0x1015c03fc) #20 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #21 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fc184) #22 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #23 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #24 QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4f08) #25 QGuiApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent*) :230508612 (mixxx:arm64+0x104c8a1b4) #26 QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) :230508612 (mixxx:arm64+0x104c86310) #27 QWindowSystemInterface::sendWindowSystemEvents(QFlags) :230508612 (mixxx:arm64+0x104ce3884) #28 QWindowSystemInterface::flushWindowSystemEvents(QFlags) :230508612 (mixxx:arm64+0x104ce3304) #29 QCocoaWindow::handleGeometryChange() :230508612 (mixxx:arm64+0x101c7da5c) #30 QWindow::show() :230508612 (mixxx:arm64+0x104cd2c24) #31 QWindowContainer::event(QEvent*) :230508612 (mixxx:arm64+0x102299710) #32 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #33 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fd364) #34 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #35 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #36 QCoreApplication::sendEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4ea8) #37 QWidgetPrivate::show_helper() :230508612 (mixxx:arm64+0x1022741b0) #38 QWidgetPrivate::setVisible(bool) :230508612 (mixxx:arm64+0x102275c10) #39 QWidget::setVisible(bool) :230508612 (mixxx:arm64+0x1022753f0) #40 QWidget::show() :230508612 (mixxx:arm64+0x102273fc8) #41 WGLWidget::showEvent(QShowEvent*) wglwidgetqopengl.cpp:44 (mixxx:arm64+0x1015c2698) #42 QWidget::event(QEvent*) :230508612 (mixxx:arm64+0x102276240) #43 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #44 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fd364) #45 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #46 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #47 QCoreApplication::sendEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4ea8) #48 QWidgetPrivate::show_helper() :230508612 (mixxx:arm64+0x1022741b0) #49 QWidgetPrivate::setVisible(bool) :230508612 (mixxx:arm64+0x102275c10) #50 QWidget::setVisible(bool) :230508612 (mixxx:arm64+0x1022753f0) #51 QWidget::show() :230508612 (mixxx:arm64+0x102273fc8) #52 MixxxMainWindow::initializeQOpenGL() mixxxmainwindow.cpp:161 (mixxx:arm64+0x100f30e64) #53 (anonymous namespace)::runMixxx(MixxxApplication*, CmdlineArgs const&) main.cpp:92 (mixxx:arm64+0x100010fd8) #54 main main.cpp:243 (mixxx:arm64+0x10000ff08) Thread T71 (tid=8891322, running) created by main thread at: #0 pthread_create :230508612 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2ffec) #1 HALB_IOThread::DispatchPThread(void* (*)(void*), void*) :230508612 (CoreAudio:arm64e+0x332910) #2 Pa_StartStream :230508612 (mixxx:arm64+0x10210c97c) #3 SoundDevicePortAudio::open(bool, int) sounddeviceportaudio.cpp:363 (mixxx:arm64+0x10116f51c) #4 SoundManager::setupDevices() soundmanager.cpp:475 (mixxx:arm64+0x101178660) #5 MixxxMainWindow::initialize() mixxxmainwindow.cpp:346 (mixxx:arm64+0x100f321e4) #6 QtPrivate::FunctorCall, QtPrivate::List<>, void, void (MixxxMainWindow::*)()>::call(void (MixxxMainWindow::*)(), MixxxMainWindow*, void**) qobjectdefs_impl.h:137 (mixxx:arm64+0x100f46a14) #7 void QtPrivate::FunctionPointer::call, void>(void (MixxxMainWindow::*)(), MixxxMainWindow*, void**) qobjectdefs_impl.h:174 (mixxx:arm64+0x100f468e0) #8 QtPrivate::QSlotObject, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) qobjectdefs_impl.h:432 (mixxx:arm64+0x100f46744) #9 void doActivate(QObject*, int, void**) :230508612 (mixxx:arm64+0x10011ef08) #10 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) :230508612 (mixxx:arm64+0x10011db88) #11 WInitialGLWidget::onInitialized() moc_winitialglwidget.cpp:160 (mixxx:arm64+0x1015c2d78) #12 WInitialGLWidget::initializeGL() winitialglwidget.cpp:17 (mixxx:arm64+0x1015c3294) #13 OpenGLWindow::initializeGL() openglwindow.cpp:31 (mixxx:arm64+0x1015c00b8) #14 QOpenGLWindowPrivate::initialize() :230508612 (mixxx:arm64+0x1044fcd88) #15 QOpenGLWindow::resizeEvent(QResizeEvent*) :230508612 (mixxx:arm64+0x1044fdd78) #16 QWindow::event(QEvent*) :230508612 (mixxx:arm64+0x104cdbd1c) #17 QPaintDeviceWindow::event(QEvent*) :230508612 (mixxx:arm64+0x104ca4814) #18 OpenGLWindow::event(QEvent*) openglwindow.cpp:70 (mixxx:arm64+0x1015c03fc) #19 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #20 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fc184) #21 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #22 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #23 QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4f08) #24 QGuiApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent*) :230508612 (mixxx:arm64+0x104c8a1b4) #25 QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) :230508612 (mixxx:arm64+0x104c86310) #26 QWindowSystemInterface::sendWindowSystemEvents(QFlags) :230508612 (mixxx:arm64+0x104ce3884) #27 QWindowSystemInterface::flushWindowSystemEvents(QFlags) :230508612 (mixxx:arm64+0x104ce3304) #28 QCocoaWindow::handleGeometryChange() :230508612 (mixxx:arm64+0x101c7da5c) #29 QWindow::show() :230508612 (mixxx:arm64+0x104cd2c24) #30 QWindowContainer::event(QEvent*) :230508612 (mixxx:arm64+0x102299710) #31 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #32 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fd364) #33 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #34 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #35 QCoreApplication::sendEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4ea8) #36 QWidgetPrivate::show_helper() :230508612 (mixxx:arm64+0x1022741b0) #37 QWidgetPrivate::setVisible(bool) :230508612 (mixxx:arm64+0x102275c10) #38 QWidget::setVisible(bool) :230508612 (mixxx:arm64+0x1022753f0) #39 QWidget::show() :230508612 (mixxx:arm64+0x102273fc8) #40 WGLWidget::showEvent(QShowEvent*) wglwidgetqopengl.cpp:44 (mixxx:arm64+0x1015c2698) #41 QWidget::event(QEvent*) :230508612 (mixxx:arm64+0x102276240) #42 QApplicationPrivate::notify_helper(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fabdc) #43 QApplication::notify(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1021fd364) #44 MixxxApplication::notify(QObject*, QEvent*) mixxxapplication.cpp:200 (mixxx:arm64+0x100ef48dc) #45 QCoreApplication::notifyInternal2(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b3dec) #46 QCoreApplication::sendEvent(QObject*, QEvent*) :230508612 (mixxx:arm64+0x1000b4ea8) #47 QWidgetPrivate::show_helper() :230508612 (mixxx:arm64+0x1022741b0) #48 QWidgetPrivate::setVisible(bool) :230508612 (mixxx:arm64+0x102275c10) #49 QWidget::setVisible(bool) :230508612 (mixxx:arm64+0x1022753f0) #50 QWidget::show() :230508612 (mixxx:arm64+0x102273fc8) #51 MixxxMainWindow::initializeQOpenGL() mixxxmainwindow.cpp:161 (mixxx:arm64+0x100f30e64) #52 (anonymous namespace)::runMixxx(MixxxApplication*, CmdlineArgs const&) main.cpp:92 (mixxx:arm64+0x100010fd8) #53 main main.cpp:243 (mixxx:arm64+0x10000ff08) Thread T16 (tid=8890871, running) created by main thread at: #0 pthread_create :230508612 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2ffec) #1 QThread::start(QThread::Priority) :230508612 (mixxx:arm64+0x100249b9c) #2 EngineSideChain::EngineSideChain(QSharedPointer>, float*) enginesidechain.cpp:37 (mixxx:arm64+0x1009dc904) #3 EngineSideChain::EngineSideChain(QSharedPointer>, float*) enginesidechain.cpp:30 (mixxx:arm64+0x1009dcb38) #4 EngineMixer::EngineMixer(QSharedPointer>, QString const&, EffectsManager*, std::__1::shared_ptr, bool) enginemixer.cpp:168 (mixxx:arm64+0x1009a4630) #5 EngineMixer::EngineMixer(QSharedPointer>, QString const&, EffectsManager*, std::__1::shared_ptr, bool) enginemixer.cpp:52 (mixxx:arm64+0x1009a0018) #6 EngineMixer* std::__1::construct_at[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, EngineMixer*>(EngineMixer*, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) construct_at.h:38 (mixxx:arm64+0x100647ae0) #7 void std::__1::allocator_traits>::construct[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void, void>(std::__1::allocator&, EngineMixer*, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) allocator_traits.h:304 (mixxx:arm64+0x100647754) #8 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool>(std::__1::allocator, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:284 (mixxx:arm64+0x1006475c0) #9 std::__1::__shared_ptr_emplace>::__shared_ptr_emplace[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool>(std::__1::allocator, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:276 (mixxx:arm64+0x100646fd8) #10 std::__1::shared_ptr std::__1::allocate_shared[abi:v160006], QSharedPointer>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void>(std::__1::allocator const&, QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:995 (mixxx:arm64+0x100646dbc) #11 std::__1::shared_ptr std::__1::make_shared[abi:v160006]>&, char const (&) [9], EffectsManager*, std::__1::shared_ptr&, bool, void>(QSharedPointer>&, char const (&) [9], EffectsManager*&&, std::__1::shared_ptr&, bool&&) shared_ptr.h:1004 (mixxx:arm64+0x100638fcc) #12 mixxx::CoreServices::initialize(QApplication*) coreservices.cpp:264 (mixxx:arm64+0x10063735c) #13 (anonymous namespace)::runMixxx(MixxxApplication*, CmdlineArgs const&) main.cpp:87 (mixxx:arm64+0x100010fcc) #14 main main.cpp:243 (mixxx:arm64+0x10000ff08) SUMMARY: ThreadSanitizer: data race (mixxx:arm64+0x1021108e8) in PaUtil_WriteRingBuffer+0x54 ```

Version

2.5

OS

No response

daschuer commented 3 weeks ago

These findings are probably false positive, because TSAN does not understand PaUtil_FullMemoryBarrier(). However it is possible to anotate the code with __tsan_acquire, __tsan_release and firends to make it work.

Do you have interest to try it out? If it turns out that these are real issues. Mixxx will suffer them via Portausdio as well.