include/vcl/idle.hxx | 51 ++++++++++++++++++++++++------------ vcl/source/app/idle.cxx | 68 ++++++++++++------------------------------------ 2 files changed, 53 insertions(+), 66 deletions(-)
New commits: commit 75d61d16fce70a53d250a0ef6b7df30b1fd329e6 Author: Tobias Madl <[email protected]> Date: Wed Jan 21 14:04:59 2015 +0100 Idle: New enum system, comments Change-Id: I8ca272481e573bf3338c5c1b9873a39022928812 diff --git a/include/vcl/idle.hxx b/include/vcl/idle.hxx index 0415575..6c40ca3 100644 --- a/include/vcl/idle.hxx +++ b/include/vcl/idle.hxx @@ -27,28 +27,47 @@ struct ImplIdleData; struct ImplSVData; -// The timemarks behind the priorities are need to change timer to idle. It is to convert -// timeout values to priorities. enum class IdlePriority { - VCL_IDLE_PRIORITY_STARVATIONPROTECTION = -1, // Do not use this for normal prioritizing! - - VCL_IDLE_PRIORITY_HIGHEST = 0, // -> 0ms - VCL_IDLE_PRIORITY_HIGH = 1, // -> 1ms - VCL_IDLE_PRIORITY_DEFAULT = 1, // -> 1ms - VCL_IDLE_PRIORITY_REPAINT = 2, // -> 30ms - VCL_IDLE_PRIORITY_RESIZE = 3, // -> 50ms - VCL_IDLE_PRIORITY_MEDIUM = 3, // -> 50ms - VCL_IDLE_PRIORITY_LOW = 4, // -> 100ms - VCL_IDLE_PRIORITY_LOWER = 5, // -> 200ms - VCL_IDLE_PRIORITY_LOWEST = 6 // -> 400ms + VCL_IDLE_PRIORITY_HIGHEST, + VCL_IDLE_PRIORITY_HIGH, + VCL_IDLE_PRIORITY_REPAINT, + VCL_IDLE_PRIORITY_RESIZE, + VCL_IDLE_PRIORITY_MEDIUM, + VCL_IDLE_PRIORITY_LOW, + VCL_IDLE_PRIORITY_LOWER, + VCL_IDLE_PRIORITY_LOWEST }; +inline sal_Int32 convertToInt( IdlePriority ePriority ) +{ + switch (ePriority) + { + case IdlePriority::VCL_IDLE_PRIORITY_HIGHEST: + return 0; + case IdlePriority::VCL_IDLE_PRIORITY_HIGH: + return 1; + case IdlePriority::VCL_IDLE_PRIORITY_REPAINT: + return 2; + case IdlePriority::VCL_IDLE_PRIORITY_RESIZE: + return 3; + case IdlePriority::VCL_IDLE_PRIORITY_MEDIUM: + return 3; + case IdlePriority::VCL_IDLE_PRIORITY_LOW: + return 4; + case IdlePriority::VCL_IDLE_PRIORITY_LOWER: + return 5; + case IdlePriority::VCL_IDLE_PRIORITY_LOWEST: + return 6; + } + + return 42; // Should not happen +} class VCL_DLLPUBLIC Idle { protected: ImplIdleData* mpIdleData; // Pointer to element in idle list - IdlePriority mePriority; // Idle priority ( maybe divergent to default) + sal_Int32 miPriority; // Idle priority ( maybe divergent to default) IdlePriority meDefaultPriority; // Default idle priority bool mbActive; // Currently in the scheduler Link maIdleHdl; // Callback Link @@ -61,7 +80,8 @@ public: virtual ~Idle(); void SetPriority( IdlePriority ePriority ); - IdlePriority GetPriority() const { return mePriority; } + void SetSchedulingPriority( sal_Int32 iPriority ); + sal_Int32 GetPriority() const { return miPriority; } IdlePriority GetDefaultPriority() const { return meDefaultPriority; } /// Make it possible to associate a callback with this idle handler @@ -79,7 +99,6 @@ public: Idle& operator=( const Idle& rIdle ); static void ImplDeInitIdle(); - static void ImplIdleCallbackProc(); /// Process all pending idle tasks ahead of time in priority order. static void ProcessAllIdleHandlers(); diff --git a/vcl/source/app/idle.cxx b/vcl/source/app/idle.cxx index 37299de..cc92d36 100644 --- a/vcl/source/app/idle.cxx +++ b/vcl/source/app/idle.cxx @@ -26,17 +26,17 @@ struct ImplIdleData { - ImplIdleData* mpNext; // Pointer to the next Instance + ImplIdleData* mpNext; // Pointer to the next element in list Idle* mpIdle; // Pointer to VCL Idle instance - bool mbDelete; // Was Idle deleted during Update()? - bool mbInIdle; // Are we in a idle handler? + bool mbDelete; // Destroy this idle? + bool mbInIdle; // Idle handler currently processed? void Invoke() { if (mbDelete || mbInIdle ) return; - mpIdle->SetPriority(mpIdle->GetDefaultPriority()); + mpIdle->SetSchedulingPriority(convertToInt(mpIdle->GetDefaultPriority())); mbDelete = true; mpIdle->mbActive = false; @@ -65,49 +65,16 @@ struct ImplIdleData // the current is the new most urgent. So starving is impossible. if ( p->mpIdle->GetPriority() < pMostUrgent->mpIdle->GetPriority() ) { - IncreasePriority(pMostUrgent->mpIdle); + pMostUrgent->mpIdle->SetSchedulingPriority( pMostUrgent->mpIdle->GetPriority() - 1); pMostUrgent = p; } else - IncreasePriority(p->mpIdle); + p->mpIdle->SetSchedulingPriority( p->mpIdle->GetPriority() - 1); } } return pMostUrgent; } - - static void IncreasePriority( Idle *pIdle ) - { - switch(pIdle->GetPriority()) - { - // Increase priority based on their current priority; - // (so don't use VCL_IDLE_PRIORITY_STARVATIONPROTECTION for default-priority!) - case IdlePriority::VCL_IDLE_PRIORITY_STARVATIONPROTECTION: - break; - // If already highest priority -> extra state for starving tasks - case IdlePriority::VCL_IDLE_PRIORITY_HIGHEST: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_STARVATIONPROTECTION); - break; - case IdlePriority::VCL_IDLE_PRIORITY_HIGH: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_HIGHEST); - break; - case IdlePriority::VCL_IDLE_PRIORITY_REPAINT: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_HIGH); - break; - case IdlePriority::VCL_IDLE_PRIORITY_MEDIUM: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_REPAINT); - break; - case IdlePriority::VCL_IDLE_PRIORITY_LOW: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_MEDIUM); - break; - case IdlePriority::VCL_IDLE_PRIORITY_LOWER: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_LOW); - break; - case IdlePriority::VCL_IDLE_PRIORITY_LOWEST: - pIdle->SetPriority(IdlePriority::VCL_IDLE_PRIORITY_LOWER); - break; - } - } }; void Idle::ImplDeInitIdle() @@ -149,7 +116,7 @@ void Idle::ProcessAllIdleHandlers() pIdleData = pSVData->mpFirstIdleData; while ( pIdleData ) { - // Was idle destroyed in the meantime? + // Should idle be released from scheduling? if ( pIdleData->mbDelete ) { if ( pPrevIdleData ) @@ -172,11 +139,12 @@ void Idle::ProcessAllIdleHandlers() void Idle::SetPriority( IdlePriority ePriority ) { - mePriority = ePriority; - // Was a new priority set before excecution? - // Then take it as default priority - if( !mbActive && meDefaultPriority == IdlePriority::VCL_IDLE_PRIORITY_DEFAULT ) - meDefaultPriority = mePriority; + meDefaultPriority = ePriority; +} + +void Idle::SetSchedulingPriority( sal_Int32 iPriority ) +{ + miPriority = iPriority; } void Idle::DoIdle() @@ -228,7 +196,7 @@ Idle& Idle::operator=( const Idle& rIdle ) Stop(); mbActive = false; - mePriority = rIdle.mePriority; + miPriority = rIdle.miPriority; meDefaultPriority = rIdle.meDefaultPriority; maIdleHdl = rIdle.maIdleHdl; @@ -240,15 +208,15 @@ Idle& Idle::operator=( const Idle& rIdle ) Idle::Idle(): mpIdleData(NULL), - mePriority(IdlePriority::VCL_IDLE_PRIORITY_DEFAULT), - meDefaultPriority(IdlePriority::VCL_IDLE_PRIORITY_DEFAULT), + miPriority(convertToInt(IdlePriority::VCL_IDLE_PRIORITY_HIGH)), + meDefaultPriority(IdlePriority::VCL_IDLE_PRIORITY_HIGH), mbActive(false) { } Idle::Idle( const Idle& rIdle ): mpIdleData(NULL), - mePriority(rIdle.mePriority), + miPriority(rIdle.miPriority), meDefaultPriority(rIdle.meDefaultPriority), mbActive(false), maIdleHdl(rIdle.maIdleHdl) @@ -265,4 +233,4 @@ Idle::~Idle() mpIdleData->mpIdle = NULL; } } -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ \ No newline at end of file +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
