summaryrefslogtreecommitdiff
path: root/vcl
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 /vcl
parentb11dba5be288ca5aaed1403093033708f7091c42 (diff)
Timer: added new saltimer handling
Change-Id: Icdc5abf9dca727a8cc312ddb5861f7a34a38bbe1
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/app/scheduler.cxx41
-rw-r--r--vcl/source/app/timer.cxx33
2 files changed, 67 insertions, 7 deletions
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 );
}
}