Details
-
Bug
-
Resolution: Fixed
-
P1: Critical
-
None
-
6.2.4
-
None
-
Windows 10, OpenGL RHI
Description
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.
Attachments
Issue Links
- relates to
-
QTBUG-97598 [Windows] Deadlock on WebEngineView rendering
- Closed
-
QTBUG-130515 Exit crash in gl::PbufferGLSurfaceWGL::Destroy() in thread Chrome_InProcGpuThread
- Reported