11#define GAP_SIZE(low, high) ((high) - (low) > 0 ? (high) - (low) - 1 : 0)
13#define HAS_NEXT(list,iter) ((iter)!=(list).end())
14#define HAS_PREVIOUS(list,iter) ((iter)!=(list).begin())
16#define PEEK_NEXT(iter) (*(iter))
17#define PEEK_PREVIOUS(iter) (*((iter)-1))
18#define WRAP_PREVIOUS_CHUNK_DATA(iter) (KisChunk((iter)-1))
73 qFatal(
"KisChunkAllocator: out of swap space");
96 if(
GAP_SIZE(lowBound, highBound) >= size) {
97 list.insert(iterator,
KisChunkData(lowBound + shift, size));
128 qInfo(
"chunk #%lld: [%lld %lld]", idx++, i->m_begin, i->m_end);
140 qWarning(
"Chunks overlapped: [%lld %lld], [%lld %lld]",
PEEK_PREVIOUS(i).m_begin,
PEEK_PREVIOUS(i).m_end, i->m_begin, i->m_end);
150 warnKrita <<
"Last chunk exceeds the store size!";
155 if(failed && pleaseCrash)
156 qFatal(
"KisChunkAllocator: sanity check failed!");
165 quint64 totalSize = 0;
166 quint64 allocated = 0;
168 qreal fragmentation = 0;
171 allocated += i->m_end - i->m_begin + 1;
184 fragmentation = qreal(free) / totalSize;
191 qInfo() <<
"Total used:\t\t" << totalSize;
192 qInfo() <<
"Allocated:\t\t" << allocated;
193 qInfo() <<
"Free:\t\t\t" << free;
194 qInfo() <<
"Fragmentation:\t\t" << fragmentation;
198 Q_ASSERT(totalSize == allocated + free);
200 return fragmentation;
KisChunk getChunk(quint64 size)
KisChunkAllocator(quint64 slabSize=DEFAULT_SLAB_SIZE, quint64 storeSize=DEFAULT_STORE_SIZE)
qreal debugFragmentation(bool toStderr=true)
bool tryInsertChunk(KisChunkDataList &list, KisChunkDataListIterator &iterator, quint64 size)
void freeChunk(KisChunk chunk)
bool sanityCheck(bool pleaseCrash=true)
KisChunkDataListIterator m_iterator
KisChunkDataListIterator position()
#define GAP_SIZE(low, high)
#define HAS_NEXT(list, iter)
#define HAS_PREVIOUS(list, iter)
#define PEEK_PREVIOUS(iter)
#define WRAP_PREVIOUS_CHUNK_DATA(iter)
#define INIT_FAIL_COUNTER()
QLinkedList< KisChunkData > KisChunkDataList
#define DEBUG_FAIL_COUNTER()
KisChunkDataList::iterator KisChunkDataListIterator