HeapSource.h revision ef75d4667167f0a82a9d2ee3fe9afeecbc679b82
12ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 22ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 32ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * 42ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 52ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * you may not use this file except in compliance with the License. 62ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * You may obtain a copy of the License at 72ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * 82ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 92ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * 102ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 112ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 122ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * See the License for the specific language governing permissions and 142ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * limitations under the License. 152ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 162ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#ifndef _DALVIK_HEAP_SOURCE 172ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define _DALVIK_HEAP_SOURCE 182ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 19d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro#include "alloc/Heap.h" 202ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#include "alloc/HeapInternal.h" // for GcHeap 212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* dlmalloc uses one size_t per allocated chunk. 232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_CHUNK_OVERHEAD (1 * sizeof (size_t)) 252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_WORST_CHUNK_OVERHEAD (32 * sizeof (size_t)) 262ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* The largest number of separate heaps we can handle. 282ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 29c8e06c8dba30f01d3cf6506c553041c340b312afCarl Shapiro#define HEAP_SOURCE_MAX_HEAP_COUNT 2 302ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Initializes the heap source; must be called before any other 332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * dvmHeapSource*() functions. 342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source ProjectGcHeap *dvmHeapSourceStartup(size_t startSize, size_t absoluteMaxSize); 362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * If the HeapSource was created while in zygote mode, this 39ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * will create a new heap for post-zygote allocations. 40ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Having a separate heap should maximize the number of pages 41ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * that a given app_process shares with the zygote process. 42ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */ 43ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirobool dvmHeapSourceStartupAfterZygote(void); 44ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro 45ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/* 46ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * If the HeapSource was created while in zygote mode, this 472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * will create an additional zygote heap before the first fork(). 482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Having a separate heap should reduce the number of shared 492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * pages subsequently touched by the zygote process. 502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceStartupBeforeFork(void); 522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 54ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Shutdown any threads internal to the heap source. This should be 55ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * called before the heap source itself is shutdown. 56ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */ 57ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirovoid dvmHeapSourceThreadShutdown(void); 58ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro 59ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/* 602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Tears down the heap source and frees any resources associated with it. 612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 62a199eb70871a8c142a723d76b1b08939286a3199Carl Shapirovoid dvmHeapSourceShutdown(GcHeap **gcHeap); 632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 64ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro/* 65ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * Returns the base and inclusive max addresses of the heap source 66ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * heaps. The base and max values are suitable for passing directly 67ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * to the bitmap sweeping routine. 68ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro */ 69ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapirovoid dvmHeapSourceGetRegions(uintptr_t *base, uintptr_t *max, size_t numHeaps); 702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 72962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes * Get the bitmap representing all live objects. 73962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes */ 74ec805eaed940e40212e85b58b163c7649feaca56Carl ShapiroHeapBitmap *dvmHeapSourceGetLiveBits(void); 75962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes 76962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes/* 77212607156602876fe3af6aebce8798628d4a8410Carl Shapiro * Get the bitmap representing all marked objects. 78212607156602876fe3af6aebce8798628d4a8410Carl Shapiro */ 79212607156602876fe3af6aebce8798628d4a8410Carl ShapiroHeapBitmap *dvmHeapSourceGetMarkBits(void); 80212607156602876fe3af6aebce8798628d4a8410Carl Shapiro 81212607156602876fe3af6aebce8798628d4a8410Carl Shapiro/* 82b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes * Gets the begining of the allocation for the HeapSource. 83b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes */ 84b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayesvoid *dvmHeapSourceGetBase(void); 85b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes 86b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes/* 872ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the requested value. If the per-heap stats are requested, fill 882ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * them as well. 892ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 902ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourceValueSpec { 912ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_FOOTPRINT, 922ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_ALLOWED_FOOTPRINT, 932ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_BYTES_ALLOCATED, 942ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_OBJECTS_ALLOCATED, 952ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_EXTERNAL_BYTES_ALLOCATED, 962ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_EXTERNAL_LIMIT 972ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project}; 98de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapirosize_t dvmHeapSourceGetValue(enum HeapSourceValueSpec spec, 992ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project size_t perHeapStats[], size_t arrayLen); 1002ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1012ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1022ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data. 1032ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1042ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAlloc(size_t n); 1052ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1062ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1072ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data, growing up to absoluteMaxSize 1082ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * if necessary. 1092ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1102ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAllocAndGrow(size_t n); 1112ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1122ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1138881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * Frees the first numPtrs objects in the ptrs list and returns the 1148881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * amount of reclaimed storage. The list must contain addresses all 1158881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * in the same mspace, and must be in increasing order. This implies 1168881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * that there are no duplicates, and no entries are NULL. 1172ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1188881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapirosize_t dvmHeapSourceFreeList(size_t numPtrs, void **ptrs); 119dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes 120dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes/* 1212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns true iff <ptr> was allocated from the heap source. 1222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceContains(const void *ptr); 1242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 126364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes * Returns true iff <ptr> is within the address space managed by heap source. 127364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes */ 128364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayesbool dvmHeapSourceContainsAddress(const void *ptr); 129364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes 130364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes/* 1312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the value of the requested flag. 1322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourcePtrFlag { 1342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_CONTAINS, // identical to dvmHeapSourceContains() 1352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_ALLOCATED_IN_ZYGOTE 1362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project}; 1372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceGetPtrFlag(const void *ptr, enum HeapSourcePtrFlag flag); 1382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of usable bytes in an allocated chunk; the size 1412ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * may be larger than the size passed to dvmHeapSourceAlloc(). 1422ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1432ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceChunkSize(const void *ptr); 1442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of bytes that the heap source has allocated 1472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * from the system using sbrk/mmap, etc. 1482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceFootprint(void); 1502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the maximum number of bytes that the heap source is allowed 1532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * to allocate from the system. 1542ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetIdealFootprint(void); 1562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Given the current contents of the heap, increase the allowed 1592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * heap footprint to match the target utilization ratio. This 1602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * should only be called immediately after a full mark/sweep. 1612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1622ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceGrowForUtilization(void); 1632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1652ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Return unused memory to the system if possible. If <bytesTrimmed> 1662ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * is non-NULL, the number of bytes returned to the system is written to it. 1672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceTrim(size_t bytesTrimmed[], size_t arrayLen); 1692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Walks over the heap source and passes every allocated and 1722ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * free chunk to the callback. 1732ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1742ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceWalk(void(*callback)(const void *chunkptr, size_t chunklen, 1752ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project const void *userptr, size_t userlen, 1762ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project void *arg), 1772ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project void *arg); 1782ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1792ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the number of heaps available in the heap source. 1802ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1812ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetNumHeaps(void); 1822ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 183f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro/* 18481010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes * Exchanges the mark and object bitmaps. 185f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro */ 186f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapirovoid dvmHeapSourceSwapBitmaps(void); 187f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro 188d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/* 18981010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes * Zeroes the mark bitmap. 19081010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes */ 19181010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayesvoid dvmHeapSourceZeroMarkBitmap(void); 19281010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes 19381010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes/* 194425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * Marks all objects inside the immune region of the heap. Addresses 195425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * at or above this pointer are threatened, addresses below this 196425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * pointer are immune. 197d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */ 198425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayesvoid dvmMarkImmuneObjects(const char *immuneLimit); 199d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro 200d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/* 201d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * Returns a pointer that demarcates the threatened region of the 202d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * heap. Addresses at or above this pointer are threatened, addresses 203425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * below this pointer are immune. 204d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */ 205d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapirovoid *dvmHeapSourceGetImmuneLimit(GcMode mode); 206d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro 2072ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#endif // _DALVIK_HEAP_SOURCE 208