|
Krita Source Code Documentation
|
#include <kis_tile_data_store.h>
Classes | |
| struct | MemoryStatistics |
Public Member Functions | |
| KisTileDataStoreClockIterator * | beginClockIteration () |
| KisTileDataStoreIterator * | beginIteration () |
| KisTileDataStoreReverseIterator * | beginReverseIteration () |
| void | checkFreeMemory () |
| KisTileData * | createDefaultTileData (qint32 pixelSize, const quint8 *defPixel) |
| void | debugPrintList () |
| KisTileData * | duplicateTileData (KisTileData *rhs) |
| void | endIteration (KisTileDataStoreClockIterator *iterator) |
| void | endIteration (KisTileDataStoreIterator *iterator) |
| void | endIteration (KisTileDataStoreReverseIterator *iterator) |
| void | ensureTileDataLoaded (KisTileData *td) |
| void | freeTileData (KisTileData *td) |
| void | kickPooler () |
| KisTileDataStore () | |
| qint64 | memoryMetric () const |
| MemoryStatistics | memoryStatistics () |
| qint32 | numTiles () const |
| qint32 | numTilesInMemory () const |
| void | registerTileData (KisTileData *td) |
| void | tryForceUpdateMemoryStatisticsWhileIdle () |
| bool | trySwapTileData (KisTileData *td) |
| void | unregisterTileData (KisTileData *td) |
| ~KisTileDataStore () | |
Static Public Member Functions | |
| static KisTileDataStore * | instance () |
Private Member Functions | |
| KisTileData * | allocTileData (qint32 pixelSize, const quint8 *defPixel) |
| void | debugClear () |
| void | debugSwapAll () |
| void | freeRegisteredTiles () |
| void | registerTileDataImp (KisTileData *td) |
| void | testingRereadConfig () |
| void | testingResumePooler () |
| void | testingSuspendPooler () |
| void | unregisterTileDataImp (KisTileData *td) |
Private Attributes | |
| QAtomicInt | m_clockIndex |
| QAtomicInt | m_counter |
| QReadWriteLock | m_iteratorLock |
| QAtomicInt | m_memoryMetric |
| QAtomicInt | m_numTiles |
| KisTileDataPooler | m_pooler |
| KisSwappedDataStore | m_swappedStore |
| KisTileDataSwapper | m_swapper |
| ConcurrentMap< int, KisTileData * > | m_tileDataMap |
Friends | |
| class | DeadlockyThread |
| class | KisLowMemoryBenchmark |
| class | KisLowMemoryTests |
| class | KisTileDataPoolerTest |
| class | KisTileDataStoreTest |
| class | KisTiledDataManagerTest |
Stores tileData objects. When needed compresses them and swaps.
Definition at line 28 of file kis_tile_data_store.h.
| KisTileDataStore::KisTileDataStore | ( | ) |
Definition at line 58 of file kis_tile_data_store.cc.
| KisTileDataStore::~KisTileDataStore | ( | ) |
Definition at line 70 of file kis_tile_data_store.cc.
References errKrita, m_pooler, m_swapper, numTiles(), numTilesInMemory(), KisTileDataPooler::terminatePooler(), and KisTileDataSwapper::terminateSwapper().
|
private |
Definition at line 167 of file kis_tile_data_store.cc.
References registerTileData().
| KisTileDataStoreClockIterator * KisTileDataStore::beginClockIteration | ( | ) |
Definition at line 305 of file kis_tile_data_store.cc.
References m_clockIndex, m_iteratorLock, and m_tileDataMap.
| KisTileDataStoreIterator * KisTileDataStore::beginIteration | ( | ) |
Definition at line 282 of file kis_tile_data_store.cc.
References m_iteratorLock, and m_tileDataMap.
| KisTileDataStoreReverseIterator * KisTileDataStore::beginReverseIteration | ( | ) |
Definition at line 293 of file kis_tile_data_store.cc.
References m_iteratorLock, and m_tileDataMap.
|
inline |
Definition at line 67 of file kis_tile_data_store.h.
|
inline |
Definition at line 89 of file kis_tile_data_store.h.
|
private |
Definition at line 350 of file kis_tile_data_store.cc.
References ConcurrentMap< K, V, KT, VT >::Iterator::getValue(), ConcurrentMap< K, V, KT, VT >::Iterator::isValid(), m_clockIndex, m_counter, m_iteratorLock, m_memoryMetric, m_numTiles, m_tileDataMap, and ConcurrentMap< K, V, KT, VT >::Iterator::next().
| void KisTileDataStore::debugPrintList | ( | ) |
Definition at line 318 of file kis_tile_data_store.cc.
References beginIteration(), dbgTiles, endIteration(), KisTileDataStoreIterator::hasNext(), KisTileData::m_refCount, and KisTileDataStoreIterator::next().
|
private |
Definition at line 333 of file kis_tile_data_store.cc.
References beginIteration(), endIteration(), KisTileDataStoreIterator::hasNext(), KisTileDataStoreIterator::next(), and KisTileDataStoreIterator::trySwapOut().
| KisTileData * KisTileDataStore::duplicateTileData | ( | KisTileData * | rhs | ) |
WARN: The following three method are only for usage in KisTileData. Do not call them directly!
Definition at line 174 of file kis_tile_data_store.cc.
References KisTileData::blockSwapping(), DEBUG_COUNT_PRECLONE_HIT, DEBUG_COUNT_PRECLONE_MISS, DEBUG_PRECLONE_ACTION, KisTileData::m_clonesStack, KisLocklessStack< T >::pop(), registerTileData(), and KisTileData::unblockSwapping().
| void KisTileDataStore::endIteration | ( | KisTileDataStoreClockIterator * | iterator | ) |
Definition at line 311 of file kis_tile_data_store.cc.
References KisTileDataStoreClockIterator::getFinalPosition(), m_clockIndex, and m_iteratorLock.
| void KisTileDataStore::endIteration | ( | KisTileDataStoreIterator * | iterator | ) |
Definition at line 287 of file kis_tile_data_store.cc.
References m_iteratorLock.
| void KisTileDataStore::endIteration | ( | KisTileDataStoreReverseIterator * | iterator | ) |
Definition at line 298 of file kis_tile_data_store.cc.
References DEBUG_REPORT_PRECLONE_EFFICIENCY, and m_iteratorLock.
| void KisTileDataStore::ensureTileDataLoaded | ( | KisTileData * | td | ) |
Ensures that the tile data is totally present in memory and it's swapping is blocked by holding td->m_swapLock in a read mode. PRECONDITIONS: td->m_swapLock is unlocked m_listRWLock is unlocked POSTCONDITIONS: td->m_data is in memory and td->m_swapLock is locked m_listRWLock is unlocked
The order of this heavy locking is very important. Change it only in case, you really know what you are doing.
If someone has managed to load the td from swap, then, most probably, they have already taken the swap lock. This may lead to a deadlock, because COW mechanism breaks lock ordering rules in duplicateTileData() (it takes m_listLock while the swap lock is held). In our case it is enough just to check whether the other thread has already fetched the data. Please notice that we do not take both of the locks while checking this, because holding m_listLock is enough. Nothing can happen to the tile while we hold m_listLock.
<– In theory, livelock is possible here...
Definition at line 214 of file kis_tile_data_store.cc.
References checkFreeMemory(), KisTileData::data(), m_iteratorLock, KisTileData::m_swapLock, m_swappedStore, registerTileDataImp(), and KisSwappedDataStore::swapInTileData().
|
private |
| void KisTileDataStore::freeTileData | ( | KisTileData * | td | ) |
Definition at line 193 of file kis_tile_data_store.cc.
References KisTileData::data(), DEBUG_FREE_ACTION, KisSwappedDataStore::forgetTileData(), m_iteratorLock, KisTileData::m_store, KisTileData::m_swapLock, m_swappedStore, and unregisterTileDataImp().
|
static |
Definition at line 82 of file kis_tile_data_store.cc.
|
inline |
Definition at line 95 of file kis_tile_data_store.h.
|
inline |
Definition at line 75 of file kis_tile_data_store.h.
| KisTileDataStore::MemoryStatistics KisTileDataStore::memoryStatistics | ( | ) |
Definition at line 87 of file kis_tile_data_store.cc.
References KisTileData::HEIGHT, KisTileDataStore::MemoryStatistics::historicalMemorySize, KisTileDataPooler::lastHistoricalMemoryMetric(), KisTileDataPooler::lastPoolMemoryMetric(), KisTileDataPooler::lastRealMemoryMetric(), m_iteratorLock, m_pooler, m_swappedStore, memoryMetric(), KisTileDataStore::MemoryStatistics::poolSize, KisTileDataStore::MemoryStatistics::realMemorySize, KisTileDataStore::MemoryStatistics::swapSize, KisTileDataStore::MemoryStatistics::totalMemorySize, KisSwappedDataStore::totalSwapMemoryUsed(), and KisTileData::WIDTH.
|
inline |
Returns total number of tiles present: in memory or in a swap file
Definition at line 54 of file kis_tile_data_store.h.
|
inline |
Returns the number of tiles present in memory only
Definition at line 62 of file kis_tile_data_store.h.
| void KisTileDataStore::registerTileData | ( | KisTileData * | td | ) |
Definition at line 132 of file kis_tile_data_store.cc.
References m_iteratorLock, and registerTileDataImp().
|
inlineprivate |
Definition at line 115 of file kis_tile_data_store.cc.
References ConcurrentMap< K, V, KT, VT >::assign(), ConcurrentMap< K, V, KT, VT >::getGC(), QSBR::lockRawPointerAccess(), m_counter, m_memoryMetric, m_numTiles, m_tileDataMap, KisTileData::m_tileNumber, KisTileData::pixelSize(), QSBR::unlockRawPointerAccess(), and QSBR::update().
|
private |
Definition at line 366 of file kis_tile_data_store.cc.
References kickPooler(), m_pooler, m_swapper, KisTileDataPooler::testingRereadConfig(), and KisTileDataSwapper::testingRereadConfig().
|
private |
Definition at line 378 of file kis_tile_data_store.cc.
References m_pooler.
|
private |
Definition at line 373 of file kis_tile_data_store.cc.
References m_pooler, and KisTileDataPooler::terminatePooler().
| void KisTileDataStore::tryForceUpdateMemoryStatisticsWhileIdle | ( | ) |
Definition at line 106 of file kis_tile_data_store.cc.
References KisTileDataPooler::forceUpdateMemoryStats(), and m_pooler.
| bool KisTileDataStore::trySwapTileData | ( | KisTileData * | td | ) |
Try swap out the tile data. It may fail in case the tile is being accessed at the same moment of time.
This function is called with m_listLock acquired
Definition at line 262 of file kis_tile_data_store.cc.
References KisTileData::data(), KisTileData::m_swapLock, m_swappedStore, KisSwappedDataStore::trySwapOutTileData(), and unregisterTileDataImp().
| void KisTileDataStore::unregisterTileData | ( | KisTileData * | td | ) |
Definition at line 161 of file kis_tile_data_store.cc.
References m_iteratorLock, and unregisterTileDataImp().
|
inlineprivate |
Definition at line 138 of file kis_tile_data_store.cc.
References KisTileData::deref(), ConcurrentMap< K, V, KT, VT >::erase(), ConcurrentMap< K, V, KT, VT >::get(), ConcurrentMap< K, V, KT, VT >::getGC(), QSBR::lockRawPointerAccess(), m_clockIndex, m_counter, m_memoryMetric, m_numTiles, m_tileDataMap, KisTileData::m_tileNumber, KisTileData::pixelSize(), QSBR::unlockRawPointerAccess(), and QSBR::update().
|
friend |
Definition at line 142 of file kis_tile_data_store.h.
|
friend |
Definition at line 151 of file kis_tile_data_store.h.
|
friend |
Definition at line 143 of file kis_tile_data_store.h.
|
friend |
Definition at line 158 of file kis_tile_data_store.h.
|
friend |
Definition at line 157 of file kis_tile_data_store.h.
|
friend |
Definition at line 147 of file kis_tile_data_store.h.
|
private |
Definition at line 169 of file kis_tile_data_store.h.
|
private |
Definition at line 168 of file kis_tile_data_store.h.
|
private |
Definition at line 171 of file kis_tile_data_store.h.
|
private |
Definition at line 167 of file kis_tile_data_store.h.
|
private |
This metric is used for computing the volume of memory occupied by tile data objects. metric = num_bytes / (KisTileData::WIDTH * KisTileData::HEIGHT)
Definition at line 166 of file kis_tile_data_store.h.
|
private |
Definition at line 154 of file kis_tile_data_store.h.
|
private |
Definition at line 159 of file kis_tile_data_store.h.
|
private |
Definition at line 155 of file kis_tile_data_store.h.
|
private |
Definition at line 170 of file kis_tile_data_store.h.