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