framework/Library_fwk.mk | 1 framework/inc/helper/statusindicatorfactory.hxx | 7 -- framework/inc/helper/wakeupthread.hxx | 57 +++++++++++++++++++ framework/source/helper/statusindicatorfactory.cxx | 25 ++++---- framework/source/helper/wakeupthread.cxx | 60 +++++++++++++++++++++ 5 files changed, 132 insertions(+), 18 deletions(-)
New commits: commit ff3cfee4ebfcb412f54f17ffccc95512fdc15c8e Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Tue Aug 20 10:14:19 2019 +0200 Commit: Xisco FaulĂ <xiscofa...@libreoffice.org> CommitDate: Tue Aug 20 13:42:22 2019 +0200 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/77791 Tested-by: Jenkins Reviewed-by: Xisco FaulĂ <xiscofa...@libreoffice.org> diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk index 3957a5ace0ff..9057aaa6048a 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 1ad060516313..d343fe35395e 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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits