desktop/inc/lib/init.hxx    |    9 +++++++++
 desktop/source/lib/init.cxx |   26 ++++++++++++++++++++++----
 2 files changed, 31 insertions(+), 4 deletions(-)

New commits:
commit 6552ec19d1920a0c4ab074b4a16afc0fe39296f3
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Fri Sep 24 00:11:04 2021 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Tue Sep 28 14:01:07 2021 +0200

    add extra timeout with higher priority to LOK flushing
    
    The normal idle has TaskPriority::POST_PAINT, which means that
    if we get too busy, the idle won't be called for a long time,
    meaning the queue will get longer and longer, making its processing
    slower, and client interactivity will be very poor, with updates
    possibly coming only when everything becomes idle.
    
    The second timeout will flush the queue after a reasonable timeout.
    I don't think there's an optimal value, so let's choose 100ms for now.
    
    Change-Id: Ia1312a690aefd2c8628c82e0f42b2993802d8b1e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122728
    Tested-by: Luboš Luňák <l.lu...@collabora.com>
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx
index 2693e67eb718..95468b494189 100644
--- a/desktop/inc/lib/init.hxx
+++ b/desktop/inc/lib/init.hxx
@@ -147,6 +147,15 @@ namespace desktop {
         void *m_pData;
         int m_nDisableCallbacks;
         std::mutex m_mutex;
+        class TimeoutIdle : public Timer
+        {
+        public:
+            TimeoutIdle( CallbackFlushHandler* handler );
+            virtual void Invoke() override;
+        private:
+            CallbackFlushHandler* mHandler;
+        };
+        TimeoutIdle m_TimeoutIdle;
     };
 
     struct DESKTOP_DLLPUBLIC LibLODocument_Impl : public 
_LibreOfficeKitDocument
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 9274be462370..15c0eb281a38 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1386,12 +1386,28 @@ static OUString getGenerator()
 
 extern "C" {
 
+CallbackFlushHandler::TimeoutIdle::TimeoutIdle( CallbackFlushHandler* handler )
+    : Timer( "lokit timer callback" )
+    , mHandler( handler )
+{
+    // A second timer with higher priority, it'll ensure we flush in 
reasonable time if we get too busy
+    // to get POST_PAINT priority processing. Otherwise it could take a long 
time to flush.
+    SetPriority(TaskPriority::DEFAULT);
+    SetTimeout( 100 ); // 100 ms
+}
+
+void CallbackFlushHandler::TimeoutIdle::Invoke()
+{
+    mHandler->Invoke();
+}
+
 CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, 
LibreOfficeKitCallback pCallback, void* pData)
-    : Idle( "lokit timer callback" ),
+    : Idle( "lokit idle callback" ),
       m_pDocument(pDocument),
       m_pCallback(pCallback),
       m_pData(pData),
-      m_nDisableCallbacks(0)
+      m_nDisableCallbacks(0),
+      m_TimeoutIdle( this )
 {
     SetPriority(TaskPriority::POST_PAINT);
 
@@ -1408,8 +1424,6 @@ 
CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, Li
     m_states.emplace(LOK_CALLBACK_CURSOR_VISIBLE, "NIL");
     m_states.emplace(LOK_CALLBACK_SET_PART, "NIL");
     m_states.emplace(LOK_CALLBACK_TABLE_SELECTED, "NIL");
-
-    Start();
 }
 
 CallbackFlushHandler::~CallbackFlushHandler()
@@ -1690,6 +1704,8 @@ void CallbackFlushHandler::queue(const int type, const 
char* data)
     {
         Start();
     }
+    if (!m_TimeoutIdle.IsActive())
+        m_TimeoutIdle.Start();
 }
 
 bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& 
aCallbackData)
@@ -2053,6 +2069,8 @@ void CallbackFlushHandler::Invoke()
 
     m_queue1.clear();
     m_queue2.clear();
+    Stop();
+    m_TimeoutIdle.Stop();
 }
 
 bool CallbackFlushHandler::removeAll(int type)

Reply via email to