Index: skia/corecg/SkChunkAlloc.cpp |
=================================================================== |
--- skia/corecg/SkChunkAlloc.cpp (revision 16859) |
+++ skia/corecg/SkChunkAlloc.cpp (working copy) |
@@ -1,120 +0,0 @@ |
-/* libs/corecg/SkChunkAlloc.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkChunkAlloc.h" |
- |
-struct SkChunkAlloc::Block { |
- Block* fNext; |
- size_t fFreeSize; |
- char* fFreePtr; |
- // data[] follows |
- |
- void freeChain() { // this can be null |
- Block* block = this; |
- while (block) { |
- Block* next = block->fNext; |
- sk_free(block); |
- block = next; |
- } |
- }; |
- |
- Block* tail() { |
- Block* block = this; |
- if (block) { |
- for (;;) { |
- Block* next = block->fNext; |
- if (NULL == next) { |
- break; |
- } |
- block = next; |
- } |
- } |
- return block; |
- } |
-}; |
- |
-SkChunkAlloc::SkChunkAlloc(size_t minSize) |
- : fBlock(NULL), fMinSize(SkAlign4(minSize)), fPool(NULL), fTotalCapacity(0) |
-{ |
-} |
- |
-SkChunkAlloc::~SkChunkAlloc() { |
- this->reset(); |
-} |
- |
-void SkChunkAlloc::reset() { |
- fBlock->freeChain(); |
- fBlock = NULL; |
- fPool->freeChain(); |
- fPool = NULL; |
- fTotalCapacity = 0; |
-} |
- |
-void SkChunkAlloc::reuse() { |
- if (fPool && fBlock) { |
- fPool->tail()->fNext = fBlock; |
- } |
- fPool = fBlock; |
- fBlock = NULL; |
- fTotalCapacity = 0; |
-} |
- |
-SkChunkAlloc::Block* SkChunkAlloc::newBlock(size_t bytes, AllocFailType ftype) { |
- Block* block = fPool; |
- |
- if (block && bytes <= block->fFreeSize) { |
- fPool = block->fNext; |
- return block; |
- } |
- |
- size_t size = SkMax32((int32_t)bytes, (int32_t)fMinSize); |
- |
- block = (Block*)sk_malloc_flags(sizeof(Block) + size, |
- ftype == kThrow_AllocFailType ? SK_MALLOC_THROW : 0); |
- |
- if (block) { |
- // block->fNext = fBlock; |
- block->fFreeSize = size; |
- block->fFreePtr = (char*)block + sizeof(Block); |
- |
- fTotalCapacity += size; |
- } |
- return block; |
-} |
- |
-void* SkChunkAlloc::alloc(size_t bytes, AllocFailType ftype) { |
- bytes = SkAlign4(bytes); |
- |
- Block* block = fBlock; |
- |
- if (block == NULL || bytes > block->fFreeSize) { |
- block = this->newBlock(bytes, ftype); |
- if (NULL == block) { |
- return NULL; |
- } |
- block->fNext = fBlock; |
- fBlock = block; |
- } |
- |
- SkASSERT(block && bytes <= block->fFreeSize); |
- void* ptr = block->fFreePtr; |
- |
- block->fFreeSize -= bytes; |
- block->fFreePtr += bytes; |
- return ptr; |
-} |
- |