Index: src/gpu/GrMemoryPool.cpp |
diff --git a/src/gpu/GrMemoryPool.cpp b/src/gpu/GrMemoryPool.cpp |
index 5009f20152d5d7813956d4539f7e86c21adc7a48..e59ed83d275866c58d81dafd1d7c12cd5534ab53 100644 |
--- a/src/gpu/GrMemoryPool.cpp |
+++ b/src/gpu/GrMemoryPool.cpp |
@@ -15,11 +15,13 @@ |
GrMemoryPool::GrMemoryPool(size_t preallocSize, size_t minAllocSize) { |
SkDEBUGCODE(fAllocationCnt = 0); |
+ SkDEBUGCODE(fAllocBlockCnt = 0); |
minAllocSize = SkTMax<size_t>(minAllocSize, 1 << 10); |
fMinAllocSize = GrSizeAlignUp(minAllocSize + kPerAllocPad, kAlignment), |
fPreallocSize = GrSizeAlignUp(preallocSize + kPerAllocPad, kAlignment); |
fPreallocSize = SkTMax(fPreallocSize, fMinAllocSize); |
+ fSize = fPreallocSize; |
fHead = CreateBlock(fPreallocSize); |
fTail = fHead; |
@@ -50,6 +52,8 @@ void* GrMemoryPool::allocate(size_t size) { |
SkASSERT(NULL == fTail->fNext); |
fTail->fNext = block; |
fTail = block; |
+ fSize += block->fSize; |
+ SkDEBUGCODE(++fAllocBlockCnt); |
} |
SkASSERT(fTail->fFreeSize >= size); |
intptr_t ptr = fTail->fCurrPtr; |
@@ -61,6 +65,7 @@ void* GrMemoryPool::allocate(size_t size) { |
fTail->fCurrPtr += size; |
fTail->fFreeSize -= size; |
fTail->fLiveCount += 1; |
+ |
SkDEBUGCODE(++fAllocationCnt); |
VALIDATE; |
return reinterpret_cast<void*>(ptr); |
@@ -73,8 +78,7 @@ void GrMemoryPool::release(void* p) { |
if (1 == block->fLiveCount) { |
// the head block is special, it is reset rather than deleted |
if (fHead == block) { |
- fHead->fCurrPtr = reinterpret_cast<intptr_t>(fHead) + |
- kHeaderSize; |
+ fHead->fCurrPtr = reinterpret_cast<intptr_t>(fHead) + kHeaderSize; |
fHead->fLiveCount = 0; |
fHead->fFreeSize = fPreallocSize; |
} else { |
@@ -88,7 +92,9 @@ void GrMemoryPool::release(void* p) { |
SkASSERT(fTail == block); |
fTail = prev; |
} |
+ fSize -= block->fSize; |
DeleteBlock(block); |
+ SkDEBUGCODE(fAllocBlockCnt--); |
} |
} else { |
--block->fLiveCount; |
@@ -103,14 +109,16 @@ void GrMemoryPool::release(void* p) { |
} |
GrMemoryPool::BlockHeader* GrMemoryPool::CreateBlock(size_t size) { |
+ size_t paddedSize = size + kHeaderSize; |
BlockHeader* block = |
- reinterpret_cast<BlockHeader*>(sk_malloc_throw(size + kHeaderSize)); |
+ reinterpret_cast<BlockHeader*>(sk_malloc_throw(paddedSize)); |
// we assume malloc gives us aligned memory |
SkASSERT(!(reinterpret_cast<intptr_t>(block) % kAlignment)); |
block->fLiveCount = 0; |
block->fFreeSize = size; |
block->fCurrPtr = reinterpret_cast<intptr_t>(block) + kHeaderSize; |
block->fPrevPtr = 0; // gcc warns on assigning NULL to an intptr_t. |
+ block->fSize = paddedSize; |
return block; |
} |
@@ -157,5 +165,6 @@ void GrMemoryPool::validate() { |
} while ((block = block->fNext)); |
SkASSERT(allocCount == fAllocationCnt); |
SkASSERT(prev == fTail); |
+ SkASSERT(fAllocBlockCnt != 0 || fSize == fPreallocSize); |
#endif |
} |