Kaydet (Commit) 0e10b343 authored tarafından Tobias Madl's avatar Tobias Madl

Idle: New enum system, comments

Change-Id: I8ca272481e573bf3338c5c1b9873a39022928812
üst b380220b
......@@ -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();
......
......@@ -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: */
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