[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - compilerplugins/clang desktop/inc desktop/source

Ashod Nakashian (via logerrit) logerrit at kemper.freedesktop.org
Mon Dec 2 03:43:13 UTC 2019


 compilerplugins/clang/unusedmethods.results |    6 ----
 desktop/inc/lib/init.hxx                    |   19 +++++++--------
 desktop/source/lib/init.cxx                 |   34 +++++++++++++++++++---------
 3 files changed, 33 insertions(+), 26 deletions(-)

New commits:
commit 35aa4c881fc8c0c704530f042c31fbbe78a022f8
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Sat Nov 30 18:14:06 2019 -0500
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Mon Dec 2 04:42:35 2019 +0100

    desktop: disable callback handling while changing the view
    
    When changing the view, some components are disabled
    and re-enabled. This triggers a flood of invalidations
    that then result in rendering requests. For each rendering
    the view is set, which triggers more invalidations.
    
    The Sidebar suffers from this, and it causes cpu pegging.
    This fix prevents this issue by disabling all callbacks
    during setView.
    
    Change-Id: If6b93b2ab31f568a0761f15d945a43de1bc2d4d0
    Reviewed-on: https://gerrit.libreoffice.org/84184
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/compilerplugins/clang/unusedmethods.results b/compilerplugins/clang/unusedmethods.results
index 8615e583236e..dd65da7e11ea 100644
--- a/compilerplugins/clang/unusedmethods.results
+++ b/compilerplugins/clang/unusedmethods.results
@@ -64,12 +64,6 @@ dbaccess/source/ui/inc/indexcollection.hxx:63
     class __gnu_debug::_Safe_iterator<class __gnu_cxx::__normal_iterator<const struct dbaui::OIndex *, class std::__cxx1998::vector<struct dbaui::OIndex, class std::allocator<struct dbaui::OIndex> > >, class std::__debug::vector<struct dbaui::OIndex, class std::allocator<struct dbaui::OIndex> > > dbaui::OIndexCollection::find(const class rtl::OUString &) const
 dbaccess/source/ui/inc/indexcollection.hxx:65
     class __gnu_debug::_Safe_iterator<class __gnu_cxx::__normal_iterator<const struct dbaui::OIndex *, class std::__cxx1998::vector<struct dbaui::OIndex, class std::allocator<struct dbaui::OIndex> > >, class std::__debug::vector<struct dbaui::OIndex, class std::allocator<struct dbaui::OIndex> > > dbaui::OIndexCollection::findOriginal(const class rtl::OUString &) const
-desktop/inc/lib/init.hxx:42
-    void desktop::CallbackFlushHandler::setEventLatch(const _Bool)
-desktop/inc/lib/init.hxx:47
-    _Bool desktop::CallbackFlushHandler::isEventLatchOn() const
-desktop/inc/lib/init.hxx:49
-    _Bool desktop::CallbackFlushHandler::isPartTilePainting() const
 drawinglayer/source/tools/emfpcustomlinecap.hxx:37
     void emfplushelper::EMFPCustomLineCap::SetAttributes(struct com::sun::star::rendering::StrokeAttributes &)
 drawinglayer/source/tools/emfppen.hxx:71
diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx
index 3587ba003e37..5957f56ed344 100644
--- a/desktop/inc/lib/init.hxx
+++ b/desktop/inc/lib/init.hxx
@@ -79,15 +79,14 @@ namespace desktop {
         static void callback(const int type, const char* payload, void* data);
         void queue(const int type, const char* data);
 
-        /// When enabled events are queued but callback not invoked.
-        void setEventLatch(const bool bEventLatch)
-        {
-            m_bEventLatch = bEventLatch;
-        }
-
-        bool isEventLatchOn() const { return m_bEventLatch; }
-        void setPartTilePainting(const bool bPartPainting) { m_bPartTilePainting = bPartPainting; }
-        bool isPartTilePainting() const { return m_bPartTilePainting; }
+        /// Disables callbacks on this handler. Must match with identical count
+        /// of enableCallbacks. Used during painting and changing views.
+        void disableCallbacks() { ++m_nDisableCallbacks; }
+        /// Enables callbacks on this handler. Must match with identical count
+        /// of disableCallbacks. Used during painting and changing views.
+        void enableCallbacks() { --m_nDisableCallbacks; }
+        /// Returns true iff callbacks are disabled.
+        bool callbacksDisabled() const { return m_nDisableCallbacks != 0; }
 
         void addViewStates(int viewId);
         void removeViewStates(int viewId);
@@ -140,7 +139,7 @@ namespace desktop {
         LibreOfficeKitDocument* m_pDocument;
         LibreOfficeKitCallback m_pCallback;
         void *m_pData;
-        bool m_bPartTilePainting;
+        int m_nDisableCallbacks;
         bool m_bEventLatch;
         std::mutex m_mutex;
     };
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index b55fa59955f2..afbd4d283b35 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1077,7 +1077,7 @@ CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, Li
       m_pDocument(pDocument),
       m_pCallback(pCallback),
       m_pData(pData),
-      m_bPartTilePainting(false),
+      m_nDisableCallbacks(0),
       m_bEventLatch(false)
 {
     SetPriority(TaskPriority::POST_PAINT);
@@ -1127,7 +1127,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
         bIsChartActive = aChartHelper.GetWindow() != nullptr;
     }
 
-    if (m_bPartTilePainting && !bIsChartActive)
+    if (callbacksDisabled() && !bIsChartActive)
     {
         // We drop notifications when this is set, except for important ones.
         // When we issue a complex command (such as .uno:InsertAnnotation)
@@ -2860,9 +2860,9 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
     // Disable callbacks while we are painting.
     if (nOrigViewId >= 0)
     {
-        auto findIt = pDocument->mpCallbackFlushHandlers.find(nOrigViewId);
-        if (findIt != pDocument->mpCallbackFlushHandlers.end())
-            findIt->second->setPartTilePainting(true);
+        const auto handlerIt = pDocument->mpCallbackFlushHandlers.find(nOrigViewId);
+        if (handlerIt != pDocument->mpCallbackFlushHandlers.end())
+            handlerIt->second->disableCallbacks();
     }
 
     try
@@ -2915,9 +2915,9 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
 
     if (nOrigViewId >= 0)
     {
-        auto findIt = pDocument->mpCallbackFlushHandlers.find(nOrigViewId);
-        if (findIt != pDocument->mpCallbackFlushHandlers.end())
-            findIt->second->setPartTilePainting(false);
+        const auto handlerIt = pDocument->mpCallbackFlushHandlers.find(nOrigViewId);
+        if (handlerIt != pDocument->mpCallbackFlushHandlers.end())
+            handlerIt->second->enableCallbacks();
     }
 }
 
@@ -4665,14 +4665,28 @@ static void doc_destroyView(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis
     SfxLokHelper::destroyView(nId);
 }
 
-static void doc_setView(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/, int nId)
+static void doc_setView(LibreOfficeKitDocument* pThis, int nId)
 {
     comphelper::ProfileZone aZone("doc_setView");
 
     SolarMutexGuard aGuard;
     SetLastExceptionMsg();
 
-    SfxLokHelper::setView(nId);
+    LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
+    const auto handlerIt = pDocument->mpCallbackFlushHandlers.find(nId);
+    if (handlerIt != pDocument->mpCallbackFlushHandlers.end())
+        handlerIt->second->disableCallbacks();
+
+    try
+    {
+        SfxLokHelper::setView(nId);
+    }
+    catch (const std::exception&)
+    {
+    }
+
+    if (handlerIt != pDocument->mpCallbackFlushHandlers.end())
+        handlerIt->second->enableCallbacks();
 }
 
 static int doc_getView(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/)


More information about the Libreoffice-commits mailing list