Kaydet (Commit) 22cd725f authored tarafından Michael Meeks's avatar Michael Meeks

vcl timers: avoid crash with vcldemo.

The system timer needs earlier and/or more consistent initialization.

Change-Id: I148d98537cc055a091181bd36a654ae35f665aaf
üst 4e4d38fa
...@@ -34,6 +34,9 @@ protected: ...@@ -34,6 +34,9 @@ protected:
virtual bool ReadyForSchedule( bool bTimer ) SAL_OVERRIDE; virtual bool ReadyForSchedule( bool bTimer ) SAL_OVERRIDE;
virtual sal_uInt64 UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime ) SAL_OVERRIDE; virtual sal_uInt64 UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime ) SAL_OVERRIDE;
private:
void InitSystemTimer();
public: public:
Timer(); Timer();
Timer( const Timer& rTimer ); Timer( const Timer& rTimer );
......
...@@ -81,11 +81,27 @@ sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime ) ...@@ -81,11 +81,27 @@ sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime )
return nMinPeriod; return nMinPeriod;
} }
/**
* Initialize the platform specific timer on which all the
* platform independent timers are built
*/
void Timer::InitSystemTimer()
{
ImplSVData* pSVData = ImplGetSVData();
if( ! pSVData->mpSalTimer )
{
pSVData->mnTimerPeriod = MAX_TIMER_PERIOD;
pSVData->mpSalTimer = pSVData->mpDefInst->CreateSalTimer();
pSVData->mpSalTimer->SetCallback( CallbackTaskScheduling );
}
}
Timer::Timer() : Scheduler() Timer::Timer() : Scheduler()
{ {
mnTimeout = 1; mnTimeout = 1;
mbAuto = false; mbAuto = false;
mePriority = SchedulerPriority::HIGHEST; mePriority = SchedulerPriority::HIGHEST;
InitSystemTimer();
} }
Timer::Timer( const Timer& rTimer ) : Scheduler(rTimer) Timer::Timer( const Timer& rTimer ) : Scheduler(rTimer)
...@@ -93,6 +109,7 @@ Timer::Timer( const Timer& rTimer ) : Scheduler(rTimer) ...@@ -93,6 +109,7 @@ Timer::Timer( const Timer& rTimer ) : Scheduler(rTimer)
mnTimeout = rTimer.mnTimeout; mnTimeout = rTimer.mnTimeout;
mbAuto = rTimer.mbAuto; mbAuto = rTimer.mbAuto;
maTimeoutHdl = rTimer.maTimeoutHdl; maTimeoutHdl = rTimer.maTimeoutHdl;
InitSystemTimer();
} }
void Timer::Invoke() void Timer::Invoke()
...@@ -103,13 +120,9 @@ void Timer::Invoke() ...@@ -103,13 +120,9 @@ void Timer::Invoke()
void Timer::Start() void Timer::Start()
{ {
Scheduler::Start(); Scheduler::Start();
ImplSVData* pSVData = ImplGetSVData();
if( ! pSVData->mpSalTimer ) ImplSVData* pSVData = ImplGetSVData();
{ assert( pSVData->mpSalTimer != NULL );
pSVData->mnTimerPeriod = MAX_TIMER_PERIOD;
pSVData->mpSalTimer = pSVData->mpDefInst->CreateSalTimer();
pSVData->mpSalTimer->SetCallback( CallbackTaskScheduling );
}
if ( mnTimeout < pSVData->mnTimerPeriod ) if ( mnTimeout < pSVData->mnTimerPeriod )
Timer::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