7#ifndef KIS_TILEHASHTABLE_2_H
8#define KIS_TILEHASHTABLE_2_H
37 static constexpr bool isInherited = std::is_convertible<T*, KisShared*>::value;
128 if (col == 0 && row == 0) {
133 return ((
static_cast<quint32
>(row) << 16) | (
static_cast<quint32
>(col) & 0xFFFF));
167 tile->notifyDeadWithoutDetaching();
182 bool wasDeleted =
false;
186 tile->notifyDetachedFromDataManager();
226 m_ht->m_iteratorLock.lockForWrite();
232 m_ht->m_iteratorLock.unlock();
261 quint32 idx =
m_ht->calculateHash(
tile->col(),
tile->row());
273 : m_numTiles(0), m_defaultTileData(0), m_mementoManager(mm)
297 setDefaultTileData(0);
303 return getExistingTile(col, row);
309 const quint32 idx = calculateHashSafe(col, row);
315 m_map.getGC().lockRawPointerAccess();
317 m_map.getGC().unlockRawPointerAccess();
319 m_map.getGC().update();
327 const quint32 idx = calculateHashSafe(col, row);
337 QReadLocker locker(&m_defaultPixelDataLock);
338 return new TileType(col, row, m_defaultTileData, 0);
343 m_map.getGC().lockRawPointerAccess();
350 m_map.getGC().unlockRawPointerAccess();
353 QReadLocker locker(&m_defaultPixelDataLock);
354 tile =
new TileType(col, row, m_defaultTileData, 0);
357 TileTypeSP::ref(&tile, tile.
data());
362 m_iteratorLock.lockForRead();
365 m_map.getGC().lockRawPointerAccess();
371 discardedTile =
mutator.exchangeValue(tile.
data());
373 discardedTile = tile.
data();
376 m_iteratorLock.unlock();
384 discardedTile->notifyDeadWithoutDetaching();
385 m_map.getGC().enqueue(&MemoryReclaimer::destroy,
new MemoryReclaimer(discardedTile));
387 tile = m_map.get(idx);
392 m_numTiles.fetchAndAddRelaxed(1);
394 tile->notifyAttachedToDataManager(m_mementoManager);
397 m_map.getGC().unlockRawPointerAccess();
399 m_map.getGC().update();
406 const quint32 idx = calculateHashSafe(col, row);
415 existingTile =
false;
417 QReadLocker locker(&m_defaultPixelDataLock);
418 return new TileType(col, row, m_defaultTileData, 0);
421 m_map.getGC().lockRawPointerAccess();
423 m_map.getGC().unlockRawPointerAccess();
428 QReadLocker locker(&m_defaultPixelDataLock);
429 tile =
new TileType(col, row, m_defaultTileData, 0);
432 m_map.getGC().update();
439 quint32 idx = calculateHash(tile->col(), tile->row());
446 return deleteTile(tile->col(), tile->row());
452 const quint32 idx = calculateHashSafe(col, row);
465 QWriteLocker locker(&m_iteratorLock);
471 m_map.getGC().lockRawPointerAccess();
472 tile = m_map.erase(iter.
getKey());
475 tile->notifyDetachedFromDataManager();
476 m_map.getGC().enqueue(&MemoryReclaimer::destroy,
new MemoryReclaimer(tile));
478 m_map.getGC().unlockRawPointerAccess();
483 m_numTiles.storeRelaxed(0);
487 m_map.getGC().update();
493 QWriteLocker locker(&m_defaultPixelDataLock);
495 if (m_defaultTileData) {
496 m_defaultTileData->release();
497 m_defaultTileData = 0;
500 if (defaultTileData) {
502 m_defaultTileData = defaultTileData;
509 QReadLocker locker(&m_defaultPixelDataLock);
510 return m_defaultTileData;
516 QReadLocker locker(&m_defaultPixelDataLock);
517 m_defaultTileData->ref();
518 return m_defaultTileData;
Value assign(Key key, Value desired)
KisTileHashTableTraits2< T > * m_ht
KisSharedPtr< T > TileTypeSP
void moveCurrentToHashTable(KisTileHashTableTraits2< T > *newHashTable)
~KisTileHashTableIteratorTraits2()
ConcurrentMap< quint32, TileType * >::Iterator Iterator
KisTileHashTableIteratorTraits2(KisTileHashTableTraits2< T > *ht)
KisTileData * refAndFetchDefaultTileData()
KisTileData * defaultTileData()
ConcurrentMap< quint32, TileType * > LockFreeTileMap
TileTypeSP getExistingTile(qint32 col, qint32 row)
TileTypeSP getTileLazy(qint32 col, qint32 row, bool &newTile)
void insert(quint32 idx, TileTypeSP item)
static constexpr bool isInherited
quint32 calculateHashImpl(qint32 col, qint32 row)
KisWeakSharedPtr< T > TileTypeWSP
KisMementoManager * m_mementoManager
Q_STATIC_ASSERT_X(isInherited, "Template must inherit KisShared")
KisTileHashTableTraits2(KisMementoManager *mm)
quint32 calculateHash(qint32 col, qint32 row)
LockFreeTileMap::Mutator LockFreeTileMapMutator
quint32 calculateHashSafe(qint32 col, qint32 row)
KisSharedPtr< T > TileTypeSP
TileTypeSP getReadOnlyTileLazy(qint32 col, qint32 row, bool &existingTile)
QReadWriteLock m_iteratorLock
void setDefaultTileData(KisTileData *defaultTileData)
void debugMaxListLength(qint32 &min, qint32 &max)
bool tileExists(qint32 col, qint32 row)
KisTileData * m_defaultTileData
void addTile(TileTypeSP tile)
bool deleteTile(TileTypeSP tile)
QReadWriteLock m_defaultPixelDataLock
~KisTileHashTableTraits2()
void lockRawPointerAccess()
void enqueue(void(T::*pmf)(), T *target, bool migration=false)
void unlockRawPointerAccess()
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_ASSERT_RECOVER_NOOP(cond)
KisTileHashTableIteratorTraits2< KisTile > KisTileHashTableConstIterator
KisTileHashTableIteratorTraits2< KisTile > KisTileHashTableIterator
KisTileHashTableTraits2< KisTile > KisTileHashTable
struct Tile * newTile(struct rect r)
MemoryReclaimer(TileType *data)