Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tile_data_store.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2018 Andrey Kamakin <a.kamakin@icloud.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#ifndef KIS_TILE_DATA_STORE_H_
9#define KIS_TILE_DATA_STORE_H_
10
11#include "kritaimage_export.h"
12
13#include <QReadWriteLock>
15
20
24
28class KRITAIMAGE_EXPORT KisTileDataStore
29{
30public:
33 static KisTileDataStore* instance();
34
35 void debugPrintList();
36
41
42 qint64 poolSize;
43
44 qint64 swapSize;
45 };
46
47 MemoryStatistics memoryStatistics();
48 void tryForceUpdateMemoryStatisticsWhileIdle();
49
54 inline qint32 numTiles() const
55 {
56 return m_numTiles.loadAcquire() + m_swappedStore.numTiles();
57 }
58
62 inline qint32 numTilesInMemory() const
63 {
64 return m_numTiles.loadAcquire();
65 }
66
67 inline void checkFreeMemory()
68 {
69 m_swapper.checkFreeMemory();
70 }
71
75 inline qint64 memoryMetric() const
76 {
77 return m_memoryMetric.loadAcquire();
78 }
79
80 KisTileDataStoreIterator* beginIteration();
81 void endIteration(KisTileDataStoreIterator* iterator);
82
83 KisTileDataStoreReverseIterator* beginReverseIteration();
84 void endIteration(KisTileDataStoreReverseIterator* iterator);
85
86 KisTileDataStoreClockIterator* beginClockIteration();
87 void endIteration(KisTileDataStoreClockIterator* iterator);
88
89 inline KisTileData* createDefaultTileData(qint32 pixelSize, const quint8 *defPixel)
90 {
91 return allocTileData(pixelSize, defPixel);
92 }
93
94 // Called by The Memento Manager after every commit
95 inline void kickPooler()
96 {
97 m_pooler.kick();
98
99 //FIXME: maybe, rename a function?
100 m_swapper.kick();
101 }
102
108 bool trySwapTileData(KisTileData *td);
109
110
116 KisTileData *duplicateTileData(KisTileData *rhs);
117
118 void freeTileData(KisTileData *td);
119
130 void ensureTileDataLoaded(KisTileData *td);
131
132 void registerTileData(KisTileData *td);
133 void unregisterTileData(KisTileData *td);
134
135private:
136 KisTileData *allocTileData(qint32 pixelSize, const quint8 *defPixel);
137
138 inline void registerTileDataImp(KisTileData *td);
139 inline void unregisterTileDataImp(KisTileData *td);
141
142 friend class DeadlockyThread;
143 friend class KisLowMemoryTests;
144 void debugSwapAll();
145 void debugClear();
146
147 friend class KisTiledDataManagerTest;
148 void testingSuspendPooler();
149 void testingResumePooler();
150
151 friend class KisLowMemoryBenchmark;
152 void testingRereadConfig();
153private:
156
157 friend class KisTileDataStoreTest;
158 friend class KisTileDataPoolerTest;
160
166 QAtomicInt m_numTiles;
167 QAtomicInt m_memoryMetric;
168 QAtomicInt m_counter;
169 QAtomicInt m_clockIndex;
171 QReadWriteLock m_iteratorLock;
172};
173
174template<typename T>
176{
177 unsigned long long __MiB = 1ULL << 20;
178 return value * (__MiB / (KisTileData::WIDTH * KisTileData::HEIGHT));
179}
180
181#endif /* KIS_TILE_DATA_STORE_H_ */
182
float value(const T *src, size_t ch)
PythonPluginManager * instance
KisTileDataPooler m_pooler
qint32 numTilesInMemory() const
KisTileData * createDefaultTileData(qint32 pixelSize, const quint8 *defPixel)
KisTileDataSwapper m_swapper
KisSwappedDataStore m_swappedStore
qint32 numTiles() const
QReadWriteLock m_iteratorLock
ConcurrentMap< int, KisTileData * > m_tileDataMap
void freeRegisteredTiles()
qint64 memoryMetric() const
static const qint32 HEIGHT
static const qint32 WIDTH
T MiB_TO_METRIC(T value)