summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Madl <tobias.madl.dev@gmail.com>2015-03-05 14:05:15 +0000
committerTobias Madl <tobias.madl.dev@gmail.com>2015-03-06 12:27:12 +0000
commit7e2a0df7e7b4551698d1d7172ef12ad1e0fd8826 (patch)
tree304ba756d0a3eba181fd5e2b8796c52eb6108903
parentb11dba5be288ca5aaed1403093033708f7091c42 (diff)
Timer: added new saltimer handling
Change-Id: Icdc5abf9dca727a8cc312ddb5861f7a34a38bbe1
-rw-r--r--include/vcl/scheduler.hxx3
-rw-r--r--include/vcl/timer.hxx4
-rw-r--r--vcl/source/app/scheduler.cxx41
-rw-r--r--vcl/source/app/timer.cxx33
4 files changed, 72 insertions, 9 deletions
diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx
index af17016971ea..30f2e1ab4bc8 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 d2db1d4efd9c..a999559d5ff6 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 06de1bab25d9..ef5e1f0182c0 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 b8be2d7ef40b..4dec9af84eb2 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 );
}
}