/* * 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