Kaydet (Commit) 7e2a0df7 authored tarafından Tobias Madl's avatar Tobias Madl

Timer: added new saltimer handling

Change-Id: Icdc5abf9dca727a8cc312ddb5861f7a34a38bbe1
üst b11dba5b
...@@ -60,6 +60,7 @@ protected: ...@@ -60,6 +60,7 @@ protected:
friend struct ImplSchedulerData; friend struct ImplSchedulerData;
virtual void SetDeletionFlags(); virtual void SetDeletionFlags();
virtual bool ReadyForSchedule( bool bTimer ) { return !bTimer; } virtual bool ReadyForSchedule( bool bTimer ) { return !bTimer; }
virtual sal_uLong UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime );
public: public:
Scheduler(); Scheduler();
...@@ -79,7 +80,7 @@ public: ...@@ -79,7 +80,7 @@ public:
bool IsActive() const { return mbActive; } bool IsActive() const { return mbActive; }
Scheduler& operator=( const Scheduler& Scheduler ); Scheduler& operator=( const Scheduler& rScheduler );
static void ImplDeInitScheduler(); static void ImplDeInitScheduler();
/// Process all pending idle tasks ahead of time in priority order. /// Process all pending idle tasks ahead of time in priority order.
......
...@@ -32,6 +32,7 @@ protected: ...@@ -32,6 +32,7 @@ protected:
void SetDeletionFlags() SAL_OVERRIDE; void SetDeletionFlags() SAL_OVERRIDE;
bool ReadyForSchedule( bool bTimer ) SAL_OVERRIDE; bool ReadyForSchedule( bool bTimer ) SAL_OVERRIDE;
sal_uLong UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime ) SAL_OVERRIDE;
public: public:
Timer(); Timer();
...@@ -44,9 +45,10 @@ public: ...@@ -44,9 +45,10 @@ public:
void SetTimeoutHdl( const Link& rLink ) { maTimeoutHdl = rLink; } void SetTimeoutHdl( const Link& rLink ) { maTimeoutHdl = rLink; }
const Link& GetTimeoutHdl() const { return maTimeoutHdl; } const Link& GetTimeoutHdl() const { return maTimeoutHdl; }
virtual void Invoke() SAL_OVERRIDE; virtual void Invoke() SAL_OVERRIDE;
void Timeout() { Invoke(); } void Timeout() { Invoke(); }
Timer& operator=( const Timer& rTimer ); Timer& operator=( const Timer& rTimer );
void Start() SAL_OVERRIDE; void Start() SAL_OVERRIDE;
static void ImplStartTimer( ImplSVData* pSVData, sal_uLong nMS );
}; };
/// An auto-timer is a multi-shot timer re-emitting itself at /// An auto-timer is a multi-shot timer re-emitting itself at
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <svdata.hxx> #include <svdata.hxx>
#include <tools/time.hxx> #include <tools/time.hxx>
#include <vcl/scheduler.hxx> #include <vcl/scheduler.hxx>
#include <vcl/timer.hxx>
#include <saltimer.hxx>
void ImplSchedulerData::Invoke() void ImplSchedulerData::Invoke()
{ {
...@@ -70,6 +72,10 @@ void Scheduler::ImplDeInitScheduler() ...@@ -70,6 +72,10 @@ void Scheduler::ImplDeInitScheduler()
{ {
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
ImplSchedulerData* pSchedulerData = pSVData->mpFirstSchedulerData; ImplSchedulerData* pSchedulerData = pSVData->mpFirstSchedulerData;
if (pSVData->mpSalTimer)
{
pSVData->mpSalTimer->Stop();
}
if ( pSchedulerData ) if ( pSchedulerData )
{ {
...@@ -87,7 +93,11 @@ void Scheduler::ImplDeInitScheduler() ...@@ -87,7 +93,11 @@ void Scheduler::ImplDeInitScheduler()
while ( pSchedulerData ); while ( pSchedulerData );
pSVData->mpFirstSchedulerData = NULL; pSVData->mpFirstSchedulerData = NULL;
pSVData->mnTimerPeriod = 0;
} }
delete pSVData->mpSalTimer;
pSVData->mpSalTimer = 0;
} }
void Scheduler::CallbackTaskScheduling(bool ignore) void Scheduler::CallbackTaskScheduling(bool ignore)
...@@ -102,19 +112,26 @@ void Scheduler::ProcessTaskScheduling( bool bTimer ) ...@@ -102,19 +112,26 @@ void Scheduler::ProcessTaskScheduling( bool bTimer )
ImplSchedulerData* pSchedulerData = NULL; ImplSchedulerData* pSchedulerData = NULL;
ImplSchedulerData* pPrevSchedulerData = NULL; ImplSchedulerData* pPrevSchedulerData = NULL;
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
sal_uLong nTime = tools::Time::GetSystemTicks();
sal_uLong nMinPeriod = ((sal_uLong)0xFFFFFFFF);
pSVData->mnTimerUpdate++; pSVData->mnTimerUpdate++;
if ((pSchedulerData = ImplSchedulerData::GetMostImportantTask(bTimer))) if ((pSchedulerData = ImplSchedulerData::GetMostImportantTask(bTimer)))
{ {
pSchedulerData->mnUpdateTime = tools::Time::GetSystemTicks(); pSchedulerData->mnUpdateTime = nTime;
pSchedulerData->Invoke(); pSchedulerData->Invoke();
} }
pSchedulerData = pSVData->mpFirstSchedulerData; pSchedulerData = pSVData->mpFirstSchedulerData;
while ( pSchedulerData ) while ( pSchedulerData )
{ {
if( pSchedulerData->mbInScheduler )
{
pPrevSchedulerData = pSchedulerData;
pSchedulerData = pSchedulerData->mpNext;
}
// Should Task be released from scheduling? // Should Task be released from scheduling?
if ( pSchedulerData->mbDelete ) else if ( pSchedulerData->mbDelete )
{ {
if ( pPrevSchedulerData ) if ( pPrevSchedulerData )
pPrevSchedulerData->mpNext = pSchedulerData->mpNext; pPrevSchedulerData->mpNext = pSchedulerData->mpNext;
...@@ -128,15 +145,31 @@ void Scheduler::ProcessTaskScheduling( bool bTimer ) ...@@ -128,15 +145,31 @@ void Scheduler::ProcessTaskScheduling( bool bTimer )
} }
else else
{ {
if( !pSchedulerData->mbInScheduler ) pSchedulerData->mnUpdateStack = 0;
pSchedulerData->mnUpdateStack = 0; nMinPeriod = pSchedulerData->mpScheduler->UpdateMinPeriod( nMinPeriod, nTime );
pPrevSchedulerData = pSchedulerData; pPrevSchedulerData = pSchedulerData;
pSchedulerData = pSchedulerData->mpNext; 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--; pSVData->mnTimerUpdate--;
} }
sal_uLong Scheduler::UpdateMinPeriod( sal_uLong nMinPeriod, sal_uLong nTime )
{
(void)nTime;
return nMinPeriod;
}
void Scheduler::SetPriority( SchedulerPriority ePriority ) void Scheduler::SetPriority( SchedulerPriority ePriority )
{ {
meDefaultPriority = ePriority; meDefaultPriority = ePriority;
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#define MAX_TIMER_PERIOD ((sal_uLong)0xFFFFFFFF) #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 ) if ( !nMS )
nMS = 1; nMS = 1;
...@@ -55,6 +55,33 @@ bool Timer::ReadyForSchedule( bool bTimer ) ...@@ -55,6 +55,33 @@ bool Timer::ReadyForSchedule( bool bTimer )
return (mpSchedulerData->mnUpdateTime + mnTimeout) <= tools::Time::GetSystemTicks(); 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() Timer::Timer() : Scheduler()
{ {
mnTimeout = 1; mnTimeout = 1;
...@@ -86,7 +113,7 @@ void Timer::Start() ...@@ -86,7 +113,7 @@ void Timer::Start()
pSVData->mpSalTimer->SetCallback( CallbackTaskScheduling ); pSVData->mpSalTimer->SetCallback( CallbackTaskScheduling );
} }
if ( mnTimeout < pSVData->mnTimerPeriod ) if ( mnTimeout < pSVData->mnTimerPeriod )
ImplStartTimer( pSVData, mnTimeout ); Timer::ImplStartTimer( pSVData, mnTimeout );
} }
void Timer::SetTimeout( sal_uLong nNewTimeout ) void Timer::SetTimeout( sal_uLong nNewTimeout )
...@@ -97,7 +124,7 @@ void Timer::SetTimeout( sal_uLong nNewTimeout ) ...@@ -97,7 +124,7 @@ void Timer::SetTimeout( sal_uLong nNewTimeout )
{ {
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->mnTimerUpdate && (mnTimeout < pSVData->mnTimerPeriod) ) if ( !pSVData->mnTimerUpdate && (mnTimeout < pSVData->mnTimerPeriod) )
ImplStartTimer( pSVData, mnTimeout ); Timer::ImplStartTimer( pSVData, mnTimeout );
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment