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 * Types and macros used internally by the heap. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_ALLOC_HEAP_INTERNAL_H_ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_ALLOC_HEAP_INTERNAL_H_ 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "MarkSweep.h" 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2450e5fd5984c9b0a6f0927ed5ddf13bde40e338c7Carl Shapirostruct HeapSource; 2518555fcb8927533485eb9ee739230839ac038b20Carl Shapiro 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct GcHeap { 27a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro HeapSource *heapSource; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Linked lists of subclass instances of java/lang/ref/Reference 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that we find while recursing. The "next" pointers are hidden 31a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro * in the Reference objects' pendingNext fields. These lists are 32a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro * cleared and rebuilt each time the GC runs. 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 343475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro Object *softReferences; 353475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro Object *weakReferences; 363475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro Object *finalizerReferences; 373475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro Object *phantomReferences; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro /* The list of Reference objects that need to be enqueued. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 41ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro Object *clearedReferences; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* The current state of the mark step. 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Only valid during a GC. 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 46a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro GcMarkContext markContext; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 486e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes /* GC's card table */ 49a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro u1* cardTableBase; 50a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro size_t cardTableLength; 51af6cf54652d1b27885b99e216bee29b955052630Andy McFadden size_t cardTableMaxLength; 52eebf7c690a6aabd50d70779d72685090a1eb84ffCarl Shapiro size_t cardTableOffset; 536e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Is the GC running? Used to avoid recursive calls to GC. 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 56a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro bool gcRunning; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Debug control values 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 61a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro int ddmHpifWhen; 62a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro int ddmHpsgWhen; 63a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro int ddmHpsgWhat; 64a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro int ddmNhsgWhen; 65a97851ecdf95dd1a401ddb7469ec78666d2d28f0Carl Shapiro int ddmNhsgWhat; 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmLockHeap(void); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUnlockHeap(void); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Logging helpers 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define HEAP_LOG_TAG LOG_TAG "-heap" 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if LOG_NDEBUG 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGV_HEAP(...) ((void)0) 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGD_HEAP(...) ((void)0) 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 811663a6c12fdf4732d7ea0a0406af6085b3c408e4Steve Block#define LOGV_HEAP(...) ALOG(LOG_VERBOSE, HEAP_LOG_TAG, __VA_ARGS__) 821663a6c12fdf4732d7ea0a0406af6085b3c408e4Steve Block#define LOGD_HEAP(...) ALOG(LOG_DEBUG, HEAP_LOG_TAG, __VA_ARGS__) 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 84a5e14d6a98c48d8eeb24f4977ff33d831e37b2d3Carl Shapiro#define LOGI_HEAP(...) \ 85ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro do { \ 861663a6c12fdf4732d7ea0a0406af6085b3c408e4Steve Block if (!gDvm.zygote) { ALOG(LOG_INFO, HEAP_LOG_TAG, __VA_ARGS__); } \ 87ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro } while (0) 88ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro 891663a6c12fdf4732d7ea0a0406af6085b3c408e4Steve Block#define LOGW_HEAP(...) ALOG(LOG_WARN, HEAP_LOG_TAG, __VA_ARGS__) 901663a6c12fdf4732d7ea0a0406af6085b3c408e4Steve Block#define LOGE_HEAP(...) ALOG(LOG_ERROR, HEAP_LOG_TAG, __VA_ARGS__) 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FRACTIONAL_MB(n) (n) / (1024 * 1024), \ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((((n) % (1024 * 1024)) / 1024) * 1000) / 1024 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FRACTIONAL_PCT(n,max) ((n) * 100) / (max), \ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (((n) * 1000) / (max)) % 10 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_ALLOC_HEAP_INTERNAL_H_ 98