19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_MEMORY_DEALER_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_MEMORY_DEALER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IMemory.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
260795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryHeapBase.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass String8;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface for implementing a "heap". A heap basically provides
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the IMemoryHeap interface for cross-process sharing and the
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ability to map/unmap pages within the heap.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass HeapInterface : public virtual BnMemoryHeap
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // all values must be page-aligned
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory> mapMemory(size_t offset, size_t size) = 0;
42aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian
43aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    HeapInterface();
44aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopianprotected:
45aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    virtual ~HeapInterface();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface for implementing an allocator. An allocator provides
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods for allocating and freeing memory blocks and dumping
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its state.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AllocatorInterface : public RefBase
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PAGE_ALIGNED = 0x00000001
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual size_t      allocate(size_t size, uint32_t flags = 0) = 0;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    deallocate(size_t offset) = 0;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual size_t      size() const = 0;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        dump(const char* what, uint32_t flags = 0) const = 0;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        dump(String8& res,
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char* what, uint32_t flags = 0) const = 0;
68aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian
69aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    AllocatorInterface();
70aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopianprotected:
71aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    virtual ~AllocatorInterface();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * concrete implementation of HeapInterface on top of mmap()
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SharedHeap : public HeapInterface, public MemoryHeapBase
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
82aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian                        SharedHeap();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SharedHeap(size_t size, uint32_t flags = 0, char const * name = NULL);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual             ~SharedHeap();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory> mapMemory(size_t offset, size_t size);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A simple templatized doubly linked-list implementation
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <typename NODE>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass LinkedList
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE*  mFirst;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE*  mLast;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LinkedList() : mFirst(0), mLast(0) { }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool        isEmpty() const { return mFirst == 0; }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE const* head() const { return mFirst; }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE*       head() { return mFirst; }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE const* tail() const { return mLast; }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE*       tail() { return mLast; }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void insertAfter(NODE* node, NODE* newNode) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        newNode->prev = node;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        newNode->next = node->next;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (node->next == 0) mLast = newNode;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else                 node->next->prev = newNode;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        node->next = newNode;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void insertBefore(NODE* node, NODE* newNode) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         newNode->prev = node->prev;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         newNode->next = node;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         if (node->prev == 0)   mFirst = newNode;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         else                   node->prev->next = newNode;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         node->prev = newNode;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void insertHead(NODE* newNode) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst == 0) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirst = mLast = newNode;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            newNode->prev = newNode->next = 0;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1296ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            newNode->prev = 0;
1306ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            newNode->next = mFirst;
1316ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            mFirst->prev = newNode;
1326ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            mFirst = newNode;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void insertTail(NODE* newNode) {
1376ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian        if (mLast == 0) {
1386ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            insertHead(newNode);
1396ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian        } else {
1406ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            newNode->prev = mLast;
1416ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            newNode->next = 0;
1426ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            mLast->next = newNode;
1436ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian            mLast = newNode;
1446ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian        }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NODE* remove(NODE* node) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (node->prev == 0)    mFirst = node->next;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else                    node->prev->next = node->next;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (node->next == 0)    mLast = node->prev;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else                    node->next->prev = node->prev;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return node;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * concrete implementation of AllocatorInterface using a simple
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * best-fit allocation scheme
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SimpleBestFitAllocator : public AllocatorInterface
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SimpleBestFitAllocator(size_t size);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual             ~SimpleBestFitAllocator();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual size_t      allocate(size_t size, uint32_t flags = 0);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    deallocate(size_t offset);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual size_t      size() const;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        dump(const char* what, uint32_t flags = 0) const;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        dump(String8& res,
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char* what, uint32_t flags = 0) const;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct chunk_t {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        chunk_t(size_t start, size_t size)
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : start(start), size(size), free(1), prev(0), next(0) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t              start;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t              size : 28;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                 free : 4;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable chunk_t*    prev;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable chunk_t*    next;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t  alloc(size_t size, uint32_t flags);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    chunk_t* dealloc(size_t start);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void     dump_l(const char* what, uint32_t flags = 0) const;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void     dump_l(String8& res, const char* what, uint32_t flags = 0) const;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const int    kMemoryAlign;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable Mutex       mLock;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LinkedList<chunk_t> mList;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t              mHeapSize;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MemoryDealer : public RefBase
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        READ_ONLY = MemoryHeapBase::READ_ONLY,
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PAGE_ALIGNED = AllocatorInterface::PAGE_ALIGNED
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // creates a memory dealer with the SharedHeap and SimpleBestFitAllocator
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MemoryDealer(size_t size, uint32_t flags = 0, const char* name = 0);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // provide a custom heap but use the SimpleBestFitAllocator
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MemoryDealer(const sp<HeapInterface>& heap);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // provide both custom heap and allocotar
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MemoryDealer(
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<HeapInterface>& heap,
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<AllocatorInterface>& allocator);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory> allocate(size_t size, uint32_t flags = 0);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        deallocate(size_t offset);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        dump(const char* what, uint32_t flags = 0) const;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IMemoryHeap> getMemoryHeap() const { return heap(); }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AllocatorInterface> getAllocator() const { return allocator(); }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229262a583f2da846e8c74d82712957bcdcc88d169aAndreas Huberprotected:
230262a583f2da846e8c74d82712957bcdcc88d169aAndreas Huber    virtual ~MemoryDealer();
231262a583f2da846e8c74d82712957bcdcc88d169aAndreas Huber
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const sp<HeapInterface>&        heap() const;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const sp<AllocatorInterface>&   allocator() const;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Allocation : public BnMemory {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Allocation(const sp<MemoryDealer>& dealer,
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ssize_t offset, size_t size, const sp<IMemory>& memory);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Allocation();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemoryHeap> getMemory(ssize_t* offset, size_t* size) const;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryDealer>        mDealer;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t                 mOffset;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t                  mSize;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<IMemory>             mMemory;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<HeapInterface>           mHeap;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AllocatorInterface>      mAllocator;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_MEMORY_DEALER_H
258