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 */
16375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_HEAP_SOURCE_H_
17375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_HEAP_SOURCE_H_
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
262ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* The largest number of separate heaps we can handle.
272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
28c8e06c8dba30f01d3cf6506c553041c340b312afCarl Shapiro#define HEAP_SOURCE_MAX_HEAP_COUNT 2
292ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
305cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiroenum HeapSourceValueSpec {
315cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro    HS_FOOTPRINT,
325cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro    HS_ALLOWED_FOOTPRINT,
335cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro    HS_BYTES_ALLOCATED,
345cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro    HS_OBJECTS_ALLOCATED
355cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro};
365cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro
372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Initializes the heap source; must be called before any other
392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * dvmHeapSource*() functions.
402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
41df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl ShapiroGcHeap *dvmHeapSourceStartup(size_t startingSize,
42df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro                             size_t maximumSize,
43df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro                             size_t growthLimit);
442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * If the HeapSource was created while in zygote mode, this
47ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * will create a new heap for post-zygote allocations.
48ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Having a separate heap should maximize the number of pages
49ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * that a given app_process shares with the zygote process.
50ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */
51ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirobool dvmHeapSourceStartupAfterZygote(void);
52ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro
53ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/*
54ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * If the HeapSource was created while in zygote mode, this
552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * will create an additional zygote heap before the first fork().
562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Having a separate heap should reduce the number of shared
572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * pages subsequently touched by the zygote process.
582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceStartupBeforeFork(void);
602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
62ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Shutdown any threads internal to the heap source.  This should be
63ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * called before the heap source itself is shutdown.
64ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */
65ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirovoid dvmHeapSourceThreadShutdown(void);
66ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro
67ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/*
682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Tears down the heap source and frees any resources associated with it.
692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
70a199eb70871a8c142a723d76b1b08939286a3199Carl Shapirovoid dvmHeapSourceShutdown(GcHeap **gcHeap);
712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
72ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro/*
73ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * Returns the base and inclusive max addresses of the heap source
74ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * heaps.  The base and max values are suitable for passing directly
75ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro * to the bitmap sweeping routine.
76ef75d4667167f0a82a9d2ee3fe9afeecbc679b82Carl Shapiro */
77b2714082bad44fde247920b9280c1b40c4979c3aBen Chengvoid dvmHeapSourceGetRegions(uintptr_t *base, uintptr_t *max, size_t numHeaps);
782ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
792ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
80962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes * Get the bitmap representing all live objects.
81962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes */
82ec805eaed940e40212e85b58b163c7649feaca56Carl ShapiroHeapBitmap *dvmHeapSourceGetLiveBits(void);
83962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes
84962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes/*
85212607156602876fe3af6aebce8798628d4a8410Carl Shapiro * Get the bitmap representing all marked objects.
86212607156602876fe3af6aebce8798628d4a8410Carl Shapiro */
87212607156602876fe3af6aebce8798628d4a8410Carl ShapiroHeapBitmap *dvmHeapSourceGetMarkBits(void);
88212607156602876fe3af6aebce8798628d4a8410Carl Shapiro
89212607156602876fe3af6aebce8798628d4a8410Carl Shapiro/*
90b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes * Gets the begining of the allocation for the HeapSource.
91b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes */
92b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayesvoid *dvmHeapSourceGetBase(void);
93b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes
94b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes/*
952f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogers * Returns a high water mark, between base and limit all objects must have been
962f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogers * allocated.
972f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogers */
982f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogersvoid *dvmHeapSourceGetLimit(void);
992f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogers
1002f30ef57ceb02ee5d6719d2158bd9bca4723687dIan Rogers/*
1012ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the requested value. If the per-heap stats are requested, fill
1022ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * them as well.
1032ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1045cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapirosize_t dvmHeapSourceGetValue(HeapSourceValueSpec spec,
1052ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                             size_t perHeapStats[], size_t arrayLen);
1062ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1072ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1082ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data.
1092ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1102ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAlloc(size_t n);
1112ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1122ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1132ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data, growing up to absoluteMaxSize
1142ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * if necessary.
1152ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1162ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAllocAndGrow(size_t n);
1172ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1182ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1198881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * Frees the first numPtrs objects in the ptrs list and returns the
1208881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * amount of reclaimed storage.  The list must contain addresses all
1218881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * in the same mspace, and must be in increasing order. This implies
1228881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapiro * that there are no duplicates, and no entries are NULL.
1232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1248881a8098e259a1faf392d20c1fefc1ee4a63b20Carl Shapirosize_t dvmHeapSourceFreeList(size_t numPtrs, void **ptrs);
125dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes
126dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes/*
1272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns true iff <ptr> was allocated from the heap source.
1282ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1292ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceContains(const void *ptr);
1302ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
132364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes * Returns true iff <ptr> is within the address space managed by heap source.
133364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes */
134364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayesbool dvmHeapSourceContainsAddress(const void *ptr);
135364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes
136364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes/*
1372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of usable bytes in an allocated chunk; the size
1382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * may be larger than the size passed to dvmHeapSourceAlloc().
1392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceChunkSize(const void *ptr);
1412ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1422ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1432ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of bytes that the heap source has allocated
1442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * from the system using sbrk/mmap, etc.
1452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceFootprint(void);
1472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the maximum number of bytes that the heap source is allowed
1502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * to allocate from the system.
1512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetIdealFootprint(void);
1532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1542ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Given the current contents of the heap, increase the allowed
1562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * heap footprint to match the target utilization ratio.  This
1572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * should only be called immediately after a full mark/sweep.
1582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceGrowForUtilization(void);
1602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1622ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Walks over the heap source and passes every allocated and
1632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * free chunk to the callback.
1642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
165808a7c0e7e39b7ca3c7db1366e6e4089166052bbIan Rogersvoid dvmHeapSourceWalk(void(*callback)(void* start, void* end,
166808a7c0e7e39b7ca3c7db1366e6e4089166052bbIan Rogers                                       size_t used_bytes, void* arg),
1672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                       void *arg);
1682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the number of heaps available in the heap source.
1702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetNumHeaps(void);
1722ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
173f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro/*
17481010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes * Exchanges the mark and object bitmaps.
175f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro */
176f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapirovoid dvmHeapSourceSwapBitmaps(void);
177f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro
178d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/*
17981010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes * Zeroes the mark bitmap.
18081010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes */
18181010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayesvoid dvmHeapSourceZeroMarkBitmap(void);
18281010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes
18381010a40820b7c74a09d11d612d12a19e0c0488dBarry Hayes/*
184425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * Marks all objects inside the immune region of the heap. Addresses
185425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * at or above this pointer are threatened, addresses below this
186425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * pointer are immune.
187d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */
188425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayesvoid dvmMarkImmuneObjects(const char *immuneLimit);
189d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro
190d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/*
191d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * Returns a pointer that demarcates the threatened region of the
192d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * heap.  Addresses at or above this pointer are threatened, addresses
193425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * below this pointer are immune.
194d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */
195cc6f5118d19bae06cb80841386a0c95f24616a65Carl Shapirovoid *dvmHeapSourceGetImmuneLimit(bool isPartial);
196d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro
197df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro/*
198df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro * Returns the maximum size of the heap.  This value will be either
199df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro * the value of -Xmx or a user supplied growth limit.
200df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro */
201df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapirosize_t dvmHeapSourceGetMaximumSize(void);
202df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro
2033086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier/*
2043086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier * Called from VMRuntime.registerNativeAllocation.
2053086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier */
2063086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartiervoid dvmHeapSourceRegisterNativeAllocation(int bytes);
2073086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier
2083086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier/*
2093086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier * Called from VMRuntime.registerNativeFree.
2103086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier */
2113086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartiervoid dvmHeapSourceRegisterNativeFree(int bytes);
2123086ab6a9c0859af3a85d5df73d0aecc2c47ca89Mathieu Chartier
213375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_HEAP_SOURCE_H_
214