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