14#include <boost/pool/singleton_pool.hpp>
18#define TILE_SIZE_4BPP (4 * __TILE_DATA_WIDTH * __TILE_DATA_HEIGHT)
19#define TILE_SIZE_8BPP (8 * __TILE_DATA_WIDTH * __TILE_DATA_HEIGHT)
21typedef boost::singleton_pool<KisTileData, TILE_SIZE_4BPP, boost::default_user_allocator_new_delete, boost::details::pool::default_mutex, 256, 4096>
BoostPool4BPP;
22typedef boost::singleton_pool<KisTileData, TILE_SIZE_8BPP, boost::default_user_allocator_new_delete, boost::details::pool::default_mutex, 128, 2048>
BoostPool8BPP;
40 BoostPool4BPP::free(ptr);
44 BoostPool8BPP::free(ptr);
59 m_pixelSize(pixelSize),
62 if (checkFreeMemory) {
88 m_pixelSize(rhs.m_pixelSize),
91 if (checkFreeMemory) {
142 ptr = (quint8*)BoostPool4BPP::malloc();
145 ptr = (quint8*)BoostPool8BPP::malloc();
161 BoostPool4BPP::free(ptr);
164 BoostPool8BPP::free(ptr);
175#ifdef DEBUG_POOL_RELEASE
181 const int maxMigratedTiles = 100;
187 bool failedToLock =
false;
210 const bool locked = item->
m_swapLock.tryLockForWrite();
218 memoryChunks << QByteArray((
const char*)item->m_data, chunkSize);
226 BoostPool4BPP::purge_memory();
227 BoostPool8BPP::purge_memory();
229 auto it = dataObjects.begin();
230 auto chunkIt = memoryChunks.constBegin();
232 for (; it != dataObjects.end(); ++it, ++chunkIt) {
237 memcpy(item->
m_data, chunkIt->data(), chunkSize);
246 warnKrita <<
"WARNING: Failed to lock the tiles while trying to release the pooled memory";
251#ifdef DEBUG_POOL_RELEASE
252 dbgKrita <<
"After purging unused memory:";
255 sprintf(command,
"cat /proc/%d/status | grep -i vm", (
int)getpid());
256 printf(
"--- %s ---\n", command);
257 (
void)system(command);
261 dbgKrita <<
"DEBUG: releasing of the pooled memory has been cancelled:"
264 <<
"tiles in memory";
qint32 numTilesInMemory() const
void endIteration(KisTileDataStoreIterator *iterator)
KisTileDataStoreIterator * beginIteration()
static KisTileDataStore * instance()
QReadWriteLock m_swapLock
KisTileData(qint32 pixelSize, const quint8 *defPixel, KisTileDataStore *store, bool checkFreeMemory=true)
quint32 pixelSize() const
void fillWithPixel(const quint8 *defPixel)
static void freeData(quint8 *ptr, const qint32 pixelSize)
KisTileDataStore * m_store
static void releaseInternalPools()
KisTileDataCache m_clonesStack
static SimpleCache m_cache
static const qint32 HEIGHT
static const qint32 WIDTH
static quint8 * allocateData(const qint32 pixelSize)
bool pop(int pixelSize, quint8 *&ptr)
KisLocklessStack< quint8 * > m_16Pool
bool push(int pixelSize, quint8 *&ptr)
QReadWriteLock m_cacheLock
KisLocklessStack< quint8 * > m_4Pool
KisLocklessStack< quint8 * > m_8Pool
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
boost::singleton_pool< KisTileData, TILE_SIZE_4BPP, boost::default_user_allocator_new_delete, boost::details::pool::default_mutex, 256, 4096 > BoostPool4BPP
boost::singleton_pool< KisTileData, TILE_SIZE_8BPP, boost::default_user_allocator_new_delete, boost::details::pool::default_mutex, 128, 2048 > BoostPool8BPP
#define __TILE_DATA_WIDTH
#define __TILE_DATA_HEIGHT