diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-08-20 10:14:19 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-08-20 11:13:46 +0200 |
commit | d3b03032b7140a98946bfe8fc475a322e6eb6f9a (patch) | |
tree | 3a0ce8015c31df0c8bc0c5b33bf9b3c36b2a203c /framework | |
parent | 1618a3cee763fe9c3393e0511244547674bdd264 (diff) |
tdf#125869 LibreOffice UI freezes (shows not responding) while exporting a pdf
Revert "use vcl::Timer in StatusIndicatorFactory"
This reverts commit 848058625c7fad21e2469c95c2a2078678925a5a,
which seems to have been a bad idea
Change-Id: I68be1757717352f164ce27c300a4a0487680891c
Reviewed-on: https://gerrit.libreoffice.org/77779
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'framework')
-rw-r--r-- | framework/Library_fwk.mk | 1 | ||||
-rw-r--r-- | framework/inc/helper/statusindicatorfactory.hxx | 7 | ||||
-rw-r--r-- | framework/inc/helper/wakeupthread.hxx | 57 | ||||
-rw-r--r-- | framework/source/helper/statusindicatorfactory.cxx | 25 | ||||
-rw-r--r-- | framework/source/helper/wakeupthread.cxx | 60 |
5 files changed, 132 insertions, 18 deletions
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk index 7a433735ce43..6d1f124f2f5a 100644 --- a/framework/Library_fwk.mk +++ b/framework/Library_fwk.mk @@ -88,6 +88,7 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/helper/uiconfigelementwrapperbase \ framework/source/helper/uielementwrapperbase \ framework/source/helper/vclstatusindicator \ + framework/source/helper/wakeupthread \ framework/source/interaction/quietinteraction \ framework/source/jobs/job \ framework/source/jobs/jobdata \ diff --git a/framework/inc/helper/statusindicatorfactory.hxx b/framework/inc/helper/statusindicatorfactory.hxx index a2a073821d8e..4f6e183e8a54 100644 --- a/framework/inc/helper/statusindicatorfactory.hxx +++ b/framework/inc/helper/statusindicatorfactory.hxx @@ -25,6 +25,7 @@ #include <vector> // include files of own module +#include <helper/wakeupthread.hxx> #include <general.h> // include uno interfaces @@ -44,9 +45,7 @@ #include <com/sun/star/uno/XComponentContext.hpp> #include <cppuhelper/supportsservice.hxx> -#include <cppuhelper/weakref.hxx> #include <vcl/status.hxx> -#include <vcl/timer.hxx> #include <cppuhelper/implbase.hxx> #include <osl/thread.hxx> @@ -166,7 +165,7 @@ class StatusIndicatorFactory : public ::cppu::WeakImplHelper< /** Notify us if a fix time is over. We use it to implement an intelligent "Reschedule" ... */ - boost::optional<Timer> m_xWakeUpTimer; + rtl::Reference<WakeUpThread> m_pWakeUp; /** Our WakeUpThread calls us in our interface method "XUpdatable::update(). There we set this member m_bAllowReschedule to sal_True. Next time if our impl_reschedule() @@ -183,8 +182,6 @@ class StatusIndicatorFactory : public ::cppu::WeakImplHelper< /** prevent recursive calling of Application::Reschedule(). */ static sal_Int32 m_nInReschedule; - DECL_LINK( WakeupTimerHdl, Timer*, void ); - // interface public: diff --git a/framework/inc/helper/wakeupthread.hxx b/framework/inc/helper/wakeupthread.hxx new file mode 100644 index 000000000000..50e234f23713 --- /dev/null +++ b/framework/inc/helper/wakeupthread.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_INC_HELPER_WAKEUPTHREAD_HXX +#define INCLUDED_FRAMEWORK_INC_HELPER_WAKEUPTHREAD_HXX + +#include <sal/config.h> + +#include <com/sun/star/uno/Reference.hxx> +#include <cppuhelper/weakref.hxx> +#include <osl/conditn.hxx> +#include <osl/mutex.hxx> +#include <sal/types.h> +#include <salhelper/thread.hxx> + +namespace com { namespace sun { namespace star { namespace util { + class XUpdatable; +} } } } + +namespace framework{ + +class WakeUpThread: public salhelper::Thread { + css::uno::WeakReference<css::util::XUpdatable> updatable_; + osl::Condition condition_; + + osl::Mutex mutex_; + bool terminate_; + + void execute() override; + +public: + WakeUpThread(css::uno::Reference<css::util::XUpdatable> const & updatable); + + void stop(); +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/helper/statusindicatorfactory.cxx b/framework/source/helper/statusindicatorfactory.cxx index ee33a646cadd..5e4ba3adf4e3 100644 --- a/framework/source/helper/statusindicatorfactory.cxx +++ b/framework/source/helper/statusindicatorfactory.cxx @@ -537,27 +537,26 @@ void StatusIndicatorFactory::impl_startWakeUpThread() if (m_bDisableReschedule) return; - if (!m_xWakeUpTimer) + if (!m_pWakeUp.is()) { - m_xWakeUpTimer = Timer(); - m_xWakeUpTimer->SetInvokeHandler( LINK(this, StatusIndicatorFactory, WakeupTimerHdl) ); - m_xWakeUpTimer->SetTimeout(25); // 25 msec - m_xWakeUpTimer->Start(); + m_pWakeUp = new WakeUpThread(this); + m_pWakeUp->launch(); } } void StatusIndicatorFactory::impl_stopWakeUpThread() { - if (m_xWakeUpTimer) - m_xWakeUpTimer->Stop(); -} - -IMPL_LINK_NOARG(StatusIndicatorFactory, WakeupTimerHdl, Timer *, void) -{ - update(); + rtl::Reference<WakeUpThread> wakeUp; + { + osl::MutexGuard g(m_mutex); + std::swap(wakeUp, m_pWakeUp); + } + if (wakeUp.is()) + { + wakeUp->stop(); + } } - } // namespace framework extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * diff --git a/framework/source/helper/wakeupthread.cxx b/framework/source/helper/wakeupthread.cxx new file mode 100644 index 000000000000..503f6707a010 --- /dev/null +++ b/framework/source/helper/wakeupthread.cxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sal/config.h> + +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/util/XUpdatable.hpp> +#include <osl/mutex.hxx> +#include <osl/time.h> + +#include <helper/wakeupthread.hxx> + +void framework::WakeUpThread::execute() { + for (;;) { + TimeValue t{0, 25000000}; // 25 msec + condition_.wait(&t); + { + osl::MutexGuard g(mutex_); + if (terminate_) { + break; + } + } + css::uno::Reference<css::util::XUpdatable> up(updatable_); + if (up.is()) { + up->update(); + } + } +} + +framework::WakeUpThread::WakeUpThread( + css::uno::Reference<css::util::XUpdatable> const & updatable): + Thread("WakeUpThread"), updatable_(updatable), terminate_(false) +{} + +void framework::WakeUpThread::stop() { + { + osl::MutexGuard g(mutex_); + terminate_ = true; + } + condition_.set(); + join(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |