summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2016-10-30 00:03:34 +0200
committerJan-Marek Glogowski <glogow@fbihome.de>2017-07-13 12:10:21 +0200
commit1782893282a4543e946e6b2c8de863b10fab0c85 (patch)
tree4fc64538107668b09e93b152da1a8449fbad7b0b /vcl/source
parent66a38d26b0c8de82daacfb0c0ce7d014dc083090 (diff)
Change scheduler list to be queue-like
The scheduler modifies the SchedulerData list mainly in two ways: 1. Remove a finished item 2. Append a new item This optimizes the Append operation by keeping a last element pointer, so we don't have to walk the whole list to find it. This way this list is converted to a queue-like structure. Change-Id: If7214e1f6016414551abbef11f26f332737f7893
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/app/scheduler.cxx29
1 files changed, 16 insertions, 13 deletions
diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx
index dc6ff9fab5a9..9b954f4a1c3f 100644
--- a/vcl/source/app/scheduler.cxx
+++ b/vcl/source/app/scheduler.cxx
@@ -107,7 +107,8 @@ void Scheduler::ImplDeInitScheduler()
}
rSchedCtx.mpFirstSchedulerData = nullptr;
- rSchedCtx.mnTimerPeriod = 0;
+ rSchedCtx.mpLastSchedulerData = nullptr;
+ rSchedCtx.mnTimerPeriod = 0;
}
/**
@@ -234,6 +235,8 @@ bool Scheduler::ProcessTaskScheduling( bool bIdle )
pPrevSchedulerData->mpNext = pSchedulerData->mpNext;
else
rSchedCtx.mpFirstSchedulerData = pSchedulerData->mpNext;
+ if ( !pSchedulerData->mpNext )
+ rSchedCtx.mpLastSchedulerData = pPrevSchedulerData;
if ( pSchedulerData->mpTask )
pSchedulerData->mpTask->mpSchedulerData = nullptr;
ImplSchedulerData *pDeleteItem = pSchedulerData;
@@ -333,23 +336,23 @@ void Task::Start()
if ( !mpSchedulerData )
{
// insert Task
- mpSchedulerData = new ImplSchedulerData;
- mpSchedulerData->mpTask = this;
- mpSchedulerData->mbInScheduler = false;
+ ImplSchedulerData* pSchedulerData = new ImplSchedulerData;
+ pSchedulerData->mpTask = this;
+ pSchedulerData->mbInScheduler = false;
+ pSchedulerData->mpNext = nullptr;
+ mpSchedulerData = pSchedulerData;
// insert last due to SFX!
- ImplSchedulerData* pPrev = nullptr;
- ImplSchedulerData* pData = rSchedCtx.mpFirstSchedulerData;
- while ( pData )
+ if ( !rSchedCtx.mpLastSchedulerData )
{
- pPrev = pData;
- pData = pData->mpNext;
+ rSchedCtx.mpFirstSchedulerData = pSchedulerData;
+ rSchedCtx.mpLastSchedulerData = pSchedulerData;
}
- mpSchedulerData->mpNext = nullptr;
- if ( pPrev )
- pPrev->mpNext = mpSchedulerData;
else
- rSchedCtx.mpFirstSchedulerData = mpSchedulerData;
+ {
+ rSchedCtx.mpLastSchedulerData->mpNext = pSchedulerData;
+ rSchedCtx.mpLastSchedulerData = pSchedulerData;
+ }
SAL_INFO( "vcl.schedule", tools::Time::GetSystemTicks()
<< " " << mpSchedulerData << " added " << *this );
}