OpenGL - DragAndDropContainer -> mem leak

Hey there,
when creating a openGL context and then going to the next view, a memory leak occurs …
this only seems to be a problem on linux
following two methods are called in the constructor and destructor respectively:

        void LoginView::createOpenGLContext() {
            openGLContext.attachTo(*this);
            if(!openGLContext.isActive())
                openGLContext.makeActive();
        }

    void LoginView::detachOpenGLContext() {
        openGLContext.detach();
    }

Callstack:
kill 0x00007f1ecac16187
juce::LeakedObjectDetectorjuce::DragAndDropContainer::~LeakedObjectDetector juce_LeakedObjectDetector.h:66
juce::DragAndDropContainer::~DragAndDropContainer juce_DragAndDropContainer.cpp:391
juce::DragAndDropContainer::~DragAndDropContainer juce_DragAndDropContainer.cpp:393
juce::LinuxComponentPeer::repaintOpenGLContexts juce_linux_X11_Windowing.cpp:2192
juce::LinuxComponentPeer::handleExposeEvent juce_linux_X11_Windowing.cpp:1980
juce::LinuxComponentPeer::handleWindowMessage juce_linux_X11_Windowing.cpp:1634
juce::WindowingHelpers::windowMessageReceive juce_linux_X11_Windowing.cpp:3453
juce::XWindowSystem::<lambda(int)>::operator()(int) const juce_linux_X11.cpp:217
std::_Function_handler<void(int), juce::XWindowSystem::initialiseXDisplay()::<lambda(int)> >::_M_invoke(const std::_Any_data &, int &&) std_function.h:316
std::function<void (int)>::operator()(int) const std_function.h:706
juce::InternalRunLoop::dispatchPendingEvents juce_linux_Messaging.cpp:171
juce::MessageManager::dispatchNextMessageOnSystemQueue juce_linux_Messaging.cpp:262
juce::MessageManager::runDispatchLoop juce_MessageManager.cpp:128
juce::JUCEApplicationBase::main juce_ApplicationBase.cpp:262
juce::JUCEApplicationBase::main juce_ApplicationBase.cpp:240
main main.cpp:70
__libc_start_main 0x00007f1ecabf8b97
_start 0x000055ba5b0efe1a

any idea on how to solve this issue or is this a juce bug??

any help would be appreciated (:

1 Like

Looks like you’re leaking an object which derives from DragAndDropContainer, I think the OpenGL in the callstack is a red herring. Can you post some more of the code?

sorry for the late reply :sweat_smile:

we still have problems with the openGL context…
for example there is a view(component) with a context running and when i move from this one to another view (detaching from the context) then there is no problem, BUT if i exit from the view with the context most of the time i get this segfault:

_XSend 0x00007fc3376aa02d
_XFlush 0x00007fc3376aa4c0
_XGetRequest 0x00007fc3376acfc5
XQueryExtension 0x00007fc3376a06cd
0x00007fc3335e2252
0x00007fc3335dddf1
juce::OpenGLContext::NativeContext::makeActive() const juce_OpenGL_linux_X11.h:169
juce::OpenGLContext::makeActive() const juce_OpenGLContext.cpp:1013
juce::OpenGLContext::CachedImage::runJob() juce_OpenGLContext.cpp:493
juce::ThreadPool::runNextJob(juce::ThreadPool::ThreadPoolThread&) juce_ThreadPool.cpp:384
juce::ThreadPool::ThreadPoolThread::run() juce_ThreadPool.cpp:36
juce::thread::threadEntryPoint() juce_Thread.cpp:96
juce::juce_threadEntryPoint(void*) juce_Thread.cpp:118
juce::threadEntryProc(void*) juce_posix_SharedCode.h:838
start_thread 0x00007fc33cec56db
__GI___clone 0x00007fc3447fea3f

i tried many things solving this issue but failed so far …

  • setVisible(false);
  • removeFromDesktop();
  • openGLContext.detach();
  • openGLContext.deactivateCurrentContext();
  • putting it into a unique_ptr and resetting it

all those (combinations) didn’t solve the issue …

another problem arises when you have two components which have an openGL context each. Then most of the time the window just hangs when closing … if i pause the program the the corresponding thread is waiting for some condition:

__pthread_cond_timedwait 0x00007fb397f20f85
__pthread_cond_timedwait 0x00007fb397f20f60
__pthread_cond_timedwait 0x00007fb397f20e00
__gthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec const*) gthr-default.h:871
std::cv_status std::condition_variable::__wait_until_impl<std::chrono::duration<long, std::ratio<1l, 1000000000l> > >(std::unique_lockstd::mutex&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&) condition_variable:178
std::cv_status std::condition_variable::wait_until<std::chrono::duration<long, std::ratio<1l, 1000000000l> > >(std::unique_lockstd::mutex&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&) condition_variable:106
bool std::condition_variable::wait_until<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> >, juce::WaitableEvent::wait(int) const::$_10>(std::unique_lockstd::mutex&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, juce::WaitableEvent::wait(int) const::$_10) condition_variable:129
bool std::condition_variable::wait_for<long, std::ratio<1l, 1000l>, juce::WaitableEvent::wait(int) const::$_10>(std::unique_lockstd::mutex&, std::chrono::duration<long, std::ratio<1l, 1000l> > const&, juce::WaitableEvent::wait(int) const::$_10) condition_variable:156
juce::WaitableEvent::wait(int) const juce_WaitableEvent.cpp:43
juce::ThreadPool::waitForJobToFinish(juce::ThreadPoolJob const*, int) const juce_ThreadPool.cpp:227
juce::ThreadPool::removeJob(juce::ThreadPoolJob*, bool, int) juce_ThreadPool.cpp:260
juce::OpenGLContext::CachedImage::pause() juce_OpenGLContext.cpp:138
juce::OpenGLContext::CachedImage::stop() juce_OpenGLContext.cpp:122
juce::OpenGLContext::Attachment::stop() juce_OpenGLContext.cpp:859
juce::OpenGLContext::Attachment::detach() juce_OpenGLContext.cpp:741
juce::OpenGLContext::detach() juce_OpenGLContext.cpp:977
juce::OpenGLContext::~OpenGLContext() juce_OpenGLContext.cpp:889
TunerMeter::~TunerMeter() tunerMeter.cpp:36
Dialog::Tuner::~Tuner() tuner.cpp:63
Dialog::Tuner::~Tuner() tuner.cpp:59
Dialog::Tuner::userTriedToCloseWindow() tuner.cpp:125
Dialog::OkDialog::initOk()::$_1::operator()() const okDialog.cpp:41
std::_Function_handler<void (), Dialog::OkDialog::initOk()::$_1>::_M_invoke(std::_Any_data const&) std_function.h:297
std::function<void ()>::operator()() const std_function.h:687
juce::Button::sendClickMessage(juce::ModifierKeys const&) juce_Button.cpp:407
juce::Button::internalClickCallback(juce::ModifierKeys const&) juce_Button.cpp:350
juce::Button::mouseUp(juce::MouseEvent const&) juce_Button.cpp:470
juce::Component::internalMouseUp(juce::MouseInputSource, juce::Point, juce::Time, juce::ModifierKeys, float, float, float, float, float) juce_Component.cpp:2434
juce::MouseInputSourceInternal::sendMouseUp(juce::Component&, juce::Point, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:154
juce::MouseInputSourceInternal::setButtons(juce::Point, juce::Time, juce::ModifierKeys) juce_MouseInputSource.cpp:196
juce::MouseInputSourceInternal::handleEvent(juce::ComponentPeer&, juce::Point, juce::Time, juce::ModifierKeys, float, float, juce::PenDetails) juce_MouseInputSource.cpp:333
juce::MouseInputSource::handleEvent(juce::ComponentPeer&, juce::Point, long long, juce::ModifierKeys, float, float, juce::PenDetails const&) juce_MouseInputSource.cpp:633
juce::ComponentPeer::handleMouseEvent(juce::MouseInputSource::InputSourceType, juce::Point, juce::ModifierKeys, float, float, long long, juce::PenDetails, int) juce_ComponentPeer.cpp:87
juce::XWindowSystem::handleButtonReleaseEvent(juce::LinuxComponentPeer, XButtonEvent const&) const juce_linux_XWindowSystem.cpp:3105
juce::XWindowSystem::handleWindowMessage(juce::LinuxComponentPeer
, _XEvent&) const juce_linux_XWindowSystem.cpp:2839
juce::WindowingHelpers::windowMessageReceive(_XEvent&) juce_linux_XWindowSystem.cpp:3359
juce::XWindowSystem::initialiseXDisplay()::$_92::operator()(int) const juce_linux_XWindowSystem.cpp:2768
std::_Function_handler<void (int), juce::XWindowSystem::initialiseXDisplay()::$_92>::_M_invoke(std::_Any_data const&, int&&) std_function.h:297
std::function<void (int)>::operator()(int) const std_function.h:687
juce::InternalRunLoop::dispatchPendingEvents() juce_linux_Messaging.cpp:186
juce::MessageManager::dispatchNextMessageOnSystemQueue(bool) juce_linux_Messaging.cpp:300
juce::MessageManager::runDispatchLoop() juce_MessageManager.cpp:128
juce::JUCEApplicationBase::main() juce_ApplicationBase.cpp:262
juce::JUCEApplicationBase::main(int, char const**) juce_ApplicationBase.cpp:240
main main.cpp:82
__libc_start_main 0x00007fb39f753b97
_start 0x000000000052c31a

i suspect some kind of race condition for this issue…

1 Like

@ed95 bump :wink:

1 Like

Yup - just noticed this on Linux.
It seems to me that a second call to attachTo() causes the waitableEvent which waits forever.
The first time you attach to the context object it’s happy and displays.
Any subsequent call to attachTo() , no matter how I detach, reset, setRenderer(nullptr), will lock up in this way.

I have tracked it down to glxChooseVisual() in the linux_X11 NativeContext constructor.
I have a nice simple example project if anyone wants to see for themselves.

Also - codeblocks is like pulling teeth. is VSCode not an option?

You can use basically anything with cmake.

Could you post the demo code somewhere, please? I’ll try to take a look at this in the next few days.

https://www.dropbox.com/s/ocsm4exygm0iyos/testGL.zip?dl=1
tested in Juce5 and 6 - different behaviour but same basic issue.

cmake sounds great once I learn how to use it and convert my existing projects - till then we’re stuck with codeblocks sadly.

1 Like
#0 ?? __lll_lock_wait () (…/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135)
#1 0x7ffff6f780f4 __GI___pthread_mutex_lock(mutex=0x7fffeea5d7e8) (…/nptl/pthread_mutex_lock.c:115)
#2 0x7fffee7d8dec ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#3 0x7fffee7aee18 ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#4 0x7ffff42cc9c0 ??() (/usr/lib/x86_64-linux-gnu/libGLX.so.0:??)
#5 0x7ffff42c6231 glXChooseVisual() (/usr/lib/x86_64-linux-gnu/libGLX.so.0:??)
#6 0x555555b28742 juce::OpenGLContext::NativeContext::NativeContext(this=0x55555609e1d0, comp=…, cPixelFormat=…, shareContext=0x0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/native/juce_OpenGL_linux_X11.h:87)
#7 0x555555b295de juce::OpenGLContext::CachedImage::CachedImage(this=0x55555609edc0, c=…, comp=…, pixFormat=…, contextToShare=0x0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:83)
#8 0x555555b2b88a juce::OpenGLContext::Attachment::attach(this=0x5555560794d0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:842)
#9 0x555555b2b3f8 juce::OpenGLContext::Attachment::Attachment(this=0x5555560794d0, c=…, comp=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:730)
#10 0x555555b20193 juce::OpenGLContext::attachTo(this=0x555556095bf0, component=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:969)

Unfortunately I’m not able to reproduce the deadlock here. Looking at the stack trace you provided, it seems that a lock is taken inside the (Nvidia?) OpenGL driver, so I’m guessing that the issue might only be present on certain hardware. What hardware are you using for testing? Have you seen the same behaviour on multiple machines?

Also, would you be able to supply similar stack traces for the other active threads at the point of the deadlock (building against the current develop branch please!)? Even if I can’t repro the issue here, there’s a chance I might be able to diagnose the issue if I can see what all threads involved in the deadlock are up to.

Sorry for the slow response.
I have only 1 machine capable of running Linux so hard to know how hardware dependent this is.

Here are the stacktraces for the 3 threads that are supposedly running right after hitting the deadlock. This is building against JUCE 6.0.8 master

THREAD NAMED “POOL”
#0 0x7ffff6f78ad3 futex_wait_cancelable(private=, expected=0, futex_word=0x55555607f0c8) (…/sysdeps/unix/sysv/linux/futex-internal.h:88)
#1 ?? __pthread_cond_wait_common (abstime=0x0, mutex=0x55555607eca0, cond=0x55555607f0a0) (pthread_cond_wait.c:502)
#2 ?? __pthread_cond_wait (cond=0x55555607f0a0, mutex=0x55555607eca0) (pthread_cond_wait.c:655)
#3 0x7ffff1fa19fd ??() (/usr/lib/x86_64-linux-gnu/libX11.so.6:??)
#4 0x7ffff1fa1e89 ??() (/usr/lib/x86_64-linux-gnu/libX11.so.6:??)
#5 0x7fffee7e2d4b ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#6 0x7fffee774d3d ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#7 0x7fffed7b2ba8 ??() (/usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.390.141:??)
#8 0x7fffed774929 ??() (/usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.390.141:??)
#9 0x7fffed776b4f ??() (/usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.390.141:??)
#10 0x7fffee7acb54 ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#11 0x7ffff6f71408 __nptl_deallocate_tsd() (pthread_create.c:300)
#12 0x7ffff6f7281b __nptl_deallocate_tsd() (…/sysdeps/nptl/futex-internal.h:200)
#13 ?? start_thread (arg=0x7fffec716700) (pthread_create.c:473)
#14 0x7ffff60d071f clone() (…/sysdeps/unix/sysv/linux/x86_64/clone.S:95)

THREAD NAMED “JUCE Timer”
#0 0x7ffff6f79065 futex_abstimed_wait_cancelable(private=, abstime=0x7fffebf14c80, expected=0, futex_word=0x55555607ef6c) (…/sysdeps/unix/sysv/linux/futex-internal.h:205)
#1 ?? __pthread_cond_wait_common (abstime=0x7fffebf14c80, mutex=0x55555607ef18, cond=0x55555607ef40) (pthread_cond_wait.c:539)
#2 ?? __pthread_cond_timedwait (cond=0x55555607ef40, mutex=0x55555607ef18, abstime=0x7fffebf14c80) (pthread_cond_wait.c:667)
#3 0x5555557455c5 __gthread_cond_timedwait(__cond=0x55555607ef40, __mutex=0x55555607ef18, __abs_timeout=0x7fffebf14c80) (/usr/include/x86_64-linux-gnu/c++/7/bits/gthr-default.h:871)
#4 0x5555557e13be std::condition_variable::__wait_until_impl<std::chrono::duration<long, std::ratio<1l, 1000000000l> > >(this=0x55555607ef40, __lock=…, __atime=…) (/usr/include/c++/7/condition_variable:178)
#5 0x5555557ee25d std::condition_variable::wait_until<std::chrono::duration<long, std::ratio<1l, 1000000000l> > >(this=0x55555607ef40, __lock=…, __atime=…) (/usr/include/c++/7/condition_variable:106)
#6 0x55555579ef36 std::condition_variable::wait_until<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> >, juce::WaitableEvent::wait(int) const::<lambda()> >(std::unique_lockstd::mutex &, const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1, 1000000000> > > &, juce::WaitableEvent::<lambda()>)(this=0x55555607ef40, __lock=…, __atime=…, __p=…) (/usr/include/c++/7/condition_variable:129)
#7 0x55555579e6c1 std::condition_variable::wait_for<long int, std::ratio<1, 1000>, juce::WaitableEvent::wait(int) const::<lambda()> >(std::unique_lockstd::mutex &, const std::chrono::duration<long, std::ratio<1, 1000> > &, juce::WaitableEvent::<lambda()>)(this=0x55555607ef40, __lock=…, __rtime=…, __p=…) (/usr/include/c++/7/condition_variable:156)
#8 0x5555557985a8 juce::WaitableEvent::wait(this=0x55555607ef10, timeOutMilliseconds=300) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_core/threads/juce_WaitableEvent.cpp:43)
#9 0x5555558219c9 juce::timer::TimerThread::run(this=0x55555607ed60) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_events/timers/juce_Timer.cpp:74)
#10 0x5555557708cf juce::thread::threadEntryPoint(this=0x55555607ed60) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_core/threads/juce_Thread.cpp:96)
#11 0x5555557709bc juce::juce_threadEntryPoint(userData=0x55555607ed60) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_core/threads/juce_Thread.cpp:118)
#12 0x5555557943c6 juce::threadEntryProc(userData=0x55555607ed60) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_core/native/juce_posix_SharedCode.h:838)
#13 0x7ffff6f726db start_thread(arg=0x7fffebf15700) (pthread_create.c:463)
#14 0x7ffff60d071f clone() (…/sysdeps/unix/sysv/linux/x86_64/clone.S:95)

THREAD NAMED “testGL”
#0 ?? __lll_lock_wait () (…/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135)
#1 0x7ffff6f750f4 __GI___pthread_mutex_lock(mutex=0x7fffeea5a7e8) (…/nptl/pthread_mutex_lock.c:115)
#2 0x7fffee7d5dec ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#3 0x7fffee7abe18 ??() (/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:??)
#4 0x7ffff42c99c0 ??() (/usr/lib/x86_64-linux-gnu/libGLX.so.0:??)
#5 0x7ffff42c3231 glXChooseVisual() (/usr/lib/x86_64-linux-gnu/libGLX.so.0:??)
#6 0x555555b28742 juce::OpenGLContext::NativeContext::NativeContext(this=0x55555609e1d0, comp=…, cPixelFormat=…, shareContext=0x0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/native/juce_OpenGL_linux_X11.h:87)
#7 0x555555b295de juce::OpenGLContext::CachedImage::CachedImage(this=0x55555609edc0, c=…, comp=…, pixFormat=…, contextToShare=0x0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:83)
#8 0x555555b2b88a juce::OpenGLContext::Attachment::attach(this=0x5555560794d0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:842)
#9 0x555555b2b3f8 juce::OpenGLContext::Attachment::Attachment(this=0x5555560794d0, c=…, comp=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:730)
#10 0x555555b20193 juce::OpenGLContext::attachTo(this=0x555556095bf0, component=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_opengl/opengl/juce_OpenGLContext.cpp:969)
#11 0x555555b44283 testGLComp::connectGL(this=0x555556095b10) (/home/justin/Documents/App_Dev/testGL/Source/testGLComp.h:28)
#12 0x555555b42a30 MainComponent::<lambda()>::operator()(void) const(__closure=0x555556095550) (/home/justin/Documents/App_Dev/testGL/Source/MainComponent.cpp:53)
#13 0x555555b43192 std::_Function_handler<void(), MainComponent::MainComponent()::<lambda()> >::_M_invoke(const std::_Any_data &)(__functor=…) (/usr/include/c++/7/bits/std_function.h:316)
#14 0x55555570c6ba std::function<void ()>::operator()() const(this=0x555556095550) (/usr/include/c++/7/bits/std_function.h:706)
#15 0x555555933272 juce::Button::sendClickMessage(this=0x555556095488, modifiers=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/buttons/juce_Button.cpp:407)
#16 0x555555932fd8 juce::Button::internalClickCallback(this=0x555556095488, modifiers=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/buttons/juce_Button.cpp:350)
#17 0x55555593367c juce::Button::mouseUp(this=0x555556095488, e=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/buttons/juce_Button.cpp:470)
#18 0x5555559271bc juce::Component::internalMouseUp(this=0x555556095488, source=…, relativePos=…, time=…, oldModifiers=…, pressure=0, orientation=0, rotation=0, tiltX=0, tiltY=0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/components/juce_Component.cpp:2452)
#19 0x5555559e53de juce::MouseInputSourceInternal::sendMouseUp(this=0x55555607a8b0, comp=…, screenPos=…, time=…, oldMods=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp:154)
#20 0x5555559e5721 juce::MouseInputSourceInternal::setButtons(this=0x55555607a8b0, screenPos=…, time=…, newButtonState=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp:196)
#21 0x5555559e5ebc juce::MouseInputSourceInternal::handleEvent(this=0x55555607a8b0, newPeer=…, positionWithinPeer=…, time=…, newMods=…, newPressure=0, newOrientation=0, pen=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp:333)
#22 0x555555929fa0 juce::MouseInputSource::handleEvent(this=0x7fffffffe170, peer=…, pos=…, time=1617765269548, mods=…, pressure=0, orientation=0, penDetails=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp:633)
#23 0x5555559b1a33 juce::ComponentPeer::handleMouseEvent(this=0x555556090b10, type=juce::MouseInputSource::mouse, pos=…, newMods=…, newPressure=0, newOrientation=0, time=1617765269548, pen=…, touchIndex=0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp:87)
#24 0x5555559ce6b8 juce::XWindowSystem::handleButtonReleaseEvent(this=0x55555607ab60, peer=0x555556090b10, buttonRelEvent=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3211)
#25 0x5555559cd8db juce::XWindowSystem::handleWindowMessage(this=0x55555607ab60, peer=0x555556090b10, event=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:2945)
#26 0x5555559cf6a9 juce::WindowingHelpers::windowMessageReceive(event=…) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:3465)
#27 0x5555559cd0e8 juce::XWindowSystem::<lambda(int)>::operator()(int) const(__closure=0x55555607a1d0) (/home/justin/Documents/App_Dev/SDKs/JUCE/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp:2874)
#28 0x5555559d51e3 std::_Function_handler<void(int), juce::XWindowSystem::initialiseXDisplay()::<lambda(int)> >::_M_invoke(const std::_Any_data &, int &&)(__functor=…, __args#0=@0x7fffffffe3f4: 5) (/usr/include/c++/7/bits/std_function.h:316)
#29 0x555555828cc0 std::function<void (int)>::operator()(int) const(this=0x55555607a1d0, __args#0=5) (/usr/include/c++/7/bits/std_function.h:706)