/*
* 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 collector
*/
#ifndef _DALVIK_ALLOC_GC
#define _DALVIK_ALLOC_GC
/*
* Initiate garbage collection.
*
* This usually happens automatically, but can also be caused by Runtime.gc().
*/
void dvmCollectGarbage(bool collectSoftRefs);
/****
**** NOTE: The functions after this point will (should) only be called
**** during GC.
****/
/*
* Functions that mark an object.
*
* Currently implemented in Heap.c.
*/
/*
* Mark an object and schedule it to be scanned for
* references to other objects.
*
* @param obj must be a valid object
*/
void dvmMarkObjectNonNull(const Object *obj);
/*
* Mark an object and schedule it to be scanned for
* references to other objects.
*
* @param obj must be a valid object or NULL
*/
#define dvmMarkObject(obj) \
do { \
Object *DMO_obj_ = (Object *)(obj); \
if (DMO_obj_ != NULL) { \
dvmMarkObjectNonNull(DMO_obj_); \
} \
} while (false)
/*
* If obj points to a valid object, mark it and
* schedule it to be scanned for references to other
* objects.
*
* @param obj any pointer that may be an Object, or NULL
TODO: check for alignment, too (would require knowledge of heap chunks)
*/
#define dvmMarkIfObject(obj) \
do { \
Object *DMIO_obj_ = (Object *)(obj); \
if (DMIO_obj_ != NULL && dvmIsValidObject(DMIO_obj_)) { \
dvmMarkObjectNonNull(DMIO_obj_); \
} \
} while (false)
/*
* Functions that handle scanning various objects for references.
*/
/*
* Mark all class objects loaded by the root class loader;
* most of these are the java.* classes.
*
* Currently implemented in Class.c.
*/
void dvmGcScanRootClassLoader(void);
/*
* Mark all root ThreadGroup objects, guaranteeing that
* all live Thread objects will eventually be scanned.
*
* NOTE: this is a misnomer, because the current implementation
* actually only scans the internal list of VM threads, which
* will mark all VM-reachable Thread objects. Someone else
* must scan the root class loader, which will mark java/lang/ThreadGroup.
* The ThreadGroup class object has static members pointing to
* the root ThreadGroups, and these will be marked as a side-effect
* of marking the class object.
*
* Currently implemented in Thread.c.
*/
void dvmGcScanRootThreadGroups(void);
/*
* Mark all interned string objects.
*
* Currently implemented in Intern.c.
*/
void dvmGcScanInternedStrings(void);
/*
* Remove any unmarked interned string objects from the table.
*
* Currently implemented in Intern.c.
*/
void dvmGcDetachDeadInternedStrings(int (*isUnmarkedObject)(void *));
/*
* Mark all primitive class objects.
*
* Currently implemented in Array.c.
*/
void dvmGcScanPrimitiveClasses(void);
/*
* Mark all JNI global references.
*
* Currently implemented in JNI.c.
*/
void dvmGcMarkJniGlobalRefs(void);
/*
* Mark all debugger references.
*
* Currently implemented in Debugger.c.
*/
void dvmGcMarkDebuggerRefs(void);
/*
* Optional heap profiling.
*/
#if WITH_HPROF && !defined(_DALVIK_HPROF_HPROF)
#include "hprof/Hprof.h"
#define HPROF_SET_GC_SCAN_STATE(tag_, thread_) \
dvmHeapSetHprofGcScanState((tag_), (thread_))
#define HPROF_CLEAR_GC_SCAN_STATE() \
dvmHeapSetHprofGcScanState(0, 0)
#else
#define HPROF_SET_GC_SCAN_STATE(tag_, thread_) do {} while (false)
#define HPROF_CLEAR_GC_SCAN_STATE() do {} while (false)
#endif
#endif // _DALVIK_ALLOC_GC