diff options
-rw-r--r-- | include/vcl/scheduler.hxx | 9 | ||||
-rw-r--r-- | offapi/com/sun/star/awt/XToolkitExperimental.idl | 16 | ||||
-rw-r--r-- | toolkit/source/awt/vclxtoolkit.cxx | 12 | ||||
-rw-r--r-- | vcl/source/app/idle.cxx | 27 | ||||
-rw-r--r-- | vcl/source/app/scheduler.cxx | 12 |
5 files changed, 67 insertions, 9 deletions
diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx index 95303ee48f5e..ee83c1e89e9e 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 7c5d36331958..89828b2864e1 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 3b5548be561b..262697baa903 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 123f37a13e4f..587e05fc2d98 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 879ca422a5ac..efb65ca110d2 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 |