2 * Copyright 2010 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "GrAllocPool.h"
12 #define GrAllocPool_MIN_BLOCK_SIZE ((size_t)128)
14 struct GrAllocPool::Block {
20 static Block* Create(size_t size, Block* next) {
21 SkASSERT(size >= GrAllocPool_MIN_BLOCK_SIZE);
23 Block* block = (Block*)sk_malloc_throw(sizeof(Block) + size);
25 block->fPtr = (char*)block + sizeof(Block);
26 block->fBytesFree = size;
27 block->fBytesTotal = size;
31 bool canAlloc(size_t bytes) const {
32 return bytes <= fBytesFree;
35 void* alloc(size_t bytes) {
36 SkASSERT(bytes <= fBytesFree);
43 size_t release(size_t bytes) {
45 size_t free = SkTMin(bytes, fBytesTotal - fBytesFree);
51 bool empty() const { return fBytesTotal == fBytesFree; }
54 ///////////////////////////////////////////////////////////////////////////////
56 GrAllocPool::GrAllocPool(size_t blockSize) {
58 fMinBlockSize = SkTMax(blockSize, GrAllocPool_MIN_BLOCK_SIZE);
59 SkDEBUGCODE(fBlocksAllocated = 0;)
62 GrAllocPool::~GrAllocPool() {
66 void GrAllocPool::reset() {
69 Block* block = fBlock;
71 Block* next = block->fNext;
76 SkDEBUGCODE(fBlocksAllocated = 0;)
79 void* GrAllocPool::alloc(size_t size) {
82 if (!fBlock || !fBlock->canAlloc(size)) {
83 size_t blockSize = SkTMax(fMinBlockSize, size);
84 fBlock = Block::Create(blockSize, fBlock);
85 SkDEBUGCODE(fBlocksAllocated += 1;)
87 return fBlock->alloc(size);
90 void GrAllocPool::release(size_t bytes) {
93 while (bytes && fBlock) {
94 bytes = fBlock->release(bytes);
95 if (fBlock->empty()) {
96 Block* next = fBlock->fNext;
99 SkDEBUGCODE(fBlocksAllocated -= 1;)
106 void GrAllocPool::validate() const {
107 Block* block = fBlock;
111 block = block->fNext;
113 SkASSERT(fBlocksAllocated == count);