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.