vcl/inc/qt5/QtInstanceDialog.hxx |    1 +
 vcl/qt5/QtInstanceDialog.cxx     |    7 +++++++
 2 files changed, 8 insertions(+)

New commits:
commit 1eb49aa3a5abc81c4a23b5371a9f733689edb1b4
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Fri Aug 30 10:14:04 2024 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Fri Aug 30 13:25:01 2024 +0200

    tdf#162696 qt weld: Destroy QDialog in main thread
    
    Besides the obvious cases handled in previous commit
    
        Change-Id: Ifa84a038fc56f34958cd732caeb9c436b48b3c75
        Author: Michael Weghorn <m.wegh...@posteo.de>
        Date:   Fri Aug 30 10:12:21 2024 +0200
    
            tdf#162696 qt weld: Do GUI things in main thread
    
    , the destruction of `QtInstanceDialog::m_pDialog` (that
    previously implicitly happened due to it being a
    `std::unique_ptr`) also needs to happen in the main
    thread.
    
    Otherwise, it triggers this assert with a debug Qt build
    for the tdf#162696 of installing an extension via drag'n'drop
    into the start center:
    
        ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to 
objects owned by a different thread. Current thread QThread(0x7f4b14003390). 
Receiver 'QDialog(0x562e6ba77450)' was created in thread 
QThread(0x562e69709f60, name = "Qt mainThread")", file 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp, 
line 551
        terminate called after throwing an instance of 
'com::sun::star::uno::RuntimeException'
    
        Fatal exception: Signal 6
        Stack:
        #0 sal::backtrace_get(unsigned int) at 
/home/michi/development/git/libreoffice/sal/osl/unx/backtraceapi.cxx:42
        #1 (anonymous namespace)::printStack(int) at 
/home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:289
        #2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at 
/home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:330
        #3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*) 
at /home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:427
        #4 /lib/x86_64-linux-gnu/libc.so.6(+0x3f590) [0x7f4be7455590]
        #5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44 
(discriminator 1)
        #6 raise at ./signal/../sysdeps/posix/raise.c:27
        #7 abort at ./stdlib/abort.c:81
        #8 /lib/x86_64-linux-gnu/libstdc++.so.6(+0xa1a3d) [0x7f4be70a1a3d]
        #9 /lib/x86_64-linux-gnu/libstdc++.so.6(+0xb306a) [0x7f4be70b306a]
        #10 std::unexpected() in /lib/x86_64-linux-gnu/libstdc++.so.6
        #11 
/home/michi/development/git/qt5/qtbase/lib/libQt6Core.so.6(+0xed562) 
[0x7f4bd2eed562]
        #12 QMessageLogger::fatal() const at 
/home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:901
        #13 qt_assert_x(char const*, char const*, char const*, int) at 
/home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:0
        #14 QCoreApplicationPrivate::checkReceiverThread(QObject*) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:0
        #15 QApplication::notify(QObject*, QEvent*) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:2583
        #16 QCoreApplication::notifyInternal2(QObject*, QEvent*) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1170
        #17 QCoreApplication::sendEvent(QObject*, QEvent*) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1614
        #18 QWidgetPrivate::setVisible(bool) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:8415
        #19 QDialogPrivate::setVisible(bool) at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:832
        #20 QMessageBoxPrivate::setVisible(bool) at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:1676
        #21 QDialog::setVisible(bool) at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:750
        #22 QWidget::hide() at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:8176
        #23 QDialog::~QDialog() at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:390
        #24 QMessageBox::~QMessageBox() at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:879
        #25 QMessageBox::~QMessageBox() at 
/home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:878
        #26 std::default_delete<QDialog>::operator()(QDialog*) const at 
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:94
        #27 std::unique_ptr<QDialog, 
std::default_delete<QDialog>>::~unique_ptr() at 
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:398
        #28 QtInstanceDialog::~QtInstanceDialog() at 
/home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceDialog.hxx:14
        #29 QtInstanceMessageDialog::~QtInstanceMessageDialog() at 
/home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16
        #30 QtInstanceMessageDialog::~QtInstanceMessageDialog() at 
/home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16
        #31 QtInstanceMessageDialog::~QtInstanceMessageDialog() at 
/home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16
        #32 
std::default_delete<weld::MessageDialog>::operator()(weld::MessageDialog*) 
const at 
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:94
        #33 std::__uniq_ptr_impl<weld::MessageDialog, 
std::default_delete<weld::MessageDialog>>::reset(weld::MessageDialog*) at 
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:206
        #34 std::unique_ptr<weld::MessageDialog, 
std::default_delete<weld::MessageDialog>>::reset(weld::MessageDialog*) at 
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:504
        #35 
dp_gui::DialogHelper::installExtensionWarn(std::basic_string_view<char16_t, 
std::char_traits<char16_t>>) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_dialog2.cxx:379
        #36 dp_gui::(anonymous 
namespace)::ProgressCmdEnv::handle(com::sun::star::uno::Reference<com::sun::star::task::XInteractionRequest>
 const&) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:477
        #37 dp_misc::interactContinuation(com::sun::star::uno::Any const&, 
com::sun::star::uno::Type const&, 
com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> 
const&, bool*, bool*) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/misc/dp_interact.cxx:114
        #38 dp_manager::ExtensionManager::checkInstall(rtl::OUString const&, 
com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> 
const&) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:1315
        #39 
dp_manager::ExtensionManager::doChecksForAddExtension(com::sun::star::uno::Reference<com::sun::star::deployment::XPackageManager>
 const&, com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> 
const&, com::sun::star::uno::Reference<com::sun::star::deployment::XPackage> 
const&, com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> 
const&, 
com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> 
const&, com::sun::star::uno::Reference<com::sun::star::deployment::XPackage>&) 
at 
/home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:565
        #40 dp_manager::ExtensionManager::addExtension(rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> const&, 
rtl::OUString const&, 
com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> const&, 
com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> 
const&) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:655
        #41 non-virtual thunk to 
dp_manager::ExtensionManager::addExtension(rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> const&, 
rtl::OUString const&, 
com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> const&, 
com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> 
const&) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:0
        #42 
dp_gui::ExtensionCmdQueue::Thread::_addExtension(rtl::Reference<dp_gui::(anonymous
 namespace)::ProgressCmdEnv> const&, rtl::OUString const&, rtl::OUString 
const&, bool) at 
/home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:864
        #43 dp_gui::ExtensionCmdQueue::Thread::execute() at 
/home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:738
        #44 salhelper::Thread::run() at 
/home/michi/development/git/libreoffice/salhelper/source/thread.cxx:39
        #45 threadFunc at 
/home/michi/development/git/libreoffice/include/osl/thread.hxx:190
        #46 osl_thread_start_Impl(void*) at 
/home/michi/development/git/libreoffice/sal/osl/unx/thread.cxx:245
        #47 start_thread at ./nptl/pthread_create.c:447
        #48 clone3 at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80
    
    Change-Id: Idb5b20bde8c306ed14efd5467887d55fdf470202
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172643
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    Tested-by: Jenkins

diff --git a/vcl/inc/qt5/QtInstanceDialog.hxx b/vcl/inc/qt5/QtInstanceDialog.hxx
index 303206be7194..6efa77818745 100644
--- a/vcl/inc/qt5/QtInstanceDialog.hxx
+++ b/vcl/inc/qt5/QtInstanceDialog.hxx
@@ -17,6 +17,7 @@ class QtInstanceDialog : public QtInstanceWindow, public 
virtual weld::Dialog
 
 public:
     QtInstanceDialog(QDialog* pDialog);
+    ~QtInstanceDialog();
 
     virtual bool runAsync(std::shared_ptr<Dialog> const&,
                           const std::function<void(sal_Int32)>&) override;
diff --git a/vcl/qt5/QtInstanceDialog.cxx b/vcl/qt5/QtInstanceDialog.cxx
index 14a4774c8671..36f7e75c4fc8 100644
--- a/vcl/qt5/QtInstanceDialog.cxx
+++ b/vcl/qt5/QtInstanceDialog.cxx
@@ -15,6 +15,13 @@ QtInstanceDialog::QtInstanceDialog(QDialog* pDialog)
 {
 }
 
+QtInstanceDialog::~QtInstanceDialog()
+{
+    SolarMutexGuard g;
+    QtInstance* pQtInstance = GetQtInstance();
+    pQtInstance->RunInMainThread([&] { m_pDialog.reset(); });
+}
+
 bool QtInstanceDialog::runAsync(std::shared_ptr<Dialog> const&,
                                 const std::function<void(sal_Int32)>&)
 {

Reply via email to