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