diff --git a/libs/image/tiles3/kis_tile_hash_table.h b/libs/image/tiles3/kis_tile_hash_table.h index 6170cec..30b396c 100644 --- a/libs/image/tiles3/kis_tile_hash_table.h +++ b/libs/image/tiles3/kis_tile_hash_table.h @@ -26,7 +26,6 @@ #include #include - /** * This is a template for a hash table that stores tiles (or some other * objects resembling tiles). Actually, this object should only have @@ -140,7 +139,7 @@ private: void debugListLengthDistibution(); void sanityChecksumCheck(); private: - template friend class KisTileHashTableIteratorTraits; + template friend class KisTileHashTableIteratorTraits; typedef boost::shared_lock_guard> ReadLockerImpl; typedef boost::lock_guard> WriteLockerImpl; @@ -169,6 +168,7 @@ private: #include "kis_tile_hash_table_p.h" +#include /** * Walks through all tiles inside hash table @@ -176,31 +176,33 @@ private: * during iterating with this iterator, because HT is locked. * The only thing you can do is to delete current tile. */ -template +template> > class KisTileHashTableIteratorTraits { public: typedef T TileType; typedef KisSharedPtr TileTypeSP; - KisTileHashTableIteratorTraits(KisTileHashTableTraits *ht) { + KisTileHashTableIteratorTraits(KisTileHashTableTraits *ht) + : m_locker(*ht) + { m_hashTable = ht; m_index = nextNonEmptyList(0); if (m_index < KisTileHashTableTraits::TABLE_SIZE) m_tile = m_hashTable->m_hashTable[m_index]; //m_hashTable->m_lock.lockForWrite(); - m_hashTable->lock(); + //m_hashTable->lock(); } - ~KisTileHashTableIteratorTraits() { + ~KisTileHashTableIteratorTraits() { if (m_index != -1) { //m_hashTable->m_lock.unlock(); - m_hashTable->unlock(); + //m_hashTable->unlock(); } } - KisTileHashTableIteratorTraits& operator++() { + KisTileHashTableIteratorTraits& operator++() { next(); return *this; } @@ -248,13 +250,14 @@ public: void destroy() { m_index = -1; - m_hashTable->unlock(); + //m_hashTable->unlock(); //m_hashTable->m_lock.unlock(); } protected: TileTypeSP m_tile; qint32 m_index; KisTileHashTableTraits *m_hashTable; + LockerType m_locker; protected: qint32 nextNonEmptyList(qint32 startIdx) { @@ -268,11 +271,12 @@ protected: return idx; } private: - Q_DISABLE_COPY(KisTileHashTableIteratorTraits) + Q_DISABLE_COPY(KisTileHashTableIteratorTraits) }; typedef KisTileHashTableTraits KisTileHashTable; typedef KisTileHashTableIteratorTraits KisTileHashTableIterator; +typedef KisTileHashTableIteratorTraits> KisTileHashTableConstIterator; #endif /* KIS_TILEHASHTABLE_H_ */ diff --git a/libs/image/tiles3/kis_tiled_data_manager.cc b/libs/image/tiles3/kis_tiled_data_manager.cc index 2191de5..9c44679 100644 --- a/libs/image/tiles3/kis_tiled_data_manager.cc +++ b/libs/image/tiles3/kis_tiled_data_manager.cc @@ -646,7 +646,7 @@ void KisTiledDataManager::recalculateExtent() m_extentMaxX = qint32_MIN; m_extentMaxY = qint32_MIN; - KisTileHashTableIterator iter(m_hashTable); + KisTileHashTableConstIterator iter(m_hashTable); KisTileSP tile; while ((tile = iter.tile())) { @@ -694,7 +694,7 @@ QRegion KisTiledDataManager::region() const { QRegion region; - KisTileHashTableIterator iter(m_hashTable); + KisTileHashTableConstIterator iter(m_hashTable); KisTileSP tile; while ((tile = iter.tile())) {