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