-
Bug
-
Resolution: Fixed
-
P1: Critical
-
None
-
6.2.4
-
None
-
Windows 10, OpenGL RHI
Got sporadic deadlock in Qt rendering code. Seems it happens on WebEngineView destruction.
Unfortunately, at the moment this has only happened once in my application and I don't have clear steps/preconditions/examples for this.
Main thread:
> [Inline Frame] Qt6Core.dll!QWaitConditionPrivate::wait(QWaitConditionEvent *) Line 111 C++ Qt6Core.dll!QWaitCondition::wait(QMutex * mutex, unsigned long time) Line 169 C++ Qt6Core.dll!QWaitCondition::wait(QMutex * mutex, QDeadlineTimer deadline) Line 180 C++ Qt6Quick.dll!QSGThreadedRenderLoop::polishAndSync(QSGThreadedRenderLoop::Window * w, bool inExpose) Line 1550 C++ Qt6Quick.dll!QSGThreadedRenderLoop::handleUpdateRequest(QQuickWindow * window) Line 1363 C++ Qt6Quick.dll!QQuickWindow::event(QEvent * e) Line 1543 C++ Qt6Widgets.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 3411 C++ Qt6Widgets.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 3363 C++ Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1067 C++ Qt6Gui.dll!QPlatformWindow::deliverUpdateRequest() Line 811 C++ Qt6Gui.dll!QPlatformWindow::windowEvent(QEvent * event) Line 491 C++ Qt6Widgets.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 2667 C++ Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1067 C++ Qt6Core.dll!QEventDispatcherWin32Private::sendTimerEvent(int timerId) Line 409 C++ Qt6Core.dll!QEventDispatcherWin32::event(QEvent * e) Line 891 C++ Qt6Widgets.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 3411 C++ Qt6Widgets.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 3363 C++ Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1067 C++ [Inline Frame] Qt6Core.dll!QCoreApplication::sendEvent(QObject *) Line 1475 C++ Qt6Core.dll!QCoreApplicationPrivate::sendPostedEvents(QObject * receiver, int event_type, QThreadData * data) Line 1834 C++ Qt6Gui.dll!QWindowsGuiEventDispatcher::sendPostedEvents() Line 80 C++ Qt6Core.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 476 C++ Qt6Gui.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 73 C++ [Inline Frame] Qt6Core.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag>) Line 139 C++ Qt6Core.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 230 C++ Qt6Core.dll!QCoreApplication::exec() Line 1382 C++
Chrome_InProcGpuThread (388):
[Waiting on lock owned by Thread 9096, double-click or press enter to switch to thread] [External Code] > Qt6WebEngineCore.dll!gl::PbufferGLSurfaceWGL::Destroy() Line 424 C++ Qt6WebEngineCore.dll!gl::PbufferGLSurfaceWGL::~PbufferGLSurfaceWGL() Line 384 C++ [External Code] [Inline Frame] Qt6WebEngineCore.dll!base::RefCounted<gl::GLSurface,base::DefaultRefCountedTraits<gl::GLSurface>>::DeleteInternal(const gl::GLSurface *) Line 350 C++ [Inline Frame] Qt6WebEngineCore.dll!base::DefaultRefCountedTraits<gl::GLSurface>::Destruct(const gl::GLSurface *) Line 316 C++ [Inline Frame] Qt6WebEngineCore.dll!base::RefCounted<gl::GLSurface,base::DefaultRefCountedTraits<gl::GLSurface>>::Release() Line 339 C++ [Inline Frame] Qt6WebEngineCore.dll!scoped_refptr<gl::PbufferGLSurfaceWGL>::Release(gl::PbufferGLSurfaceWGL * ptr) Line 322 C++ [Inline Frame] Qt6WebEngineCore.dll!scoped_refptr<gl::PbufferGLSurfaceWGL>::{dtor}() Line 224 C++ [Inline Frame] Qt6WebEngineCore.dll!scoped_refptr<gl::PbufferGLSurfaceWGL>::reset() Line 254 C++ [Inline Frame] Qt6WebEngineCore.dll!scoped_refptr<gl::PbufferGLSurfaceWGL>::operator=(void *) Line 240 C++ Qt6WebEngineCore.dll!gl::GLSurfaceWGLQt::Destroy() Line 73 C++ Qt6WebEngineCore.dll!gl::GLSurfaceWGLQt::~GLSurfaceWGLQt() Line 56 C++ [External Code] [Inline Frame] Qt6WebEngineCore.dll!base::internal::OptionalStorageBase<viz::SkiaOutputSurfaceImplOnGpu::ReleaseCurrent,0>::{dtor}() Line 58 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::OptionalBase<viz::SkiaOutputSurfaceImplOnGpu::ReleaseCurrent>::{dtor}() Line 255 C++ [Inline Frame] Qt6WebEngineCore.dll!base::Optional<viz::SkiaOutputSurfaceImplOnGpu::ReleaseCurrent>::{dtor}() Line 559 C++ Qt6WebEngineCore.dll!viz::SkiaOutputSurfaceImplOnGpu::~SkiaOutputSurfaceImplOnGpu() Line 598 C++ [External Code] [Inline Frame] Qt6WebEngineCore.dll!base::OnceCallback<void __cdecl(void)>::Run() Line 101 C++ [Inline Frame] Qt6WebEngineCore.dll!viz::SkiaOutputSurfaceImpl::FlushGpuTasks::__l2::<lambda_6071d863eba8908894695076fa80c0dd>::operator()(std::vector<base::OnceCallback<void __cdecl(void)>,std::allocator<base::OnceCallback<void __cdecl(void)>>> event, base::WaitableEvent * impl_on_gpu, viz::SkiaOutputSurfaceImplOnGpu * need_framebuffer, bool) Line 1003 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::FunctorTraits<<lambda_6071d863eba8908894695076fa80c0dd>,void>::Invoke(viz::SkiaOutputSurfaceImpl::FlushGpuTasks::__l2::<lambda_6071d863eba8908894695076fa80c0dd> &&) Line 379 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::InvokeHelper<0,void>::MakeItSo(viz::SkiaOutputSurfaceImpl::FlushGpuTasks::__l2::<lambda_6071d863eba8908894695076fa80c0dd> &&) Line 637 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<<lambda_6071d863eba8908894695076fa80c0dd>,std::vector<base::OnceCallback<void __cdecl(void)>,std::allocator<base::OnceCallback<void __cdecl(void)>>>,base::WaitableEvent *,viz::SkiaOutputSurfaceImplOnGpu *,bool>,void __cdecl(void)>::RunImpl(viz::SkiaOutputSurfaceImpl::FlushGpuTasks::__l2::<lambda_6071d863eba8908894695076fa80c0dd> &&) Line 710 C++ Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<<lambda_6071d863eba8908894695076fa80c0dd>,std::vector<base::OnceCallback<void __cdecl(void)>,std::allocator<base::OnceCallback<void __cdecl(void)>>>,base::WaitableEvent *,viz::SkiaOutputSurfaceImplOnGpu *,bool>,void __cdecl(void)>::RunOnce(base::internal::BindStateBase * base) Line 679 C++ [Inline Frame] Qt6WebEngineCore.dll!base::OnceCallback<void __cdecl(void)>::Run() Line 101 C++ Qt6WebEngineCore.dll!gpu::Scheduler::RunNextTask() Line 577 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::FunctorTraits<void (__cdecl printing::PrintJobWorker::*)(void),void>::Invoke(void(printing::PrintJobWorker::*)()) Line 498 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::InvokeHelper<1,void>::MakeItSo(void(printing::PrintJobWorker::*)() &&) Line 657 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<void (__cdecl printing::PrintJobWorker::*)(void),base::WeakPtr<printing::PrintJobWorker>>,void __cdecl(void)>::RunImpl(void(printing::PrintJobWorker::*)() &&) Line 710 C++ Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<void (__cdecl printing::PrintJobWorker::*)(void),base::WeakPtr<printing::PrintJobWorker>>,void __cdecl(void)>::RunOnce(base::internal::BindStateBase * base) Line 683 C++ [Inline Frame] Qt6WebEngineCore.dll!base::OnceCallback<void __cdecl(void)>::Run() Line 101 C++ Qt6WebEngineCore.dll!base::TaskAnnotator::RunTask(const char * trace_event_name, base::PendingTask * pending_task) Line 163 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::sequence_manager::LazyNow * continuation_lazy_now) Line 352 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() Line 266 C++ Qt6WebEngineCore.dll!base::MessagePumpDefault::Run(base::MessagePump::Delegate * delegate) Line 40 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed, base::TimeDelta timeout) Line 463 C++ Qt6WebEngineCore.dll!base::RunLoop::Run(const base::Location & location) Line 135 C++ Qt6WebEngineCore.dll!base::Thread::Run(base::RunLoop * run_loop) Line 312 C++ Qt6WebEngineCore.dll!base::Thread::ThreadMain() Line 385 C++ Qt6WebEngineCore.dll!base::`anonymous namespace'::ThreadFunc(void * params) Line 114 C++ [External Code]
Some RHI thread (9096):
[Waiting on lock owned by Thread 388, double-click or press enter to switch to thread] [External Code] > [Inline Frame] Qt6Gui.dll!QOpenGLFunctions::glDrawElements(unsigned int) Line 756 C++ Qt6Gui.dll!QRhiGles2::executeCommandBuffer(QRhiCommandBuffer * cb) Line 2853 C++ Qt6Gui.dll!QRhiGles2::endFrame(QRhiSwapChain * swapChain, QFlags<enum QRhi::EndFrameFlag> flags) Line 1825 C++ Qt6Gui.dll!QRhi::endFrame(QRhiSwapChain * swapChain, QFlags<enum QRhi::EndFrameFlag> flags) Line 6699 C++ Qt6Quick.dll!QSGRenderThread::syncAndRender() Line 788 C++ Qt6Quick.dll!QSGRenderThread::run() Line 984 C++ Qt6Core.dll!QThreadPrivate::start(void * arg) Line 328 C++ [External Code]
VizCompositorThread:
[External Code] > Qt6WebEngineCore.dll!base::WaitableEvent::Wait() Line 74 C++ Qt6WebEngineCore.dll!viz::SkiaOutputSurfaceImpl::FlushGpuTasks(bool wait_for_finish) Line 1020 C++ Qt6WebEngineCore.dll!viz::SkiaOutputSurfaceImpl::~SkiaOutputSurfaceImpl() Line 145 C++ [External Code] [Inline Frame] Qt6WebEngineCore.dll!std::default_delete<viz::OutputSurface>::operator()(viz::OutputSurface *) Line 3120 C++ [Inline Frame] Qt6WebEngineCore.dll!std::unique_ptr<viz::OutputSurface,std::default_delete<viz::OutputSurface>>::{dtor}() Line 3230 C++ Qt6WebEngineCore.dll!viz::Display::~Display() Line 369 C++ [External Code] [Inline Frame] Qt6WebEngineCore.dll!std::default_delete<viz::RootCompositorFrameSinkImpl>::operator()(viz::RootCompositorFrameSinkImpl *) Line 3120 C++ [Inline Frame] Qt6WebEngineCore.dll!std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>::{dtor}() Line 3230 C++ [Inline Frame] Qt6WebEngineCore.dll!std::_Default_allocator_traits<std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>::destroy(std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>> &) Line 723 C++ [Inline Frame] Qt6WebEngineCore.dll!std::_Destroy_range(std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>> * _First, std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>> * const) Line 950 C++ [Inline Frame] Qt6WebEngineCore.dll!std::vector<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>,std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>::_Destroy(std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>> *) Line 1680 C++ [Inline Frame] Qt6WebEngineCore.dll!std::vector<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>,std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>::erase(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>>) Line 1442 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::flat_tree<viz::FrameSinkId,base::internal::GetFirst,std::less<void>,std::vector<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>,std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>>::erase(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>>) Line 905 C++ Qt6WebEngineCore.dll!base::internal::flat_tree<viz::FrameSinkId,base::internal::GetFirst,std::less<void>,std::vector<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>,std::allocator<std::pair<viz::FrameSinkId,std::unique_ptr<viz::RootCompositorFrameSinkImpl,std::default_delete<viz::RootCompositorFrameSinkImpl>>>>>>::erase<viz::FrameSinkId>(const viz::FrameSinkId & val) Line 897 C++ Qt6WebEngineCore.dll!viz::FrameSinkManagerImpl::InvalidateFrameSinkId(const viz::FrameSinkId & frame_sink_id) Line 153 C++ Qt6WebEngineCore.dll!viz::mojom::FrameSinkManagerStubDispatch::Accept(viz::mojom::FrameSinkManager * impl, mojo::Message * message) Line 1640 C++ Qt6WebEngineCore.dll!mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message * message) Line 557 C++ Qt6WebEngineCore.dll!mojo::MessageDispatcher::Accept(mojo::Message * message) Line 43 C++ Qt6WebEngineCore.dll!mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper * message_wrapper, mojo::internal::MultiplexRouter::ClientCallBehavior client_call_behavior, base::SequencedTaskRunner * current_task_runner) Line 954 C++ Qt6WebEngineCore.dll!mojo::internal::MultiplexRouter::Accept(mojo::Message * message) Line 622 C++ Qt6WebEngineCore.dll!mojo::MessageDispatcher::Accept(mojo::Message * message) Line 43 C++ Qt6WebEngineCore.dll!mojo::Connector::DispatchMessageW(mojo::Message message) Line 507 C++ Qt6WebEngineCore.dll!mojo::Connector::ReadAllAvailableMessages() Line 566 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::FunctorTraits<void (__cdecl printing::PrintJobWorker::*)(void),void>::Invoke(void(printing::PrintJobWorker::*)()) Line 498 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::InvokeHelper<1,void>::MakeItSo(void(printing::PrintJobWorker::*)() &&) Line 657 C++ [Inline Frame] Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<void (__cdecl printing::PrintJobWorker::*)(void),base::WeakPtr<printing::PrintJobWorker>>,void __cdecl(void)>::RunImpl(void(printing::PrintJobWorker::*)() &&) Line 710 C++ Qt6WebEngineCore.dll!base::internal::Invoker<base::internal::BindState<void (__cdecl printing::PrintJobWorker::*)(void),base::WeakPtr<printing::PrintJobWorker>>,void __cdecl(void)>::RunOnce(base::internal::BindStateBase * base) Line 683 C++ [Inline Frame] Qt6WebEngineCore.dll!base::OnceCallback<void __cdecl(void)>::Run() Line 101 C++ Qt6WebEngineCore.dll!base::TaskAnnotator::RunTask(const char * trace_event_name, base::PendingTask * pending_task) Line 163 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::sequence_manager::LazyNow * continuation_lazy_now) Line 352 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() Line 266 C++ Qt6WebEngineCore.dll!base::MessagePumpDefault::Run(base::MessagePump::Delegate * delegate) Line 40 C++ Qt6WebEngineCore.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed, base::TimeDelta timeout) Line 463 C++ Qt6WebEngineCore.dll!base::RunLoop::Run(const base::Location & location) Line 135 C++ Qt6WebEngineCore.dll!base::Thread::Run(base::RunLoop * run_loop) Line 312 C++ Qt6WebEngineCore.dll!base::Thread::ThreadMain() Line 385 C++ Qt6WebEngineCore.dll!base::`anonymous namespace'::ThreadFunc(void * params) Line 114 C++ [External Code]
Pay attention that Chrome_InProcGpuThread (9096) and RHI thread (388) lock each other.
- relates to
-
QTBUG-97598 [Windows] Deadlock on WebEngineView rendering
-
- Closed
-
-
QTBUG-130515 Exit crash in gl::PbufferGLSurfaceWGL::Destroy() in thread Chrome_InProcGpuThread
-
- Reported
-