include/vcl/scheduler.hxx | 3 ++- include/vcl/timer.hxx | 4 +++- vcl/source/app/scheduler.cxx | 41 +++++++++++++++++++++++++++++++++++++---- vcl/source/app/svapp.cxx | 3 ++- vcl/source/app/timer.cxx | 33 ++++++++++++++++++++++++++++++--- 5 files changed, 74 insertions(+), 10 deletions(-)
New commits: commit ce0998127e9e0af03f1d66f5dd6aab4252f7caf1 Author: Tobias Madl <tobias.madl....@gmail.com> Date: Thu Mar 5 14:05:15 2015 +0000 Timer: added new saltimer handling Change-Id: Icdc5abf9dca727a8cc312ddb5861f7a34a38bbe1 diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx index af17016..30f2e1a 100644 --- a/include/vcl/scheduler.hxx +++ b/include/vcl/scheduler.hxx @@ -60,6 +60,7 @@ protected: friend struct ImplSchedulerData; virtual void SetDeletionFlags(); virtual bool ReadyForSchedule( bool bTimer ) { return !bTimer; } + virtual sal_uLong UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime ); public: Scheduler(); @@ -79,7 +80,7 @@ public: bool IsActive() const { return mbActive; } - Scheduler& operator=( const Scheduler& Scheduler ); + Scheduler& operator=( const Scheduler& rScheduler ); static void ImplDeInitScheduler(); /// Process all pending idle tasks ahead of time in priority order. diff --git a/include/vcl/timer.hxx b/include/vcl/timer.hxx index d2db1d4..a999559 100644 --- a/include/vcl/timer.hxx +++ b/include/vcl/timer.hxx @@ -32,6 +32,7 @@ protected: void SetDeletionFlags() SAL_OVERRIDE; bool ReadyForSchedule( bool bTimer ) SAL_OVERRIDE; + sal_uLong UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime ) SAL_OVERRIDE; public: Timer(); @@ -44,9 +45,10 @@ public: void SetTimeoutHdl( const Link& rLink ) { maTimeoutHdl = rLink; } const Link& GetTimeoutHdl() const { return maTimeoutHdl; } virtual void Invoke() SAL_OVERRIDE; - void Timeout() { Invoke(); } + void Timeout() { Invoke(); } Timer& operator=( const Timer& rTimer ); void Start() SAL_OVERRIDE; + static void ImplStartTimer( ImplSVData* pSVData, sal_uLong nMS ); }; /// An auto-timer is a multi-shot timer re-emitting itself at diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx index 06de1ba..ef5e1f0 100644 --- a/vcl/source/app/scheduler.cxx +++ b/vcl/source/app/scheduler.cxx @@ -20,6 +20,8 @@ #include <svdata.hxx> #include <tools/time.hxx> #include <vcl/scheduler.hxx> +#include <vcl/timer.hxx> +#include <saltimer.hxx> void ImplSchedulerData::Invoke() { @@ -70,6 +72,10 @@ void Scheduler::ImplDeInitScheduler() { ImplSVData* pSVData = ImplGetSVData(); ImplSchedulerData* pSchedulerData = pSVData->mpFirstSchedulerData; + if (pSVData->mpSalTimer) + { + pSVData->mpSalTimer->Stop(); + } if ( pSchedulerData ) { @@ -87,7 +93,11 @@ void Scheduler::ImplDeInitScheduler() while ( pSchedulerData ); pSVData->mpFirstSchedulerData = NULL; + pSVData->mnTimerPeriod = 0; } + + delete pSVData->mpSalTimer; + pSVData->mpSalTimer = 0; } void Scheduler::CallbackTaskScheduling(bool ignore) @@ -102,19 +112,26 @@ void Scheduler::ProcessTaskScheduling( bool bTimer ) ImplSchedulerData* pSchedulerData = NULL; ImplSchedulerData* pPrevSchedulerData = NULL; ImplSVData* pSVData = ImplGetSVData(); + sal_uLong nTime = tools::Time::GetSystemTicks(); + sal_uLong nMinPeriod = ((sal_uLong)0xFFFFFFFF); pSVData->mnTimerUpdate++; if ((pSchedulerData = ImplSchedulerData::GetMostImportantTask(bTimer))) { - pSchedulerData->mnUpdateTime = tools::Time::GetSystemTicks(); + pSchedulerData->mnUpdateTime = nTime; pSchedulerData->Invoke(); } pSchedulerData = pSVData->mpFirstSchedulerData; while ( pSchedulerData ) { + if( pSchedulerData->mbInScheduler ) + { + pPrevSchedulerData = pSchedulerData; + pSchedulerData = pSchedulerData->mpNext; + } // Should Task be released from scheduling? - if ( pSchedulerData->mbDelete ) + else if ( pSchedulerData->mbDelete ) { if ( pPrevSchedulerData ) pPrevSchedulerData->mpNext = pSchedulerData->mpNext; @@ -128,15 +145,31 @@ void Scheduler::ProcessTaskScheduling( bool bTimer ) } else { - if( !pSchedulerData->mbInScheduler ) - pSchedulerData->mnUpdateStack = 0; + pSchedulerData->mnUpdateStack = 0; + nMinPeriod = pSchedulerData->mpScheduler->UpdateMinPeriod( nMinPeriod, nTime ); pPrevSchedulerData = pSchedulerData; pSchedulerData = pSchedulerData->mpNext; } } + + // delete clock if no more timers available + if ( !pSVData->mpFirstSchedulerData ) + { + if ( pSVData->mpSalTimer ) + pSVData->mpSalTimer->Stop(); + pSVData->mnTimerPeriod = ((sal_uLong)0xFFFFFFFF); + } + else + Timer::ImplStartTimer( pSVData, nMinPeriod ); pSVData->mnTimerUpdate--; } +sal_uLong Scheduler::UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime ) +{ + (void)nTime; + return nMinPeriod; +} + void Scheduler::SetPriority( SchedulerPriority ePriority ) { meDefaultPriority = ePriority; diff --git a/vcl/source/app/timer.cxx b/vcl/source/app/timer.cxx index b8be2d7..4dec9af 100644 --- a/vcl/source/app/timer.cxx +++ b/vcl/source/app/timer.cxx @@ -26,7 +26,7 @@ #define MAX_TIMER_PERIOD ((sal_uLong)0xFFFFFFFF) -static void ImplStartTimer( ImplSVData* pSVData, sal_uLong nMS ) +void Timer::ImplStartTimer( ImplSVData* pSVData, sal_uLong nMS ) { if ( !nMS ) nMS = 1; @@ -55,6 +55,33 @@ bool Timer::ReadyForSchedule( bool bTimer ) return (mpSchedulerData->mnUpdateTime + mnTimeout) <= tools::Time::GetSystemTicks(); } +sal_uLong Timer::UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime ) +{ + sal_uLong nNewTime = tools::Time::GetSystemTicks(); + sal_uLong nDeltaTime; + //determine smallest time slot + if( mpSchedulerData->mnUpdateTime == nTime ) + { + nDeltaTime = mnTimeout; + if( nDeltaTime < nMinPeriod ) + nMinPeriod = nDeltaTime; + } + else + { + nDeltaTime = mpSchedulerData->mnUpdateTime + mnTimeout; + if( nDeltaTime < nNewTime ) + nMinPeriod = 1; + else + { + nDeltaTime -= nNewTime; + if( nDeltaTime < nMinPeriod ) + nMinPeriod = nDeltaTime; + } + } + + return nMinPeriod; +} + Timer::Timer() : Scheduler() { mnTimeout = 1; @@ -86,7 +113,7 @@ void Timer::Start() pSVData->mpSalTimer->SetCallback( CallbackTaskScheduling ); } if ( mnTimeout < pSVData->mnTimerPeriod ) - ImplStartTimer( pSVData, mnTimeout ); + Timer::ImplStartTimer( pSVData, mnTimeout ); } void Timer::SetTimeout( sal_uLong nNewTimeout ) @@ -97,7 +124,7 @@ void Timer::SetTimeout( sal_uLong nNewTimeout ) { ImplSVData* pSVData = ImplGetSVData(); if ( !pSVData->mnTimerUpdate && (mnTimeout < pSVData->mnTimerPeriod) ) - ImplStartTimer( pSVData, mnTimeout ); + Timer::ImplStartTimer( pSVData, mnTimeout ); } } commit d8d910e0771f76a010abf3d7d8e722830aa8adc8 Author: Tobias Madl <tobias.madl....@gmail.com> Date: Thu Mar 5 11:57:50 2015 +0000 Clean up minor fixes Change-Id: Icdf85d6f6f5734a3cf952def8782efe9edc7c0a9 diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 33fbf0a..0064ec0 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -346,7 +346,7 @@ inline void ImplYield( bool i_bWait, bool i_bAllEvents ) //while ( pSVData->mbNotAllTimerCalled ) // Timer::ImplTimerCallbackProc(); - //Process all idles + //Process all Tasks Scheduler::ProcessTaskScheduling(false); pSVData->maAppData.mnDispatchLevel++; @@ -367,6 +367,7 @@ inline void ImplYield( bool i_bWait, bool i_bAllEvents ) // e.g. on OS X; need to trigger timer checks manually if( pSVData->maAppData.mbNoYield ) { + //Process all timers Scheduler::ProcessTaskScheduling(true); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits