Tracktion / pluginval

Cross platform plugin testing and validation tool

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

thread sanitizer reports pluginval race condition when pressing Test Selected

jcooper-korg opened this issue · comments

intel, debug build, Xcode 13.1, Big Sur 11.6, juce 6.1.0, with thread sanitizer enabled.

this shows in the log every time for me, when clicking Test Selected on a VST3 plugin like the JUCE NoiseGateTutorial:

WARNING: ThreadSanitizer: data race (pid=36004)
  Write of size 4 at 0x7b08000296f4 by thread T12:
    #0 juce::NamedPipe::Pimpl::openPipe(bool, unsigned int) juce_posix_NamedPipe.cpp:166 (pluginval:x86_64+0x100695a8b)
    #1 juce::NamedPipe::Pimpl::write(char const*, int, int) juce_posix_NamedPipe.cpp:90 (pluginval:x86_64+0x10062b3b0)
    #2 juce::NamedPipe::write(void const*, int, int) juce_posix_NamedPipe.cpp:243 (pluginval:x86_64+0x10062b2e4)
    #3 juce::InterprocessConnection::writeData(void*, int) juce_InterprocessConnection.cpp:220 (pluginval:x86_64+0x1007249ec)
    #4 juce::InterprocessConnection::sendMessage(juce::MemoryBlock const&) juce_InterprocessConnection.cpp:209 (pluginval:x86_64+0x1007247fa)
    #5 juce::ChildProcessMaster::sendMessageToSlave(juce::MemoryBlock const&) juce_ConnectedChildProcess.cpp:135 (pluginval:x86_64+0x100726373)
    #6 juce::ChildProcessMaster::Connection::sendPingMessage(juce::MemoryBlock const&) juce_ConnectedChildProcess.cpp:106 (pluginval:x86_64+0x100737d70)
    #7 non-virtual thunk to juce::ChildProcessMaster::Connection::sendPingMessage(juce::MemoryBlock const&) juce_ConnectedChildProcess.cpp (pluginval:x86_64+0x10073804c)
    #8 juce::ChildProcessPingThread::run() juce_ConnectedChildProcess.cpp:71 (pluginval:x86_64+0x100737f2f)
    #9 juce::Thread::threadEntryPoint() juce_Thread.cpp:96 (pluginval:x86_64+0x1005dfda2)
    #10 juce::juce_threadEntryPoint(void*) juce_Thread.cpp:118 (pluginval:x86_64+0x1005e0425)
    #11 juce::threadEntryProc(void*) juce_posix_SharedCode.h:851 (pluginval:x86_64+0x10062a459)

  Previous write of size 4 at 0x7b08000296f4 by main thread:
    #0 juce::NamedPipe::Pimpl::openPipe(bool, unsigned int) juce_posix_NamedPipe.cpp:166 (pluginval:x86_64+0x100695a8b)
    #1 juce::NamedPipe::Pimpl::write(char const*, int, int) juce_posix_NamedPipe.cpp:90 (pluginval:x86_64+0x10062b3b0)
    #2 juce::NamedPipe::write(void const*, int, int) juce_posix_NamedPipe.cpp:243 (pluginval:x86_64+0x10062b2e4)
    #3 juce::InterprocessConnection::writeData(void*, int) juce_InterprocessConnection.cpp:220 (pluginval:x86_64+0x1007249ec)
    #4 juce::InterprocessConnection::sendMessage(juce::MemoryBlock const&) juce_InterprocessConnection.cpp:209 (pluginval:x86_64+0x1007247fa)
    #5 juce::ChildProcessMaster::sendMessageToSlave(juce::MemoryBlock const&) juce_ConnectedChildProcess.cpp:135 (pluginval:x86_64+0x100726373)
    #6 juce::ChildProcessMaster::launchSlaveProcess(juce::File const&, juce::String const&, int, int) juce_ConnectedChildProcess.cpp:160 (pluginval:x86_64+0x1007267c6)
    #7 ValidatorParentProcess::launch() Validator.cpp:587 (pluginval:x86_64+0x1000c5498)
    #8 Validator::ensureConnection() Validator.cpp:764 (pluginval:x86_64+0x1000c3caa)
    #9 Validator::validate(juce::Array<juce::PluginDescription, juce::DummyCriticalSection, 0> const&, PluginTests::Options) Validator.cpp:724 (pluginval:x86_64+0x1000c44b1)
    #10 MainComponent::MainComponent(Validator&)::$_4::operator()() const MainComponent.cpp:233 (pluginval:x86_64+0x100046829)
    #11 decltype(std::__1::forward<MainComponent::MainComponent(Validator&)::$_4&>(fp)()) std::__1::__invoke<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) type_traits:3694 (pluginval:x86_64+0x1000465ad)
    #12 void std::__1::__invoke_void_return_wrapper<void, true>::__call<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) __functional_base:348 (pluginval:x86_64+0x10004651d)
    #13 std::__1::__function::__alloc_func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1558 (pluginval:x86_64+0x1000464cd)
    #14 std::__1::__function::__func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1732 (pluginval:x86_64+0x100044119)
    #15 std::__1::__function::__value_func<void ()>::operator()() const functional:1885 (pluginval:x86_64+0x1000e17e3)
    #16 std::__1::function<void ()>::operator()() const functional:2560 (pluginval:x86_64+0x1000e15c5)
    #17 juce::Button::sendClickMessage(juce::ModifierKeys const&) juce_Button.cpp:414 (pluginval:x86_64+0x100978471)
    #18 juce::Button::internalClickCallback(juce::ModifierKeys const&) juce_Button.cpp:357 (pluginval:x86_64+0x100979152)
    #19 juce::Button::mouseUp(juce::MouseEvent const&) juce_Button.cpp:479 (pluginval:x86_64+0x100979df8)
    #20 juce::Component::internalMouseUp(juce::MouseInputSource, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, float, float, float) juce_Component.cpp:2491 (pluginval:x86_64+0x10095b1ab)
    #21 juce::MouseInputSourceInternal::sendMouseUp(juce::Component&, juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:153 (pluginval:x86_64+0x100abf73a)
    #22 juce::MouseInputSourceInternal::setButtons(juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:195 (pluginval:x86_64+0x100abdeb1)
    #23 juce::MouseInputSourceInternal::handleEvent(juce::ComponentPeer&, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, juce::PenDetails) juce_MouseInputSource.cpp:332 (pluginval:x86_64+0x100963d70)
    #24 juce::MouseInputSource::handleEvent(juce::ComponentPeer&, juce::Point<float>, long long, juce::ModifierKeys, float, float, juce::PenDetails const&) juce_MouseInputSource.cpp:632 (pluginval:x86_64+0x10096384e)
    #25 juce::ComponentPeer::handleMouseEvent(juce::MouseInputSource::InputSourceType, juce::Point<float>, juce::ModifierKeys, float, float, long long, juce::PenDetails, int) juce_ComponentPeer.cpp:87 (pluginval:x86_64+0x100a87013)
    #26 juce::NSViewComponentPeer::sendMouseEvent(NSEvent*) juce_mac_NSViewComponentPeer.mm:752 (pluginval:x86_64+0x100bd3dfd)
    #27 juce::NSViewComponentPeer::redirectMouseUp(NSEvent*) juce_mac_NSViewComponentPeer.mm:610 (pluginval:x86_64+0x100bd9231)
    #28 juce::JuceNSViewClass::asyncMouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1841 (pluginval:x86_64+0x100bd179c)
    #29 juce::JuceNSViewClass::mouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1827 (pluginval:x86_64+0x100bcd4f7)
    #30 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] <null>:2 (AppKit:x86_64+0x1c96c4)
    #31 juce::JUCEApplicationBase::main() juce_ApplicationBase.cpp:262 (pluginval:x86_64+0x10071bdf6)
    #32 juce::JUCEApplicationBase::main(int, char const**) juce_ApplicationBase.cpp:240 (pluginval:x86_64+0x10071bb72)
    #33 main Main.cpp:185 (pluginval:x86_64+0x1000280c6)

  Location is heap block of size 32 at 0x7b08000296e0 allocated by main thread:
    #0 malloc <null>:3 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x51dfa)
    #1 operator new(unsigned long) TestUtilities.cpp:76 (pluginval:x86_64+0x1000b265a)
    #2 juce::NamedPipe::openInternal(juce::String const&, bool, bool) juce_posix_NamedPipe.cpp:216 (pluginval:x86_64+0x1005bacf2)
    #3 juce::NamedPipe::createNewPipe(juce::String const&, bool) juce_NamedPipe.cpp:56 (pluginval:x86_64+0x1005bb073)
    #4 juce::InterprocessConnection::createPipe(juce::String const&, int, bool) juce_InterprocessConnection.cpp:137 (pluginval:x86_64+0x100723d36)
    #5 juce::ChildProcessMaster::Connection::Connection(juce::ChildProcessMaster&, juce::String const&, int) juce_ConnectedChildProcess.cpp:93 (pluginval:x86_64+0x100737788)
    #6 juce::ChildProcessMaster::Connection::Connection(juce::ChildProcessMaster&, juce::String const&, int) juce_ConnectedChildProcess.cpp:92 (pluginval:x86_64+0x100726c31)
    #7 juce::ChildProcessMaster::launchSlaveProcess(juce::File const&, juce::String const&, int, int) juce_ConnectedChildProcess.cpp:156 (pluginval:x86_64+0x10072673a)
    #8 ValidatorParentProcess::launch() Validator.cpp:587 (pluginval:x86_64+0x1000c5498)
    #9 Validator::ensureConnection() Validator.cpp:764 (pluginval:x86_64+0x1000c3caa)
    #10 Validator::validate(juce::Array<juce::PluginDescription, juce::DummyCriticalSection, 0> const&, PluginTests::Options) Validator.cpp:724 (pluginval:x86_64+0x1000c44b1)
    #11 MainComponent::MainComponent(Validator&)::$_4::operator()() const MainComponent.cpp:233 (pluginval:x86_64+0x100046829)
    #12 decltype(std::__1::forward<MainComponent::MainComponent(Validator&)::$_4&>(fp)()) std::__1::__invoke<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) type_traits:3694 (pluginval:x86_64+0x1000465ad)
    #13 void std::__1::__invoke_void_return_wrapper<void, true>::__call<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) __functional_base:348 (pluginval:x86_64+0x10004651d)
    #14 std::__1::__function::__alloc_func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1558 (pluginval:x86_64+0x1000464cd)
    #15 std::__1::__function::__func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1732 (pluginval:x86_64+0x100044119)
    #16 std::__1::__function::__value_func<void ()>::operator()() const functional:1885 (pluginval:x86_64+0x1000e17e3)
    #17 std::__1::function<void ()>::operator()() const functional:2560 (pluginval:x86_64+0x1000e15c5)
    #18 juce::Button::sendClickMessage(juce::ModifierKeys const&) juce_Button.cpp:414 (pluginval:x86_64+0x100978471)
    #19 juce::Button::internalClickCallback(juce::ModifierKeys const&) juce_Button.cpp:357 (pluginval:x86_64+0x100979152)
    #20 juce::Button::mouseUp(juce::MouseEvent const&) juce_Button.cpp:479 (pluginval:x86_64+0x100979df8)
    #21 juce::Component::internalMouseUp(juce::MouseInputSource, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, float, float, float) juce_Component.cpp:2491 (pluginval:x86_64+0x10095b1ab)
    #22 juce::MouseInputSourceInternal::sendMouseUp(juce::Component&, juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:153 (pluginval:x86_64+0x100abf73a)
    #23 juce::MouseInputSourceInternal::setButtons(juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:195 (pluginval:x86_64+0x100abdeb1)
    #24 juce::MouseInputSourceInternal::handleEvent(juce::ComponentPeer&, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, juce::PenDetails) juce_MouseInputSource.cpp:332 (pluginval:x86_64+0x100963d70)
    #25 juce::MouseInputSource::handleEvent(juce::ComponentPeer&, juce::Point<float>, long long, juce::ModifierKeys, float, float, juce::PenDetails const&) juce_MouseInputSource.cpp:632 (pluginval:x86_64+0x10096384e)
    #26 juce::ComponentPeer::handleMouseEvent(juce::MouseInputSource::InputSourceType, juce::Point<float>, juce::ModifierKeys, float, float, long long, juce::PenDetails, int) juce_ComponentPeer.cpp:87 (pluginval:x86_64+0x100a87013)
    #27 juce::NSViewComponentPeer::sendMouseEvent(NSEvent*) juce_mac_NSViewComponentPeer.mm:752 (pluginval:x86_64+0x100bd3dfd)
    #28 juce::NSViewComponentPeer::redirectMouseUp(NSEvent*) juce_mac_NSViewComponentPeer.mm:610 (pluginval:x86_64+0x100bd9231)
    #29 juce::JuceNSViewClass::asyncMouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1841 (pluginval:x86_64+0x100bd179c)
    #30 juce::JuceNSViewClass::mouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1827 (pluginval:x86_64+0x100bcd4f7)
    #31 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] <null>:2 (AppKit:x86_64+0x1c96c4)
    #32 juce::JUCEApplicationBase::main() juce_ApplicationBase.cpp:262 (pluginval:x86_64+0x10071bdf6)
    #33 juce::JUCEApplicationBase::main(int, char const**) juce_ApplicationBase.cpp:240 (pluginval:x86_64+0x10071bb72)
    #34 main Main.cpp:185 (pluginval:x86_64+0x1000280c6)

  Thread T12 (tid=1072664, running) created by main thread at:
    #0 pthread_create <null>:3 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2ca8d)
    #1 juce::Thread::launchThread() juce_posix_SharedCode.h:905 (pluginval:x86_64+0x1005e0620)
    #2 juce::Thread::startThread() juce_Thread.cpp:130 (pluginval:x86_64+0x1005e04b3)
    #3 juce::Thread::startThread(int) juce_Thread.cpp:147 (pluginval:x86_64+0x1005e0965)
    #4 juce::ChildProcessMaster::Connection::Connection(juce::ChildProcessMaster&, juce::String const&, int) juce_ConnectedChildProcess.cpp:94 (pluginval:x86_64+0x1007377b7)
    #5 juce::ChildProcessMaster::Connection::Connection(juce::ChildProcessMaster&, juce::String const&, int) juce_ConnectedChildProcess.cpp:92 (pluginval:x86_64+0x100726c31)
    #6 juce::ChildProcessMaster::launchSlaveProcess(juce::File const&, juce::String const&, int, int) juce_ConnectedChildProcess.cpp:156 (pluginval:x86_64+0x10072673a)
    #7 ValidatorParentProcess::launch() Validator.cpp:587 (pluginval:x86_64+0x1000c5498)
    #8 Validator::ensureConnection() Validator.cpp:764 (pluginval:x86_64+0x1000c3caa)
    #9 Validator::validate(juce::Array<juce::PluginDescription, juce::DummyCriticalSection, 0> const&, PluginTests::Options) Validator.cpp:724 (pluginval:x86_64+0x1000c44b1)
    #10 MainComponent::MainComponent(Validator&)::$_4::operator()() const MainComponent.cpp:233 (pluginval:x86_64+0x100046829)
    #11 decltype(std::__1::forward<MainComponent::MainComponent(Validator&)::$_4&>(fp)()) std::__1::__invoke<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) type_traits:3694 (pluginval:x86_64+0x1000465ad)
    #12 void std::__1::__invoke_void_return_wrapper<void, true>::__call<MainComponent::MainComponent(Validator&)::$_4&>(MainComponent::MainComponent(Validator&)::$_4&) __functional_base:348 (pluginval:x86_64+0x10004651d)
    #13 std::__1::__function::__alloc_func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1558 (pluginval:x86_64+0x1000464cd)
    #14 std::__1::__function::__func<MainComponent::MainComponent(Validator&)::$_4, std::__1::allocator<MainComponent::MainComponent(Validator&)::$_4>, void ()>::operator()() functional:1732 (pluginval:x86_64+0x100044119)
    #15 std::__1::__function::__value_func<void ()>::operator()() const functional:1885 (pluginval:x86_64+0x1000e17e3)
    #16 std::__1::function<void ()>::operator()() const functional:2560 (pluginval:x86_64+0x1000e15c5)
    #17 juce::Button::sendClickMessage(juce::ModifierKeys const&) juce_Button.cpp:414 (pluginval:x86_64+0x100978471)
    #18 juce::Button::internalClickCallback(juce::ModifierKeys const&) juce_Button.cpp:357 (pluginval:x86_64+0x100979152)
    #19 juce::Button::mouseUp(juce::MouseEvent const&) juce_Button.cpp:479 (pluginval:x86_64+0x100979df8)
    #20 juce::Component::internalMouseUp(juce::MouseInputSource, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, float, float, float) juce_Component.cpp:2491 (pluginval:x86_64+0x10095b1ab)
    #21 juce::MouseInputSourceInternal::sendMouseUp(juce::Component&, juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:153 (pluginval:x86_64+0x100abf73a)
    #22 juce::MouseInputSourceInternal::setButtons(juce::Point<float>, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:195 (pluginval:x86_64+0x100abdeb1)
    #23 juce::MouseInputSourceInternal::handleEvent(juce::ComponentPeer&, juce::Point<float>, juce::Time, juce::ModifierKeys, float, float, juce::PenDetails) juce_MouseInputSource.cpp:332 (pluginval:x86_64+0x100963d70)
    #24 juce::MouseInputSource::handleEvent(juce::ComponentPeer&, juce::Point<float>, long long, juce::ModifierKeys, float, float, juce::PenDetails const&) juce_MouseInputSource.cpp:632 (pluginval:x86_64+0x10096384e)
    #25 juce::ComponentPeer::handleMouseEvent(juce::MouseInputSource::InputSourceType, juce::Point<float>, juce::ModifierKeys, float, float, long long, juce::PenDetails, int) juce_ComponentPeer.cpp:87 (pluginval:x86_64+0x100a87013)
    #26 juce::NSViewComponentPeer::sendMouseEvent(NSEvent*) juce_mac_NSViewComponentPeer.mm:752 (pluginval:x86_64+0x100bd3dfd)
    #27 juce::NSViewComponentPeer::redirectMouseUp(NSEvent*) juce_mac_NSViewComponentPeer.mm:610 (pluginval:x86_64+0x100bd9231)
    #28 juce::JuceNSViewClass::asyncMouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1841 (pluginval:x86_64+0x100bd179c)
    #29 juce::JuceNSViewClass::mouseUp(objc_object*, objc_selector*, NSEvent*) juce_mac_NSViewComponentPeer.mm:1827 (pluginval:x86_64+0x100bcd4f7)
    #30 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] <null>:2 (AppKit:x86_64+0x1c96c4)
    #31 juce::JUCEApplicationBase::main() juce_ApplicationBase.cpp:262 (pluginval:x86_64+0x10071bdf6)
    #32 juce::JUCEApplicationBase::main(int, char const**) juce_ApplicationBase.cpp:240 (pluginval:x86_64+0x10071bb72)
    #33 main Main.cpp:185 (pluginval:x86_64+0x1000280c6)

SUMMARY: ThreadSanitizer: data race juce_posix_NamedPipe.cpp:166 in juce::NamedPipe::Pimpl::openPipe(bool, unsigned int)

I think this has been fixed for a while now.