1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Garbage-collecting allocator. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_ALLOC_ALLOC_H_ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_ALLOC_ALLOC_H_ 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22ad9400f8c292055307319e7324da2e0a23e5a5adCarl Shapiro#include <stddef.h> 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 245cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro/* flags for dvmMalloc */ 255cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiroenum { 265cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro ALLOC_DEFAULT = 0x00, 275cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro ALLOC_DONT_TRACK = 0x01, /* don't add to internal tracking list */ 2852e2626eb3bf620c53459a90d912733de2ce0369Carl Shapiro ALLOC_NON_MOVING = 0x02, 295cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro}; 305cdd4a3f91d3fc25c8eeca8f58e35bb6c4e908caCarl Shapiro 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialization. 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmGcStartup(void); 357fc3ce8f0223a90006ad2c431a43b0bc841ee3c2Andy McFaddenbool dvmCreateStockExceptions(void); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmGcStartupAfterZygote(void); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmGcShutdown(void); 38ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirovoid dvmGcThreadShutdown(void); 39ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapirobool dvmGcStartupClasses(void); 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do any last-minute preparation before we call fork() for the first time. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmGcPreZygoteFork(void); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Basic allocation function. 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The new object will be added to the "tracked alloc" table unless 50d4f78d3a764e6aa8f7174c78f537c016dac7f7ecBarry Hayes * flags is ALLOC_DONT_TRACK. 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL and throws an exception on failure. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmMalloc(size_t size, int flags); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate a new object. 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The new object will be added to the "tracked alloc" table unless 60d4f78d3a764e6aa8f7174c78f537c016dac7f7ecBarry Hayes * flags is ALLOC_DONT_TRACK. 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL and throws an exception on failure. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6450e5fd5984c9b0a6f0927ed5ddf13bde40e338c7Carl Shapiroextern "C" Object* dvmAllocObject(ClassObject* clazz, int flags); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Track an object reference that is currently only visible internally. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is called automatically by dvmMalloc() unless ALLOC_DONT_TRACK 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is set. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "self" argument is allowed as an optimization; it may be NULL. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7350e5fd5984c9b0a6f0927ed5ddf13bde40e338c7Carl Shapiroextern "C" void dvmAddTrackedAlloc(Object* obj, Thread* self); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Remove an object from the internal tracking list. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Does nothing if "obj" is NULL. 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "self" argument is allowed as an optimization; it may be NULL. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8250e5fd5984c9b0a6f0927ed5ddf13bde40e338c7Carl Shapiroextern "C" void dvmReleaseTrackedAlloc(Object* obj, Thread* self); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 85d537d4840fcdf0e279b6a7c91a27306e0544aeaaCarl Shapiro * Returns true iff <obj> points to a zygote allocated object. 86d537d4840fcdf0e279b6a7c91a27306e0544aeaaCarl Shapiro */ 87d537d4840fcdf0e279b6a7c91a27306e0544aeaaCarl Shapirobool dvmIsZygoteObject(const Object* obj); 88d537d4840fcdf0e279b6a7c91a27306e0544aeaaCarl Shapiro 89d537d4840fcdf0e279b6a7c91a27306e0544aeaaCarl Shapiro/* 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a copy of an object. 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 920f27ad70ce7a8e739cdf5870346af837e2b9b6c0Andy McFadden * Returns NULL and throws an exception on failure. 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 940f27ad70ce7a8e739cdf5870346af837e2b9b6c0Andy McFaddenObject* dvmCloneObject(Object* obj, int flags); 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 976af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden * Make the object finalizable. 986af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden */ 9950e5fd5984c9b0a6f0927ed5ddf13bde40e338c7Carl Shapiroextern "C" void dvmSetFinalizable(Object* obj); 1006af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden 1016af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden/* 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine the exact number of GC heap bytes used by an object. (Internal 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to heap code except for debugging.) 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsize_t dvmObjectSizeInHeap(const Object* obj); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the current ideal heap utilization, represented as a number 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * between zero and one. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfloat dvmGetTargetHeapUtilization(void); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the new ideal heap utilization, represented as a number 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * between zero and one. 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSetTargetHeapUtilization(float newTarget); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1200445e48ba57d0628d5c315a9a07f020879ab0ad9Carl Shapiro * Initiate garbage collection. 1210445e48ba57d0628d5c315a9a07f020879ab0ad9Carl Shapiro * 122a371fad368c4d697b2906079bfbe8059269ed362Carl Shapiro * This usually happens automatically, but can also be caused by 123bc3ba010007b0ed4dddf6d286d59ee41f5f361dbCarl Shapiro * Runtime.gc(). 1240445e48ba57d0628d5c315a9a07f020879ab0ad9Carl Shapiro */ 125bc3ba010007b0ed4dddf6d286d59ee41f5f361dbCarl Shapirovoid dvmCollectGarbage(void); 1260445e48ba57d0628d5c315a9a07f020879ab0ad9Carl Shapiro 1270445e48ba57d0628d5c315a9a07f020879ab0ad9Carl Shapiro/* 128f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapiro * Returns a count of the direct instances of a class. 12941eb6e988193a1c6b331c7c208bf8dd74f96d773Carl Shapiro */ 13041eb6e988193a1c6b331c7c208bf8dd74f96d773Carl Shapirosize_t dvmCountInstancesOfClass(const ClassObject *clazz); 13141eb6e988193a1c6b331c7c208bf8dd74f96d773Carl Shapiro 132f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapiro/* 133f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapiro * Returns a count of the instances of a class and its subclasses. 134f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapiro */ 135f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapirosize_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz); 136f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6cCarl Shapiro 137df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro/* 138df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro * Removes any growth limits from the heap. 139df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro */ 140df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapirovoid dvmClearGrowthLimit(void); 141df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro 1422494c5038e668add68c74dea83aca05187a89e7cCarl Shapiro/* 14321fefbaa3874c42f8a017c4794add2d7c337643aElliott Hughes * Returns true if the address is aligned appropriately for a heap object. 14421fefbaa3874c42f8a017c4794add2d7c337643aElliott Hughes * Does not require the caller to hold the heap lock, and does not take the 14521fefbaa3874c42f8a017c4794add2d7c337643aElliott Hughes * heap lock internally. 1462494c5038e668add68c74dea83aca05187a89e7cCarl Shapiro */ 1472494c5038e668add68c74dea83aca05187a89e7cCarl Shapirobool dvmIsHeapAddress(void *address); 1482494c5038e668add68c74dea83aca05187a89e7cCarl Shapiro 149dc9e44cc0af797679822484d88ef76bff15ffc98Carl Shapirobool dvmIsNonMovingObject(const Object* object); 150dc9e44cc0af797679822484d88ef76bff15ffc98Carl Shapiro 151375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_ALLOC_ALLOC_H_ 152