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