7#ifndef __KIS_TEXTURE_TILE_INFO_POOL_H
8#define __KIS_TEXTURE_TILE_INFO_POOL_H
10#include <boost/pool/pool.hpp>
15#include <QMutexLocker>
16#include <QSharedPointer>
17#include <QApplication>
24#include "kritaui_export.h"
46 : m_chunkSize(tileWidth * tileHeight * pixelSize),
56 m_maxAllocations = qMax(m_maxAllocations, m_numAllocations);
58 return (quint8*)m_pool.malloc();
82 if (numFrees == m_numFrees && !m_numAllocations) {
83 m_pool.purge_memory();
90 boost::pool<boost::default_user_allocator_new_delete>
m_pool;
105 void slotPurge(
int pixelSize,
int numFrees);
106 void slotDelayedPurge();
124 : m_tileWidth(tileWidth),
125 m_tileHeight(tileHeight)
128 m_worker->moveToThread(QApplication::instance()->thread());
129 connect(
this, SIGNAL(purge(
int,
int)), m_worker, SLOT(slotPurge(
int,
int)));
141 QMutexLocker l(&m_mutex);
143 if (m_pools.size() <= pixelSize) {
144 m_pools.resize(pixelSize + 1);
147 if (!m_pools[pixelSize]) {
152 return m_pools[pixelSize]->malloc();
158 void free(quint8 *ptr,
int pixelSize) {
159 QMutexLocker l(&m_mutex);
161 if (pool->
free(ptr)) {
162 Q_EMIT purge(pixelSize, pool->
numFrees());
170 QMutexLocker l(&m_mutex);
171 return m_pools[pixelSize]->chunkSize();
175 QMutexLocker l(&m_mutex);
176 m_pools[pixelSize]->tryPurge(numFrees);
180 void purge(
int pixelSize,
int numFrees);
199 QMutexLocker l(&m_mutex);
201 PoolId id(tileWidth, tileHeight);
204 m_storage[id].toStrongRef();
209 m_storage[id] = pool;
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QWeakPointer< KisTextureTileInfoPool > KisTextureTileInfoPoolWSP
KisTextureTileInfoPoolSP getPool(int tileWidth, int tileHeight)
QHash< PoolId, KisTextureTileInfoPoolWSP > m_storage
KisTextureTileInfoPoolSingleSize(int tileWidth, int tileHeight, int pixelSize)
boost::pool< boost::default_user_allocator_new_delete > m_pool
void tryPurge(int numFrees)
KisTextureTileInfoPool * m_pool
KisSignalCompressor m_compressor
~KisTextureTileInfoPool()
quint8 * malloc(int pixelSize)
void tryPurge(int pixelSize, int numFrees)
KisTextureTileInfoPool(int tileWidth, int tileHeight)
int chunkSize(int pixelSize) const
void free(quint8 *ptr, int pixelSize)
KisTextureTileInfoPoolWorker * m_worker
void purge(int pixelSize, int numFrees)
QVector< KisTextureTileInfoPoolSingleSize * > m_pools
#define KIS_ASSERT_RECOVER_NOOP(cond)
QSharedPointer< T > toQShared(T *ptr)
QSharedPointer< KisTextureTileInfoPool > KisTextureTileInfoPoolSP