9#include "config-memory-leak-tracker.h"
11#include <QGlobalStatic>
25#define DEBUG_PRECLONE_ACTION(action, oldTD, newTD) \
26 printf("!!! %s:\t\t\t 0x%X -> 0x%X \t\t!!!\n", \
27 action, (quintptr)oldTD, (quintptr) newTD)
28#define DEBUG_FREE_ACTION(td) \
29 printf("Tile data free'd \t(0x%X)\n", td)
31#define DEBUG_PRECLONE_ACTION(action, oldTD, newTD)
32#define DEBUG_FREE_ACTION(td)
36qint64 __preclone_miss = 0;
37qint64 __preclone_hit = 0;
39qint64 __preclone_miss_user_count = 0;
40qint64 __preclone_miss_age = 0;
42#define DEBUG_COUNT_PRECLONE_HIT(td) __preclone_hit++
43#define DEBUG_COUNT_PRECLONE_MISS(td) __preclone_miss++; __preclone_miss_user_count+=td->numUsers(); __preclone_miss_age+=td->age()
44#define DEBUG_REPORT_PRECLONE_EFFICIENCY() \
45 dbgKrita << "Hits:" << __preclone_hit \
46 << "of" << __preclone_hit + __preclone_miss \
48 << qreal(__preclone_hit) / (__preclone_hit + __preclone_miss) \
50 << "miss users" << qreal(__preclone_miss_user_count) / __preclone_miss \
51 << "miss age" << qreal(__preclone_miss_age) / __preclone_miss
53#define DEBUG_COUNT_PRECLONE_HIT(td)
54#define DEBUG_COUNT_PRECLONE_MISS(td)
55#define DEBUG_REPORT_PRECLONE_EFFICIENCY()
76 errKrita <<
"Warning: some tiles have leaked:";
117 int index =
m_counter.fetchAndAddOrdered(1);
221 while (!td->
data()) {
269 if (!td->
m_swapLock.tryLockForWrite())
return result;
325 dbgTiles <<
"-------------------------\n"
326 <<
"TileData:\t\t\t" << item
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
Value assign(Key key, Value desired)
bool trySwapOutTileData(KisTileData *td)
qint64 totalSwapMemoryUsed() const
void forgetTileData(KisTileData *td)
void swapInTileData(KisTileData *td)
qint64 lastRealMemoryMetric() const
void testingRereadConfig()
qint64 lastHistoricalMemoryMetric() const
qint64 lastPoolMemoryMetric() const
void forceUpdateMemoryStats()
bool trySwapOut(KisTileData *td)
void testingSuspendPooler()
void ensureTileDataLoaded(KisTileData *td)
KisTileDataPooler m_pooler
qint32 numTilesInMemory() const
void registerTileData(KisTileData *td)
void freeTileData(KisTileData *td)
void unregisterTileData(KisTileData *td)
KisTileDataStoreClockIterator * beginClockIteration()
KisTileDataSwapper m_swapper
KisTileData * allocTileData(qint32 pixelSize, const quint8 *defPixel)
void endIteration(KisTileDataStoreIterator *iterator)
KisTileDataStoreIterator * beginIteration()
KisSwappedDataStore m_swappedStore
QAtomicInt m_memoryMetric
void unregisterTileDataImp(KisTileData *td)
QReadWriteLock m_iteratorLock
KisTileDataStoreReverseIterator * beginReverseIteration()
void tryForceUpdateMemoryStatisticsWhileIdle()
bool trySwapTileData(KisTileData *td)
KisTileData * duplicateTileData(KisTileData *rhs)
ConcurrentMap< int, KisTileData * > m_tileDataMap
void testingResumePooler()
MemoryStatistics memoryStatistics()
void testingRereadConfig()
void registerTileDataImp(KisTileData *td)
static KisTileDataStore * instance()
qint64 memoryMetric() const
QReadWriteLock m_swapLock
quint32 pixelSize() const
KisTileDataStore * m_store
KisTileDataCache m_clonesStack
static const qint32 HEIGHT
static const qint32 WIDTH
void lockRawPointerAccess()
void unlockRawPointerAccess()
#define DEBUG_FREE_ACTION(td)
#define DEBUG_COUNT_PRECLONE_HIT(td)
#define DEBUG_REPORT_PRECLONE_EFFICIENCY()
#define DEBUG_PRECLONE_ACTION(action, oldTD, newTD)
#define DEBUG_COUNT_PRECLONE_MISS(td)
qint64 historicalMemorySize
void testingRereadConfig()