diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2025-05-02 11:40:43 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2025-05-02 18:30:25 +0200 |
commit | fbca764f46b39a21a3a1d68276fba08d0a0e54a6 (patch) | |
tree | 2870358f2734dbcc14b2c3c3738272adfe308fb6 /sc/source/ui/vba/vbaapplication.hxx | |
parent | 63467889b0ddea39ca305a2ab2396e99359b35d0 (diff) |
tdf#130857 qt weld: Make sure .ui file is processed in main thread
QWidgets may only be created in the GUI/main thread, and
that is what happens when processing the .ui file.
Therefore, ensure this is always run in the main thread.
One case observed where this was not the case was the crash
recovery dialog getting created after Impress had crashed
due to an assert being hit somewhere in the QtMultimedia
library in a non-main thread.
Backtrace:
(gdb) bt
#0 __GI_abort () at ./stdlib/abort.c:91
#1 0x00007fe93850641d in qAbort () at /home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:46
#2 0x00007fe93854dd9a in qt_maybe_message_fatal<QString&> (msgType=QtFatalMsg, context=..., message=...) at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:2140
#3 0x00007fe938547004 in qt_message (msgType=QtFatalMsg, context=..., msg=0x7fe938ca8ed3 "ASSERT failure in %s: \"%s\", file %s, line %d", ap=0x7fe8e27d6f30)
at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:412
#4 0x00007fe93854934d in QMessageLogger::fatal (this=0x7fe8e27d70d0, msg=0x7fe938ca8ed3 "ASSERT failure in %s: \"%s\", file %s, line %d") at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:901
#5 0x00007fe9385064d3 in qt_assert_x
(where=0x7fe936e5576a "QWidget", what=0x7fe936e5580b "Widgets must be created in the GUI thread.", file=0x7fe936e556b4 "/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp", line=945)
at /home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:115
#6 0x00007fe93668477d in QWidgetPrivate::init (this=0x7fe88c19c3f0, parentWidget=0x0, f=...) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:944
#7 0x00007fe9366845e6 in QWidget::QWidget (this=0x7fe88c003370, dd=..., parent=0x0, f=...) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:862
#8 0x00007fe936a92cb5 in QDialog::QDialog (this=0x7fe88c003370, parent=0x0, f=...) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:375
#9 0x00007fe93955ed73 in QtBuilder::makeObject (this=0x7fe88c0049f0, pParent=0x0, sName=u"GtkDialog", sType="", sID="DocRecoverySaveDialog", rMap=std::__debug::map with 7 elements = {...}) at vcl/qt6/../qt5/QtBuilder.cxx:213
#10 0x00007fe93955e1a4 in QtBuilder::insertObject (this=0x7fe88c0049f0, pParent=0x0, rClass="GtkDialog", sType="", rID="DocRecoverySaveDialog", rProps=std::__debug::map with 7 elements = {...}) at vcl/qt6/../qt5/QtBuilder.cxx:109
#11 0x00007fe9395742e5 in WidgetBuilder<QObject, QObject*, QMenu, QMenu*>::handleObject (this=0x7fe88c0049f0, pParent=0x0, pAtkProps=0x0, reader=..., sType="", sInternalChild="", bToolbarItem=false) at include/vcl/widgetbuilder.hxx:234
#12 0x00007fe939572c16 in WidgetBuilder<QObject, QObject*, QMenu, QMenu*>::handleChild (this=0x7fe88c0049f0, pParent=0x0, pAtkProps=0x0, reader=..., bToolbarItem=false) at include/vcl/widgetbuilder.hxx:131
#13 0x00007fe939566468 in WidgetBuilder<QObject, QObject*, QMenu, QMenu*>::processUIFile (this=0x7fe88c0049f0, pParent=0x0) at include/vcl/widgetbuilder.hxx:70
#14 0x00007fe93955da70 in QtBuilder::QtBuilder (this=0x7fe88c0049f0, pParent=0x0, sUIRoot=u"file:///home/michi/development/git/libreoffice/instdir/program/../share/config/soffice.cfg/", rUIFile="svx/ui/docrecoverysavedialog.ui")
at vcl/qt6/../qt5/QtBuilder.cxx:66
#15 0x00007fe9396117a7 in std::make_unique<QtBuilder, QWidget*&, std::basic_string_view<char16_t, std::char_traits<char16_t> >&, rtl::OUString const&>
(__args=@0x7fe8e27d91a0: 0x0, __args=u"file:///home/michi/development/git/libreoffice/instdir/program/../share/config/soffice.cfg/", __args="svx/ui/docrecoverysavedialog.ui")
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:1077
#16 0x00007fe93960ed69 in QtInstanceBuilder::QtInstanceBuilder
(this=0x7fe88c0db2d0, pParent=0x0, sUIRoot=u"file:///home/michi/development/git/libreoffice/instdir/program/../share/config/soffice.cfg/", rUIFile="svx/ui/docrecoverysavedialog.ui") at vcl/qt6/../qt5/QtInstanceBuilder.cxx:52
#17 0x00007fe9395f55a8 in std::make_unique<QtInstanceBuilder, QWidget*&, rtl::OUString const&, rtl::OUString const&>
(__args=@0x7fe8e27d92a0: 0x0, __args="file:///home/michi/development/git/libreoffice/instdir/program/../share/config/soffice.cfg/", __args="svx/ui/docrecoverysavedialog.ui")
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:1077
#18 0x00007fe9395ef490 in QtInstance::CreateBuilder (this=0x56149a5271a0, pParent=0x0, rUIRoot="file:///home/michi/development/git/libreoffice/instdir/program/../share/config/soffice.cfg/", rUIFile="svx/ui/docrecoverysavedialog.ui")
at vcl/qt6/../qt5/QtInstance.cxx:916
#19 0x00007fe9395ef52c in non-virtual thunk to QtInstance::CreateBuilder(weld::Widget*, rtl::OUString const&, rtl::OUString const&) () at /home/michi/development/git/libreoffice/instdir/program/libvclplug_qt6lo.so
#20 0x00007fe94160079f in Application::CreateBuilder (pParent=0x0, rUIFile="svx/ui/docrecoverysavedialog.ui", bMobile=false, nLOKWindowId=0) at /home/michi/development/git/libreoffice/vcl/source/window/builder.cxx:204
#21 0x00007fe94208901d in weld::GenericDialogController::GenericDialogController (this=0x7fe88c0095a0, pParent=0x0, rUIFile="svx/ui/docrecoverysavedialog.ui", rDialogId="DocRecoverySaveDialog", bMobile=false)
at /home/michi/development/git/libreoffice/vcl/source/app/weldutils.cxx:53
#22 0x00007fe945a1f83d in svx::DocRecovery::SaveDialog::SaveDialog (this=0x7fe88c0095a0, pParent=0x0, pCore=0x7fe88c0dafe0) at /home/michi/development/git/libreoffice/svx/source/dialog/docrecovery.cxx:574
#23 0x00007fe945a35e25 in (anonymous namespace)::RecoveryUI::impl_doEmergencySave (this=0x7fe88c0d4010) at /home/michi/development/git/libreoffice/svx/source/unodraw/recoveryui.cxx:254
#24 0x00007fe945a35b03 in (anonymous namespace)::RecoveryUI::dispatchWithReturnValue (this=0x7fe88c0d4010, aURL=...) at /home/michi/development/git/libreoffice/svx/source/unodraw/recoveryui.cxx:148
#25 0x00007fe945a35ca4 in non-virtual thunk to (anonymous namespace)::RecoveryUI::dispatchWithReturnValue(com::sun::star::util::URL const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) ()
at /home/michi/development/git/libreoffice/instdir/program/libsvxlo.so
#26 0x00007fe94af24c4f in desktop::(anonymous namespace)::impl_callRecoveryUI (bEmergencySave=true, bExistsRecoveryData=false) at /home/michi/development/git/libreoffice/desktop/source/app/app.cxx:1057
#27 0x00007fe94af248a1 in desktop::Desktop::Exception (this=0x7ffc5c0f5540, nCategory=ExceptionCategory::System) at /home/michi/development/git/libreoffice/desktop/source/app/app.cxx:1212
#28 0x00007fe9420667fa in VCLExceptionSignal_impl (pInfo=0x7fe8e27d9d88) at /home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:178
#29 0x00007fe94b2484aa in callSignalHandler (pInfo=0x7fe8e27d9d88) at /home/michi/development/git/libreoffice/sal/osl/all/signalshared.cxx:47
#30 0x00007fe94b2dc3d3 in (anonymous namespace)::signalHandlerFunction (signal=6, info=0x7fe8e27d9fb0, context=0x7fe8e27d9e80) at /home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:423
#31 0x00007fe94ac49df0 in <signal handler called> () at /lib/x86_64-linux-gnu/libc.so.6
#32 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at ./nptl/pthread_kill.c:44
#33 0x00007fe94ac9e9ff in __pthread_kill_internal (threadid=<optimized out>, signo=6) at ./nptl/pthread_kill.c:89
#34 0x00007fe94ac49cc2 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#35 0x00007fe94ac324ac in __GI_abort () at ./stdlib/abort.c:73
#36 0x00007fe93850641d in qAbort () at /home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:46
#37 0x00007fe93854dd9a in qt_maybe_message_fatal<QString&> (msgType=QtFatalMsg, context=..., message=...) at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:2140
#38 0x00007fe938547004 in qt_message (msgType=QtFatalMsg, context=..., msg=0x7fe938ca8eb2 "ASSERT: \"%s\" in file %s, line %d", ap=0x7fe8e27dae30) at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:412
#39 0x00007fe93854934d in QMessageLogger::fatal (this=0x7fe8e27dafd8, msg=0x7fe938ca8eb2 "ASSERT: \"%s\" in file %s, line %d") at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:901
#40 0x00007fe93850646b in qt_assert (assertion=0x7fe935abd3d7 "subject == PW_ID_CORE", file=0x7fe935abcca8 "/home/michi/development/git/qt5/qtmultimedia/src/multimedia/pipewire/qpipewire_audiocontextmanager.cpp", line=267)
at /home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:106
#41 0x00007fe9359e3b3c in QtPipeWire::QAudioContextManager::startListenDefaultMetadata(QtPipeWire::StrongIdType<unsigned int, QtPipeWire::ObjectIdTag>, unsigned int)::$_0::operator()(void*, unsigned int, char const*, char const*, char const*) const
(this=0x7fe8e27db0c7, data=0x7fe935c05d10 <QGlobalStatic<QtGlobalStatic::Holder<QtPipeWire::(anonymous namespace)::Q_QGS_s_audioContextInstance> >::instance()::holder>, subject=113, key=0x5614a39ce960 "target.node", type=0x5614a39ce978 "Spa:Id", value=0x5614a39ce988 "-1") at /home/michi/development/git/qt5/qtmultimedia/src/multimedia/pipewire/qpipewire_audiocontextmanager.cpp:267
#42 0x00007fe9359e2ce8 in QtPipeWire::QAudioContextManager::startListenDefaultMetadata(QtPipeWire::StrongIdType<unsigned int, QtPipeWire::ObjectIdTag>, unsigned int)::$_0::__invoke(void*, unsigned int, char const*, char const*, char const*)
(data=0x7fe935c05d10 <QGlobalStatic<QtGlobalStatic::Holder<QtPipeWire::(anonymous namespace)::Q_QGS_s_audioContextInstance> >::instance()::holder>, subject=113, key=0x5614a39ce960 "target.node", type=0x5614a39ce978 "Spa:Id", value=0x5614a39ce988 "-1") at /home/michi/development/git/qt5/qtmultimedia/src/multimedia/pipewire/qpipewire_audiocontextmanager.cpp:265
#43 0x00007fe8f1574054 in ??? () at /usr/lib/x86_64-linux-gnu/pipewire-0.3/libpipewire-module-metadata.so
#44 0x00007fe8f0d61671 in ??? () at /usr/lib/x86_64-linux-gnu/pipewire-0.3/libpipewire-module-protocol-native.so
#45 0x00007fe8f0d61e08 in ??? () at /usr/lib/x86_64-linux-gnu/pipewire-0.3/libpipewire-module-protocol-native.so
#46 0x00007fe8f2dd5c46 in ??? () at /usr/lib/x86_64-linux-gnu/spa-0.2/support/libspa-support.so
#47 0x00007fe935347b55 in ??? () at /lib/x86_64-linux-gnu/libpipewire-0.3.so.0
#48 0x00007fe94ac9cb7b in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:448
#49 0x00007fe94ad1a7b8 in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
Change-Id: I5f9f1f82d8ca76a50872d0b81b67059f78d413fc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184896
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'sc/source/ui/vba/vbaapplication.hxx')
0 files changed, 0 insertions, 0 deletions