/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Garbage-collecting allocator.
*/
#ifndef DALVIK_ALLOC_ALLOC_H_
#define DALVIK_ALLOC_ALLOC_H_
#include <stddef.h>
/* flags for dvmMalloc */
enum {
ALLOC_DEFAULT = 0x00,
ALLOC_DONT_TRACK = 0x01, /* don't add to internal tracking list */
ALLOC_NON_MOVING = 0x02,
};
/*
* Initialization.
*/
bool dvmGcStartup(void);
bool dvmCreateStockExceptions(void);
bool dvmGcStartupAfterZygote(void);
void dvmGcShutdown(void);
void dvmGcThreadShutdown(void);
bool dvmGcStartupClasses(void);
/*
* Do any last-minute preparation before we call fork() for the first time.
*/
bool dvmGcPreZygoteFork(void);
/*
* Basic allocation function.
*
* The new object will be added to the "tracked alloc" table unless
* flags is ALLOC_DONT_TRACK.
*
* Returns NULL and throws an exception on failure.
*/
void* dvmMalloc(size_t size, int flags);
/*
* Allocate a new object.
*
* The new object will be added to the "tracked alloc" table unless
* flags is ALLOC_DONT_TRACK.
*
* Returns NULL and throws an exception on failure.
*/
extern "C" Object* dvmAllocObject(ClassObject* clazz, int flags);
/*
* Track an object reference that is currently only visible internally.
* This is called automatically by dvmMalloc() unless ALLOC_DONT_TRACK
* is set.
*
* The "self" argument is allowed as an optimization; it may be NULL.
*/
extern "C" void dvmAddTrackedAlloc(Object* obj, Thread* self);
/*
* Remove an object from the internal tracking list.
*
* Does nothing if "obj" is NULL.
*
* The "self" argument is allowed as an optimization; it may be NULL.
*/
extern "C" void dvmReleaseTrackedAlloc(Object* obj, Thread* self);
/*
* Returns true iff <obj> points to a zygote allocated object.
*/
bool dvmIsZygoteObject(const Object* obj);
/*
* Create a copy of an object.
*
* Returns NULL and throws an exception on failure.
*/
Object* dvmCloneObject(Object* obj, int flags);
/*
* Make the object finalizable.
*/
extern "C" void dvmSetFinalizable(Object* obj);
/*
* Determine the exact number of GC heap bytes used by an object. (Internal
* to heap code except for debugging.)
*/
size_t dvmObjectSizeInHeap(const Object* obj);
/*
* Gets the current ideal heap utilization, represented as a number
* between zero and one.
*/
float dvmGetTargetHeapUtilization(void);
/*
* Sets the new ideal heap utilization, represented as a number
* between zero and one.
*/
void dvmSetTargetHeapUtilization(float newTarget);
/*
* Initiate garbage collection.
*
* This usually happens automatically, but can also be caused by
* Runtime.gc().
*/
void dvmCollectGarbage(void);
/*
* Returns a count of the direct instances of a class.
*/
size_t dvmCountInstancesOfClass(const ClassObject *clazz);
/*
* Returns a count of the instances of a class and its subclasses.
*/
size_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz);
/*
* Removes any growth limits from the heap.
*/
void dvmClearGrowthLimit(void);
/*
* Returns true if the address is aligned appropriately for a heap object.
* Does not require the caller to hold the heap lock, and does not take the
* heap lock internally.
*/
bool dvmIsHeapAddress(void *address);
bool dvmIsNonMovingObject(const Object* object);
#endif // DALVIK_ALLOC_ALLOC_H_