[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - desktop/inc desktop/source
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Tue Oct 5 18:20:08 UTC 2021
desktop/inc/lib/init.hxx | 9 +++++++++
desktop/source/lib/init.cxx | 23 +++++++++++++++++++++--
2 files changed, 30 insertions(+), 2 deletions(-)
New commits:
commit 24ad72393a26a0d6f2a0f2d79acc51fc28533234
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Fri Sep 24 00:11:04 2021 +0200
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Tue Oct 5 20:19:32 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.
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122737
Tested-by: Luboš Luňák <l.lunak at collabora.com>
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
(cherry picked from commit 3f6f1a45c1f4225817188f97721e6546e38871e2)
Change-Id: Ia1312a690aefd2c8628c82e0f42b2993802d8b1e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122943
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx
index 580a8e47d9a5..ef8494ed7b0d 100644
--- a/desktop/inc/lib/init.hxx
+++ b/desktop/inc/lib/init.hxx
@@ -144,6 +144,15 @@ namespace desktop {
int m_nDisableCallbacks;
bool m_bEventLatch;
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 71098de551cb..9edc10d013e4 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1405,13 +1405,29 @@ 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_bEventLatch(false)
+ m_bEventLatch(false),
+ m_TimeoutIdle( this )
{
SetPriority(TaskPriority::POST_PAINT);
@@ -1708,6 +1724,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)
@@ -2094,6 +2112,7 @@ void CallbackFlushHandler::Invoke()
m_queue1.clear();
m_queue2.clear();
+ m_TimeoutIdle.Stop();
}
}
More information about the Libreoffice-commits
mailing list