[Libreoffice-commits] core.git: include/vcl sw/source vcl/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Aug 29 08:10:38 UTC 2018


 include/vcl/scheduler.hxx                   |   12 ++++++++++++
 sw/source/core/doc/DocumentTimerManager.cxx |   25 +++++++++++++------------
 vcl/source/app/scheduler.cxx                |    5 +++++
 3 files changed, 30 insertions(+), 12 deletions(-)

New commits:
commit 3bd8316718fdfed454c01a9c4ae6af6beb34437d
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Tue Aug 28 15:24:26 2018 +0000
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Wed Aug 29 10:10:14 2018 +0200

    tdf#119458 just wakeup Scheduler on active Idle
    
    So this almost returns the code to the original state, before I
    started fixing tdf#116370... a long way. This introduces the new
    Scheduler::Wakeup() function, which will just queue a Scheduler
    event in the System event queue unconditionally.
    
    This should prevent fdo#73165, which I couldn't reproduce, but
    just to be sure.
    
    More importantly this patch resets the m_bStartOnUnblock when
    the Idle job actually runs. This run should already determinates
    if more Idle work needs to be done, and others can still call
    BeginIdling() to ensure further processing.
    
    This also drops the IsBusyDoc() test from UnblockIdling(). We
    can't really know, if the document is still busy when the
    Scheduler is finally running, be it by the system timer or
    Application::Reschedule().
    
    Change-Id: I6cc4a3c48dcaf62b6985c7bc1c95c96697443f3b
    Reviewed-on: https://gerrit.libreoffice.org/59730
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx
index ac429ed33b09..6233d134a8ed 100644
--- a/include/vcl/scheduler.hxx
+++ b/include/vcl/scheduler.hxx
@@ -65,6 +65,18 @@ public:
      */
     static void       ProcessEventsToIdle();
 
+    /**
+     * Wakes up the scheduler
+     *
+     * This doesn't handle any events! It just ensures the Scheduler is run as
+     * soon as possible by forcing the Scheduler timer to fire.
+     *
+     * Can be used for complex UpdateMinPeriod function, where the task is
+     * actually active but not ready and we want to skip the Task::Start()
+     * queue append for faster reaction.
+     */
+    static void       Wakeup();
+
     /// Control the deterministic mode.  In this mode, two subsequent runs of
     /// LibreOffice fire about the same amount idles.
     static void       SetDeterministicMode(bool bDeterministic);
diff --git a/sw/source/core/doc/DocumentTimerManager.cxx b/sw/source/core/doc/DocumentTimerManager.cxx
index 81c46b125840..7bd2e505a3a4 100644
--- a/sw/source/core/doc/DocumentTimerManager.cxx
+++ b/sw/source/core/doc/DocumentTimerManager.cxx
@@ -33,6 +33,7 @@
 #include <docsh.hxx>
 #include <docfld.hxx>
 #include <fldbas.hxx>
+#include <vcl/scheduler.hxx>
 
 namespace sw
 {
@@ -49,10 +50,14 @@ DocumentTimerManager::DocumentTimerManager( SwDoc& i_rSwdoc ) : m_rDoc( i_rSwdoc
 
 void DocumentTimerManager::StartIdling()
 {
-    if (m_nIdleBlockCount > 0)
-        m_bStartOnUnblock = true;
-    else if (!m_aDocIdle.IsActive())
-        m_aDocIdle.Start();
+    m_bStartOnUnblock = true;
+    if (0 == m_nIdleBlockCount)
+    {
+        if (!m_aDocIdle.IsActive())
+            m_aDocIdle.Start();
+        else
+            Scheduler::Wakeup();
+    }
 }
 
 void DocumentTimerManager::StopIdling()
@@ -64,11 +69,6 @@ void DocumentTimerManager::StopIdling()
 void DocumentTimerManager::BlockIdling()
 {
     assert(SAL_MAX_UINT32 != m_nIdleBlockCount);
-    if (0 == m_nIdleBlockCount)
-    {
-        assert(!m_bStartOnUnblock);
-        m_bStartOnUnblock = false;
-    }
     ++m_nIdleBlockCount;
 }
 
@@ -79,10 +79,10 @@ void DocumentTimerManager::UnblockIdling()
 
     if ((0 == m_nIdleBlockCount) && m_bStartOnUnblock)
     {
-        m_bStartOnUnblock = false;
-        // kick the active idle, if it's not anymore blocked by IsDocIdle()
-        if (IsDocIdle())
+        if (!m_aDocIdle.IsActive())
             m_aDocIdle.Start();
+        else
+            Scheduler::Wakeup();
     }
 }
 
@@ -137,6 +137,7 @@ IMPL_LINK_NOARG( DocumentTimerManager, DoIdleJobs, Timer*, void )
         pModLogFile = new ::rtl::Logfile( "First DoIdleJobs" );
 #endif
     BlockIdling();
+    StopIdling();
 
     IdleJob eJob = GetNextIdleJob();
 
diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx
index 4a35115f2db3..93fcfeca7df9 100644
--- a/vcl/source/app/scheduler.cxx
+++ b/vcl/source/app/scheduler.cxx
@@ -506,6 +506,11 @@ next_entry:
     return !!pMostUrgent;
 }
 
+void Scheduler::Wakeup()
+{
+    Scheduler::ImplStartTimer( 0, false, tools::Time::GetSystemTicks() );
+}
+
 void Task::StartTimer( sal_uInt64 nMS )
 {
     Scheduler::ImplStartTimer( nMS, false, tools::Time::GetSystemTicks() );


More information about the Libreoffice-commits mailing list