15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 2f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/* 35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2006 The Android Open Source Project 4f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com * 55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be 65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file. 7f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com */ 8f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 95bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 10f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#ifndef SkChunkAlloc_DEFINED 11f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#define SkChunkAlloc_DEFINED 12f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 13f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkTypes.h" 14f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 15f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comclass SkChunkAlloc : SkNoncopyable { 16f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic: 17f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkChunkAlloc(size_t minSize); 18f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com ~SkChunkAlloc(); 19f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 20d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com /** 21d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com * Free up all allocated blocks. This invalidates all returned 22d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com * pointers. 23d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com */ 24f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com void reset(); 25f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 26f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com enum AllocFailType { 27f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com kReturnNil_AllocFailType, 28f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com kThrow_AllocFailType 29f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com }; 301fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com 31f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com void* alloc(size_t bytes, AllocFailType); 32f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com void* allocThrow(size_t bytes) { 33f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com return this->alloc(bytes, kThrow_AllocFailType); 34f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com } 351fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com 367ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com /** Call this to unalloc the most-recently allocated ptr by alloc(). On 377ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com success, the number of bytes freed is returned, or 0 if the block could 387ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com not be unallocated. This is a hint to the underlying allocator that 397ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com the previous allocation may be reused, but the implementation is free 407ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com to ignore this call (and return 0). 417ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com */ 427ed8f016388de07fe4fdd936de5d89a9b823deebreed@android.com size_t unalloc(void* ptr); 431fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com 44f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com size_t totalCapacity() const { return fTotalCapacity; } 4592b63cea95717f4bf08aff8ef4255722d7e7accereed@google.com size_t totalUsed() const { return fTotalUsed; } 46d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com int blockCount() const { return fBlockCount; } 47982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com 48982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com /** 49982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com * Returns true if the specified address is within one of the chunks, and 50982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com * has at least 1-byte following the address (i.e. if addr points to the 51982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com * end of a chunk, then contains() will return false). 52982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com */ 53982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com bool contains(const void* addr) const; 54982b0d497ffd4f50916124e5f2dd95623883e670reed@android.com 55f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate: 56f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com struct Block; 57d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com 58f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com Block* fBlock; 59f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com size_t fMinSize; 60d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com size_t fChunkSize; 61f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com size_t fTotalCapacity; 6292b63cea95717f4bf08aff8ef4255722d7e7accereed@google.com size_t fTotalUsed; // will be <= fTotalCapacity 63d2b3cfe3d1e8e520e269d10276383085b9d22a01reed@google.com int fBlockCount; 64f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 65f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com Block* newBlock(size_t bytes, AllocFailType ftype); 66f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com}; 67f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 68f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#endif 69