vcl/inc/svdata.hxx | 1 vcl/source/app/timer.cxx | 56 ++++++++++++++++++++--------------------------- 2 files changed, 24 insertions(+), 33 deletions(-)
New commits: commit 4e08ce00d4f1df57edf1e9fed8d05ba854156e9a Author: Tobias Madl <tobias.madl....@gmail.com> Date: Wed Oct 29 10:36:21 2014 +0000 Working starvation protection and prio scheduling Change-Id: I9434fd2fdfad5f54021325648c547a9634d6b291 diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index dc74595..c1d9eed 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -308,7 +308,6 @@ struct ImplSVData sal_uLong mnThreadCount; // is VCL MultiThread enabled ImplConfigData* mpFirstConfigData; // Zeiger auf ersten Config-Block ImplTimerData* mpFirstTimerData; // list of all running timers - ImplTimerData* mpWaitingTimerData; // sorted (prio) list of ready timers SalTimer* mpSalTimer; // interface to sal event loop/timers SalI18NImeStatus* mpImeStatus; // interface to ime status window SalSystem* mpSalSystem; // SalSystem interface diff --git a/vcl/source/app/timer.cxx b/vcl/source/app/timer.cxx index c039de1..894fb7a 100644 --- a/vcl/source/app/timer.cxx +++ b/vcl/source/app/timer.cxx @@ -97,19 +97,15 @@ void Timer::ImplTimerCallbackProc() sal_uLong nMinPeriod = MAX_TIMER_PERIOD; sal_uLong nDeltaTime; sal_uLong nTime = tools::Time::GetSystemTicks(); + bool bAllTimerCalled = true; if ( pSVData->mbNoCallTimer ) return; pSVData->mnTimerUpdate++; pSVData->mbNotAllTimerCalled = true; - - // find timer where the timer handler needs to be called pTimerData = pSVData->mpFirstTimerData; - if(!pSVData->mpWaitingTimerData) - pPrioFirstTimerData = pTimerData; - else - pPrioFirstTimerData = pSVData->mpWaitingTimerData; + pPrioFirstTimerData = pTimerData; while ( pTimerData ) { @@ -155,12 +151,8 @@ void Timer::ImplTimerCallbackProc() pTimerData = pTimerData->mpNext; } - if(pPrioFirstTimerData && pPrioFirstTimerData->mpTimer){ + if(pPrioFirstTimerData && pPrioFirstTimerData->mpTimer) nPrevPrio = pPrioFirstTimerData->mpTimer->GetPriority(); - pSVData->mpWaitingTimerData = pPrioFirstTimerData; - } - else - pSVData->mpWaitingTimerData = NULL; while(pPrioFirstTimerData && pPrioFirstTimerData->mpTimer && pPrioFirstTimerData->mpTimer->GetPriority() == nPrevPrio){ // set new update time @@ -181,17 +173,20 @@ void Timer::ImplTimerCallbackProc() pPrioFirstTimerData->mbInTimeout = false; pPrevTimerData = pPrioFirstTimerData; pPrioFirstTimerData = pPrioFirstTimerData->mpPrioNext; - pPrevTimerData->mpNext = pPrevTimerData->mpPrioNext; pPrevTimerData->mpPrioNext = NULL; } - if(pPrevTimerData && !pPrevTimerData->mpPrioNext) - pPrevTimerData->mpNext = NULL; + while(pPrioFirstTimerData && pPrioFirstTimerData->mpTimer){ + pPrevTimerData = pPrioFirstTimerData; + pPrioFirstTimerData = pPrioFirstTimerData->mpPrioNext; + pPrevTimerData->mpPrioNext = NULL; + bAllTimerCalled = false; + } // determine new time sal_uLong nNewTime = tools::Time::GetSystemTicks(); pPrevTimerData = NULL; - pTimerData = pSVData->mpWaitingTimerData; + pTimerData = pSVData->mpFirstTimerData; while ( pTimerData ) { // ignore if timer is still in timeout handler @@ -238,15 +233,10 @@ void Timer::ImplTimerCallbackProc() pPrevTimerData = pTimerData; pTimerData = pTimerData->mpNext; } - } - - if(pPrioFirstTimerData && pPrioFirstTimerData->mpTimer) - pSVData->mpWaitingTimerData = pPrioFirstTimerData; - else - pSVData->mpWaitingTimerData = NULL; + } // delete clock if no more timers available - if ( !pSVData->mpFirstTimerData && !pSVData->mpWaitingTimerData ) + if ( !pSVData->mpFirstTimerData ) { pSVData->mpSalTimer->Stop(); pSVData->mnTimerPeriod = MAX_TIMER_PERIOD; @@ -254,16 +244,16 @@ void Timer::ImplTimerCallbackProc() else ImplStartTimer( pSVData, nMinPeriod ); - if(!pSVData->mpWaitingTimerData){ - pSVData->mnTimerUpdate--; + pSVData->mnTimerUpdate--; + if(bAllTimerCalled) pSVData->mbNotAllTimerCalled = false; - } } Timer::Timer(): mpTimerData(NULL), mnTimeout(1), - mnPriority(0), + mnPriority(VCL_IDLE_PRIORITY_HIGH), + mnDefaultPriority(VCL_IDLE_PRIORITY_HIGH), mbActive(false), mbAuto(false) { @@ -273,6 +263,7 @@ Timer::Timer( const Timer& rTimer ): mpTimerData(NULL), mnTimeout(rTimer.mnTimeout), mnPriority(rTimer.mnPriority), + mnDefaultPriority(rTimer.mnDefaultPriority), mbActive(false), mbAuto(false), maTimeoutHdl(rTimer.maTimeoutHdl) @@ -301,17 +292,17 @@ void Timer::SetTimeout( sal_uLong nNewTimeout) if(nNewTimeout==0) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_HIGHEST; - if(nNewTimeout==1) + else if(nNewTimeout==1) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_HIGH; - if(nNewTimeout > 1 && nNewTimeout<=30) + else if(nNewTimeout > 1 && nNewTimeout<=30) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_REPAINT; - if(nNewTimeout > 30 && nNewTimeout<=50) + else if(nNewTimeout > 30 && nNewTimeout<=50) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_RESIZE; - if(nNewTimeout > 50 && nNewTimeout<=100) + else if(nNewTimeout > 50 && nNewTimeout<=100) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_MEDIUM; - if(nNewTimeout > 100 && nNewTimeout<=200) + else if(nNewTimeout > 100 && nNewTimeout<=200) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_LOW; - if(nNewTimeout > 200 && nNewTimeout<=400) + else if(nNewTimeout > 200 && nNewTimeout<=400) mnPriority = IdlePriority::VCL_IDLE_PRIORITY_LOWER; else mnPriority = IdlePriority::VCL_IDLE_PRIORITY_LOWEST; @@ -396,6 +387,7 @@ Timer& Timer::operator=( const Timer& rTimer ) mbActive = false; mnTimeout = rTimer.mnTimeout; mnPriority = rTimer.mnPriority; + mnDefaultPriority = rTimer.mnDefaultPriority; maTimeoutHdl = rTimer.maTimeoutHdl; if ( rTimer.IsActive() ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits