11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkChunkAlloc_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkChunkAlloc_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkChunkAlloc : SkNoncopyable { 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkChunkAlloc(size_t minSize); 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ~SkChunkAlloc(); 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Free up all allocated blocks. This invalidates all returned 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project pointers. 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void reset(); 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Reuse all allocated blocks. This invalidates all returned 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project pointers (like reset) but doesn't necessarily free up all 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project of the privately allocated blocks. This is more efficient 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if you plan to reuse the allocator multiple times. 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void reuse(); 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum AllocFailType { 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kReturnNil_AllocFailType, 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kThrow_AllocFailType 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* alloc(size_t bytes, AllocFailType); 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* allocThrow(size_t bytes) { 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->alloc(bytes, kThrow_AllocFailType); 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 425f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed /** Call this to unalloc the most-recently allocated ptr by alloc(). On 435f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed success, the number of bytes freed is returned, or 0 if the block could 445f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed not be unallocated. This is a hint to the underlying allocator that 455f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed the previous allocation may be reused, but the implementation is free 465f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed to ignore this call (and return 0). 475f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed */ 485f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed size_t unalloc(void* ptr); 495f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t totalCapacity() const { return fTotalCapacity; } 5140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Returns true if the specified address is within one of the chunks, and 5440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * has at least 1-byte following the address (i.e. if addr points to the 5540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * end of a chunk, then contains() will return false). 5640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 5740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger bool contains(const void* addr) const; 5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct Block; 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* fBlock; 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t fMinSize; 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* fPool; 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t fTotalCapacity; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* newBlock(size_t bytes, AllocFailType ftype); 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 70