Changeset View
Changeset View
Standalone View
Standalone View
libs/image/kis_update_scheduler.cpp
Show First 20 Lines • Show All 49 Lines • ▼ Show 20 Line(s) | 49 | Private(KisUpdateScheduler *_q, KisProjectionUpdateListener *p) | |||
---|---|---|---|---|---|
50 | : q(_q) | 50 | : q(_q) | ||
51 | , projectionUpdateListener(p) | 51 | , projectionUpdateListener(p) | ||
52 | {} | 52 | {} | ||
53 | 53 | | |||
54 | KisUpdateScheduler *q; | 54 | KisUpdateScheduler *q; | ||
55 | 55 | | |||
56 | KisSimpleUpdateQueue updatesQueue; | 56 | KisSimpleUpdateQueue updatesQueue; | ||
57 | KisStrokesQueue strokesQueue; | 57 | KisStrokesQueue strokesQueue; | ||
58 | KisUpdaterContext updaterContext; | | |||
59 | bool processingBlocked = false; | 58 | bool processingBlocked = false; | ||
60 | qreal balancingRatio = 1.0; // updates-queue-size/strokes-queue-size | 59 | qreal balancingRatio = 1.0; // updates-queue-size/strokes-queue-size | ||
61 | KisProjectionUpdateListener *projectionUpdateListener; | 60 | KisProjectionUpdateListener *projectionUpdateListener; | ||
62 | KisQueuesProgressUpdater *progressUpdater = 0; | 61 | KisQueuesProgressUpdater *progressUpdater = 0; | ||
63 | 62 | | |||
64 | QAtomicInt updatesLockCounter; | 63 | QAtomicInt updatesLockCounter; | ||
65 | QReadWriteLock updatesStartLock; | 64 | QReadWriteLock updatesStartLock; | ||
66 | KisLazyWaitCondition updatesFinishedCondition; | 65 | KisLazyWaitCondition updatesFinishedCondition; | ||
66 | | ||||
67 | // KisUpdaterContext can emit signals to KisUpdateScheduler in the dtor, so it | ||||
68 | // must to be deleted before anything else. | ||||
69 | // That means updaterContext must be declared last. | ||||
70 | KisUpdaterContext updaterContext; | ||||
67 | }; | 71 | }; | ||
68 | 72 | | |||
69 | KisUpdateScheduler::KisUpdateScheduler(KisProjectionUpdateListener *projectionUpdateListener) | 73 | KisUpdateScheduler::KisUpdateScheduler(KisProjectionUpdateListener *projectionUpdateListener) | ||
70 | : m_d(new Private(this, projectionUpdateListener)) | 74 | : m_d(new Private(this, projectionUpdateListener)) | ||
71 | { | 75 | { | ||
72 | updateSettings(); | 76 | updateSettings(); | ||
73 | connectSignals(); | 77 | connectSignals(); | ||
74 | } | 78 | } | ||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Line(s) | 158 | if(m_d->processingBlocked) { | |||
158 | needLock = false; | 162 | needLock = false; | ||
159 | } | 163 | } | ||
160 | 164 | | |||
161 | if(needLock) lock(); | 165 | if(needLock) lock(); | ||
162 | m_d->updaterContext.lock(); | 166 | m_d->updaterContext.lock(); | ||
163 | 167 | | |||
164 | Q_ASSERT(m_d->updaterContext.isJobAllowed(walker)); | 168 | Q_ASSERT(m_d->updaterContext.isJobAllowed(walker)); | ||
165 | m_d->updaterContext.addMergeJob(walker); | 169 | m_d->updaterContext.addMergeJob(walker); | ||
166 | m_d->updaterContext.waitForDone(); | | |||
167 | 170 | | |||
168 | m_d->updaterContext.unlock(); | 171 | m_d->updaterContext.unlock(); | ||
172 | | ||||
173 | m_d->updaterContext.waitForDone(); | ||||
dkazakov: Yes, this reordering makes the code look much more sane! :) | |||||
174 | | ||||
169 | if(needLock) unlock(true); | 175 | if(needLock) unlock(true); | ||
170 | } | 176 | } | ||
171 | 177 | | |||
172 | void KisUpdateScheduler::addSpontaneousJob(KisSpontaneousJob *spontaneousJob) | 178 | void KisUpdateScheduler::addSpontaneousJob(KisSpontaneousJob *spontaneousJob) | ||
173 | { | 179 | { | ||
174 | m_d->updatesQueue.addSpontaneousJob(spontaneousJob); | 180 | m_d->updatesQueue.addSpontaneousJob(spontaneousJob); | ||
175 | processQueues(); | 181 | processQueues(); | ||
176 | } | 182 | } | ||
▲ Show 20 Lines • Show All 226 Lines • ▼ Show 20 Line(s) | 405 | { | |||
403 | m_d->updatesQueue.processQueue(m_d->updaterContext); | 409 | m_d->updatesQueue.processQueue(m_d->updaterContext); | ||
404 | } | 410 | } | ||
405 | 411 | | |||
406 | bool KisUpdateScheduler::haveUpdatesRunning() | 412 | bool KisUpdateScheduler::haveUpdatesRunning() | ||
407 | { | 413 | { | ||
408 | QWriteLocker locker(&m_d->updatesStartLock); | 414 | QWriteLocker locker(&m_d->updatesStartLock); | ||
409 | 415 | | |||
410 | qint32 numMergeJobs, numStrokeJobs; | 416 | qint32 numMergeJobs, numStrokeJobs; | ||
417 | m_d->updaterContext.lock(); | ||||
dkazakov: Good catch! :) | |||||
411 | m_d->updaterContext.getJobsSnapshot(numMergeJobs, numStrokeJobs); | 418 | m_d->updaterContext.getJobsSnapshot(numMergeJobs, numStrokeJobs); | ||
419 | m_d->updaterContext.unlock(); | ||||
412 | 420 | | |||
413 | return numMergeJobs; | 421 | return numMergeJobs; | ||
414 | } | 422 | } | ||
415 | 423 | | |||
416 | void KisUpdateScheduler::continueUpdate(const QRect &rect) | 424 | void KisUpdateScheduler::continueUpdate(const QRect &rect) | ||
417 | { | 425 | { | ||
418 | Q_ASSERT(m_d->projectionUpdateListener); | 426 | Q_ASSERT(m_d->projectionUpdateListener); | ||
419 | m_d->projectionUpdateListener->notifyProjectionUpdated(rect); | 427 | m_d->projectionUpdateListener->notifyProjectionUpdated(rect); | ||
Show All 36 Lines |
Yes, this reordering makes the code look much more sane! :)