[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - include/vcl offapi/com toolkit/source vcl/source

Jan Holesovsky kendy at collabora.com
Tue May 31 15:37:51 UTC 2016


 include/vcl/scheduler.hxx                        |    9 ++++++-
 offapi/com/sun/star/awt/XToolkitExperimental.idl |   16 ++++++++-----
 toolkit/source/awt/vclxtoolkit.cxx               |   12 +++++++++-
 vcl/source/app/idle.cxx                          |   27 ++++++++++++++++++++++-
 vcl/source/app/scheduler.cxx                     |   12 ++++++++++
 5 files changed, 67 insertions(+), 9 deletions(-)

New commits:
commit 75cfd5e81d5ba04df55053b4f52d285328fd708e
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Mon May 30 17:36:37 2016 +0200

    tdf#100092: Deterministic scheduling to prevent unpredictable behavior.
    
    Low priority idles can fire more or less randomly, and consequently two
    consequent runs of LibreOffice differ in the amount of the idles that have
    been performed during an operation.
    
    This commit adds a possibility to turn on a 'deterministic mode' where two
    subsequent runs of LibreOffice trigger about the same amount of events when
    they perform the same set of operations.
    
    Change-Id: I92566ef4eee20e7d604cfd48f01c4df30c77e653
    Reviewed-on: https://gerrit.libreoffice.org/25712
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx
index 95303ee..ee83c1e 100644
--- a/include/vcl/scheduler.hxx
+++ b/include/vcl/scheduler.hxx
@@ -53,6 +53,7 @@ protected:
     // These should be constexpr static, when supported.
     static const sal_uInt64 ImmediateTimeoutMs = 1;
     static const sal_uInt64 MaximumTimeoutMs = 1000 * 60; // 1 minute
+    static const sal_uInt64 InfiniteTimeoutMs = 1000 * 60 * 60 * 24; // 1 day
 
     static void ImplStartTimer(sal_uInt64 nMS, bool bForce = false);
 
@@ -90,7 +91,7 @@ public:
     Scheduler&      operator=( const Scheduler& rScheduler );
     static void ImplDeInitScheduler();
 
-    // Process one pending Timer with highhest priority
+    /// Process one pending Timer with highhest priority
     static void CallbackTaskScheduling( bool ignore );
     /// Calculate minimum timeout - and return its value.
     static sal_uInt64 CalculateMinimumTimeout( bool &bHasActiveIdles );
@@ -98,6 +99,12 @@ public:
     static bool       ProcessTaskScheduling( bool bTimerOnly );
     /// Process all events until we are idle
     static void       ProcessEventsToIdle();
+
+    /// Control the deterministic mode.  In this mode, two subsequent runs of
+    /// LibreOffice fire about the same amount idles.
+    static void SetDeterministicMode(bool bDeterministic);
+    /// Return the current state of deterministic mode.
+    static bool GetDeterministicMode();
 };
 
 #endif // INCLUDED_VCL_SCHEDULER_HXX
diff --git a/offapi/com/sun/star/awt/XToolkitExperimental.idl b/offapi/com/sun/star/awt/XToolkitExperimental.idl
index 7c5d363..89828b2 100644
--- a/offapi/com/sun/star/awt/XToolkitExperimental.idl
+++ b/offapi/com/sun/star/awt/XToolkitExperimental.idl
@@ -19,14 +19,18 @@ module com {  module sun {  module star {  module awt {
 
 interface XToolkitExperimental : XToolkit2
 {
-  /** Process all pending idle events
-   */
-  void processEventsToIdle();
+    /** Process all pending idle events
+     */
+    void processEventsToIdle();
 
 
-  /** Get the number of OpenGL buffer swaps.
-   */
-  hyper getOpenGLBufferSwapCounter();
+    /** Get the number of OpenGL buffer swaps.
+     */
+    hyper getOpenGLBufferSwapCounter();
+
+    /** Turn on or off deterministic scheduling (off is the default).
+     */
+    void setDeterministicScheduling([in] boolean bDeterministicMode);
 };
 
 }; }; }; };
diff --git a/toolkit/source/awt/vclxtoolkit.cxx b/toolkit/source/awt/vclxtoolkit.cxx
index 3b5548b..262697b 100644
--- a/toolkit/source/awt/vclxtoolkit.cxx
+++ b/toolkit/source/awt/vclxtoolkit.cxx
@@ -199,6 +199,9 @@ public:
     virtual sal_Int64 SAL_CALL getOpenGLBufferSwapCounter()
         throw (css::uno::RuntimeException, std::exception) override;
 
+    virtual void SAL_CALL setDeterministicScheduling(sal_Bool bDeterministicMode)
+        throw (css::uno::RuntimeException, std::exception) override;
+
     // css::awt::XToolkit
     css::uno::Reference< css::awt::XWindowPeer >  SAL_CALL getDesktopWindow(  ) throw(css::uno::RuntimeException, std::exception) override;
     css::awt::Rectangle                                        SAL_CALL getWorkArea(  ) throw(css::uno::RuntimeException, std::exception) override;
@@ -1922,7 +1925,14 @@ void SAL_CALL VCLXToolkit::processEventsToIdle()
 sal_Int64 SAL_CALL VCLXToolkit::getOpenGLBufferSwapCounter()
     throw (css::uno::RuntimeException, std::exception)
 {
-     return OpenGLWrapper::getBufferSwapCounter();
+    return OpenGLWrapper::getBufferSwapCounter();
+}
+
+void SAL_CALL VCLXToolkit::setDeterministicScheduling(sal_Bool bDeterministicMode)
+    throw (css::uno::RuntimeException, std::exception)
+{
+    SolarMutexGuard aSolarGuard;
+    Scheduler::SetDeterministicMode(bDeterministicMode);
 }
 
 // css:awt:XToolkitRobot
diff --git a/vcl/source/app/idle.cxx b/vcl/source/app/idle.cxx
index 123f37a..587e05f 100644
--- a/vcl/source/app/idle.cxx
+++ b/vcl/source/app/idle.cxx
@@ -44,7 +44,23 @@ Idle::Idle( const Idle& rIdle ) : Scheduler(rIdle)
 void Idle::Start()
 {
     Scheduler::Start();
-    Scheduler::ImplStartTimer(Scheduler::ImmediateTimeoutMs);
+
+    sal_uInt64 nPeriod = Scheduler::ImmediateTimeoutMs;
+    if (Scheduler::GetDeterministicMode())
+    {
+        switch (mePriority)
+        {
+            case SchedulerPriority::LOW:
+            case SchedulerPriority::LOWER:
+            case SchedulerPriority::LOWEST:
+                nPeriod = Scheduler::InfiniteTimeoutMs;
+                break;
+            default:
+                break;
+        }
+    }
+
+    Scheduler::ImplStartTimer(nPeriod);
 }
 
 bool Idle::ReadyForSchedule( bool bTimerOnly, sal_uInt64 /* nTimeNow */ ) const
@@ -67,6 +83,15 @@ sal_uInt64 Idle::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 /* nTime */
     case SchedulerPriority::REPAINT:
         nMinPeriod = ImmediateTimeoutMs; // don't wait.
         break;
+    case SchedulerPriority::LOW:
+    case SchedulerPriority::LOWER:
+    case SchedulerPriority::LOWEST:
+        if (Scheduler::GetDeterministicMode())
+        {
+            nMinPeriod = Scheduler::InfiniteTimeoutMs;
+            break;
+        }
+        // fall-through intended
     default:
         // FIXME: tdf#92036 workaround, I should be 1 too - wait 5ms
         if (nMinPeriod > 5) // only shrink the min. period if nothing is quicker.
diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx
index 879ca42..efb65ca 100644
--- a/vcl/source/app/scheduler.cxx
+++ b/vcl/source/app/scheduler.cxx
@@ -174,6 +174,18 @@ bool Scheduler::ProcessTaskScheduling( bool bTimerOnly )
         return false;
 }
 
+static bool g_bDeterministicMode = false;
+
+void Scheduler::SetDeterministicMode(bool bDeterministic)
+{
+    g_bDeterministicMode = bDeterministic;
+}
+
+bool Scheduler::GetDeterministicMode()
+{
+    return g_bDeterministicMode;
+}
+
 sal_uInt64 Scheduler::CalculateMinimumTimeout( bool &bHasActiveIdles )
 {
     // process all pending Tasks


More information about the Libreoffice-commits mailing list