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/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Variables with library scope.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prefer this over scattered static and global variables -- it's easier to
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * view the state in a debugger, it makes clean shutdown simpler, we can
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * trivially dump the state into a crash log, and it dodges most naming
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * collisions that will arise when we are embedded in a larger program.
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If we want multiple VMs per process, this can get stuffed into TLS (or
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * accessed through a Thread field).  May need to pass it around for some
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of the early initialization functions.
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
29375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_GLOBALS_H_
30375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_GLOBALS_H_
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320fbb7030fff58e25718291811394487d95d95a3eElliott Hughes#include <string>
330fbb7030fff58e25718291811394487d95d95a3eElliott Hughes#include <vector>
340fbb7030fff58e25718291811394487d95d95a3eElliott Hughes
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdarg.h>
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <pthread.h>
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* private structures */
39d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct GcHeap;
40d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct BreakpointSet;
41d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct InlineSub;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * One of these for each -ea/-da/-esa/-dsa on the command line.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
46d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct AssertionControl {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char*   pkgOrClass;         /* package/class string, or NULL for esa/dsa */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int     pkgOrClassLen;      /* string length, for quick compare */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool    enable;             /* enable or disable */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool    isPackage;          /* string ended with "..."? */
51d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
54701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * Register map generation mode.  Only applicable when generateRegisterMaps
55701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * is enabled.  (The "disabled" state is not folded into this because
56701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * there are callers like dexopt that want to enable/disable without
57701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * specifying the configuration details.)
58701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden *
59701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * "TypePrecise" is slower and requires additional storage for the register
60701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * maps, but allows type-precise GC.  "LivePrecise" is even slower and
61701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden * requires additional heap during processing, but allows live-precise GC.
62701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden */
63d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum RegisterMapMode {
64701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden    kRegisterMapModeUnknown = 0,
65701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden    kRegisterMapModeTypePrecise,
66701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden    kRegisterMapModeLivePrecise
67d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
68701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden
69701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden/*
70949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown * Profiler clock source.
71949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown */
72949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brownenum ProfilerClockSource {
73949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown    kProfilerClockSourceThreadCpu,
74949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown    kProfilerClockSourceWall,
75949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown    kProfilerClockSourceDual,
76949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown};
77949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown
78949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown/*
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All fields are initialized to zero.
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
81689cc333b7be28b8b312f91999a31a2b0bd60c62Elliott Hughes * Storage allocated here must be freed by a subsystem shutdown function.
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct DvmGlobals {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Some options from the command line or environment.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char*       bootClassPathStr;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char*       classPathStr;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro    size_t      heapStartingSize;
91df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro    size_t      heapMaximumSize;
92df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro    size_t      heapGrowthLimit;
93485dfb5ccb6d8b2c5d498ff6ee41b14e79103e3cIan Rogers    double      heapTargetUtilization;
94485dfb5ccb6d8b2c5d498ff6ee41b14e79103e3cIan Rogers    size_t      heapMinFree;
95485dfb5ccb6d8b2c5d498ff6ee41b14e79103e3cIan Rogers    size_t      heapMaxFree;
96df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro    size_t      stackSize;
97ce6603b52e6b2ef947cb308b1d7157e357bcba02Elliott Hughes    size_t      mainThreadStackSize;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        verboseGc;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        verboseJni;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        verboseClass;
10243eb5015ca8bc0c859100b659d9c12934011a42eAndy McFadden    bool        verboseShutdown;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        jdwpAllowed;        // debugging allowed for this process?
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        jdwpConfigured;     // has debugging info been provided?
106d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro    JdwpTransportType jdwpTransport;
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        jdwpServer;
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char*       jdwpHost;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         jdwpPort;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        jdwpSuspend;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112949c3ec207a7720fb47f7b3ca1f84dfcfd70aaa9Jeff Brown    ProfilerClockSource profilerClockSource;
113ea4143449084917fb5ec25b1f3b29a1130284432Andy McFadden
114b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro    /*
115b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro     * Lock profiling threshold value in milliseconds.  Acquires that
116b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro     * exceed threshold are logged.  Acquires within the threshold are
117b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro     * logged with a probability of $\frac{time}{threshold}$ .  If the
118b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro     * threshold is unset no additional logging occurs.
119b8fcf57f13b4d37950cfbd72a6af401941d7bdd8Carl Shapiro     */
120f0c514ce8c64a441375af4a7e364282a3d803c45Carl Shapiro    u4          lockProfThreshold;
121f0c514ce8c64a441375af4a7e364282a3d803c45Carl Shapiro
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         (*vfprintfHook)(FILE*, const char*, va_list);
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void        (*exitHook)(int);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void        (*abortHook)(void);
1253b55675a442a173eb1337ba3c5866cd30cefb504Brad Fitzpatrick    bool        (*isSensitiveThreadHook)(void);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         jniGrefLimit;       // 0 means no limit
1288afa9dfe04354e5b3917e31e3e2772885f507580Elliott Hughes    char*       jniTrace;
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        reduceSignals;
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        noQuitHandler;
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        verifyDexChecksum;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char*       stackTraceFile;     // for SIGQUIT-inspired output
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        logStdio;
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexOptimizerMode    dexOptMode;
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexClassVerifyMode  classVerifyMode;
1385cbb23083f53e94204e802930b0923aeb3fb07c8Barry Hayes
139701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden    bool        generateRegisterMaps;
140701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden    RegisterMapMode     registerMapMode;
141701d2720fa693621a3c0c4d0bdf9e32e3eb8e731Andy McFadden
1423f64a024dec2c080b9abde74502826b29263152aAndy McFadden    bool        monitorVerification;
1433f64a024dec2c080b9abde74502826b29263152aAndy McFadden
144c58b9ef90319c4edad93300151c088434092e9e0Andy McFadden    bool        dexOptForSmp;
145c58b9ef90319c4edad93300151c088434092e9e0Andy McFadden
146962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes    /*
147962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes     * GC option flags.
148962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes     */
14999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    bool        preciseGc;
150962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes    bool        preVerify;
151962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes    bool        postVerify;
152ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro    bool        concurrentMarkSweep;
1536e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes    bool        verifyCardTable;
154821fd06d4dc53f23e82074fcc8d8ffdc32ea3a51Carl Shapiro    bool        disableExplicitGc;
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         assertionCtrlCount;
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    AssertionControl*   assertionCtrl;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ExecutionMode   executionMode;
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1610c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    bool        commonInit; /* whether common stubs are generated */
1620c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    bool        constInit; /* whether global constants are initialized */
1630c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * VM init management.
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        initializing;
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        optimizing;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
17149dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes     * java.lang.System properties set from the command line with -D.
17249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes     * This is effectively a set, where later entries override earlier
17349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes     * ones.
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
175689cc333b7be28b8b312f91999a31a2b0bd60c62Elliott Hughes    std::vector<std::string>* properties;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Where the VM goes to find system classes.
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassPathEntry* bootClassPath;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* used by the DEX optimizer to load classes from an unfinished DEX */
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DvmDex*     bootClassPathOptExtra;
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        optimizingBootstrapClass;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Loaded classes, hashed by class name.  Each entry is a ClassObject*,
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * allocated in GC space.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HashTable*  loadedClasses;
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Value for the next class serial number to be assigned.  This is
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * incremented as we load classes.  Failed loads and races may result
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in some numbers being skipped, and the serial number is not
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * guaranteed to start at 1, so the current value should not be used
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as a count of loaded classes.
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    volatile int classSerialNumber;
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2012c98747b403970ef4b3352e271633f93935b9825Barry Hayes     * Classes with a low classSerialNumber are probably in the zygote, and
2022c98747b403970ef4b3352e271633f93935b9825Barry Hayes     * their InitiatingLoaderList is not used, to promote sharing. The list is
2032c98747b403970ef4b3352e271633f93935b9825Barry Hayes     * kept here instead.
2042c98747b403970ef4b3352e271633f93935b9825Barry Hayes     */
2052c98747b403970ef4b3352e271633f93935b9825Barry Hayes    InitiatingLoaderList* initiatingLoaderList;
2062c98747b403970ef4b3352e271633f93935b9825Barry Hayes
2072c98747b403970ef4b3352e271633f93935b9825Barry Hayes    /*
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Interned strings.
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
210bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro
211bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro    /* A mutex that guards access to the interned string tables. */
212bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro    pthread_mutex_t internLock;
213bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro
214bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro    /* Hash table of strings interned by the user. */
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HashTable*  internedStrings;
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro    /* Hash table of strings interned by the class loader. */
218bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro    HashTable*  literalStrings;
219bb1e0e904b8dc159ad6ca680419b00c5938cd2b8Carl Shapiro
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
221318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein     * Classes constructed directly by the vm.
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
223318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein
224318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    /* the class Class */
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangClass;
226318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein
227318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    /* synthetic classes representing primitive types */
228318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeVoid;
229318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeBoolean;
230318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeByte;
231318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeShort;
232318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeChar;
233318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeInt;
234318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeLong;
235318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeFloat;
236318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* typeDouble;
237318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein
238318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    /* synthetic classes for arrays of primitives */
239318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayBoolean;
240318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayByte;
241318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayShort;
242318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayChar;
243318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayInt;
244318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayLong;
245318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayFloat;
246318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    ClassObject* classArrayDouble;
247318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein
248318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein    /*
249318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein     * Quick lookups for popular classes used internally.
250318839c0b3f912790b61c876fbe75917e1ca0378Dan Bornstein     */
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangClassArray;
2520970976b0e980be00424f93a69c2bc13ca3131f3Andy McFadden    ClassObject* classJavaLangClassLoader;
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangObject;
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangObjectArray;
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangString;
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangThread;
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangVMThread;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangThreadGroup;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangStackTraceElement;
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangStackTraceElementArray;
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangAnnotationAnnotationArray;
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangAnnotationAnnotationArrayArray;
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectAccessibleObject;
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectConstructor;
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectConstructorArray;
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectField;
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectFieldArray;
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectMethod;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectMethodArray;
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classJavaLangReflectProxy;
2718e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden    ClassObject* classJavaNioReadWriteDirectByteBuffer;
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationFactory;
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMember;
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMemberArray;
2754b17a1da633822d7651fe854aece7ea93c1edf70Andy McFadden    ClassObject* classOrgApacheHarmonyDalvikDdmcChunk;
2764b17a1da633822d7651fe854aece7ea93c1edf70Andy McFadden    ClassObject* classOrgApacheHarmonyDalvikDdmcDdmServer;
2773475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro    ClassObject* classJavaLangRefFinalizerReference;
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27932bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    /*
28032bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein     * classes representing exception types. The names here don't include
28132bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein     * packages, just to keep the use sites a bit less verbose. All are
28232bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein     * in java.lang, except where noted.
28332bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein     */
28485ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein    ClassObject* exAbstractMethodError;
2856d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    ClassObject* exArithmeticException;
2866d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    ClassObject* exArrayIndexOutOfBoundsException;
2876d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    ClassObject* exArrayStoreException;
2886d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    ClassObject* exClassCastException;
28985ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein    ClassObject* exClassCircularityError;
2902c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein    ClassObject* exClassFormatError;
2919b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein    ClassObject* exClassNotFoundException;
29232bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    ClassObject* exError;
29332bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    ClassObject* exExceptionInInitializerError;
2942c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein    ClassObject* exFileNotFoundException; /* in java.io */
2952c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein    ClassObject* exIOException;           /* in java.io */
296537e29e62e2e465c8ab3b1587d726eb5bf708665Dan Bornstein    ClassObject* exIllegalAccessError;
2979b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein    ClassObject* exIllegalAccessException;
298bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein    ClassObject* exIllegalArgumentException;
299bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein    ClassObject* exIllegalMonitorStateException;
300bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein    ClassObject* exIllegalStateException;
301bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein    ClassObject* exIllegalThreadStateException;
302537e29e62e2e465c8ab3b1587d726eb5bf708665Dan Bornstein    ClassObject* exIncompatibleClassChangeError;
303a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein    ClassObject* exInstantiationError;
304bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein    ClassObject* exInstantiationException;
3058521311b4e55847c650a87933d5a3f04618e4e69Dan Bornstein    ClassObject* exInternalError;
3069b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein    ClassObject* exInterruptedException;
307537e29e62e2e465c8ab3b1587d726eb5bf708665Dan Bornstein    ClassObject* exLinkageError;
3082c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein    ClassObject* exNegativeArraySizeException;
3098521311b4e55847c650a87933d5a3f04618e4e69Dan Bornstein    ClassObject* exNoClassDefFoundError;
310537e29e62e2e465c8ab3b1587d726eb5bf708665Dan Bornstein    ClassObject* exNoSuchFieldError;
3119b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein    ClassObject* exNoSuchFieldException;
312537e29e62e2e465c8ab3b1587d726eb5bf708665Dan Bornstein    ClassObject* exNoSuchMethodError;
3132c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein    ClassObject* exNullPointerException;
31485ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein    ClassObject* exOutOfMemoryError;
31532bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    ClassObject* exRuntimeException;
31632bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    ClassObject* exStackOverflowError;
3179b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein    ClassObject* exStaleDexCacheError;    /* in dalvik.system */
3187a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein    ClassObject* exStringIndexOutOfBoundsException;
31932bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein    ClassObject* exThrowable;
32085ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein    ClassObject* exTypeNotPresentException;
3218521311b4e55847c650a87933d5a3f04618e4e69Dan Bornstein    ClassObject* exUnsatisfiedLinkError;
3227a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein    ClassObject* exUnsupportedOperationException;
32385ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein    ClassObject* exVerifyError;
3247a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein    ClassObject* exVirtualMachineError;
32532bb3da6f05959749161ce7f9103027f11597fe3Dan Bornstein
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* method offsets - Object */
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         voffJavaLangObject_equals;
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         voffJavaLangObject_hashCode;
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         voffJavaLangObject_toString;
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - String */
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangString_value;
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangString_count;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangString_offset;
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangString_hashCode;
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - Thread */
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThread_vmThread;
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThread_group;
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThread_daemon;
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThread_name;
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThread_priority;
34319cd2fcb98cbefe22a76d353020cb5b0277578aaAndy McFadden    int         offJavaLangThread_uncaughtHandler;
344f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    int         offJavaLangThread_contextClassLoader;
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* method offsets - Thread */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         voffJavaLangThread_run;
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34986c95935211bcb07cc2cb9dc1a6d1069f80f727cAndy McFadden    /* field offsets - ThreadGroup */
35086c95935211bcb07cc2cb9dc1a6d1069f80f727cAndy McFadden    int         offJavaLangThreadGroup_name;
35186c95935211bcb07cc2cb9dc1a6d1069f80f727cAndy McFadden    int         offJavaLangThreadGroup_parent;
35286c95935211bcb07cc2cb9dc1a6d1069f80f727cAndy McFadden
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - VMThread */
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangVMThread_thread;
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangVMThread_vmData;
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* method offsets - ThreadGroup */
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         voffJavaLangThreadGroup_removeThread;
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - Throwable */
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThrowable_stackState;
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangThrowable_cause;
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3640477139e2b3e614c6bc20d15c43e5e9b28ae9c13Andy McFadden    /* method offsets - ClassLoader */
3650477139e2b3e614c6bc20d15c43e5e9b28ae9c13Andy McFadden    int         voffJavaLangClassLoader_loadClass;
3660477139e2b3e614c6bc20d15c43e5e9b28ae9c13Andy McFadden
367f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    /* direct method pointers - ClassLoader */
368f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    Method*     methJavaLangClassLoader_getSystemClassLoader;
369f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - java.lang.reflect.* */
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectConstructor_slot;
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectConstructor_declClass;
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectField_slot;
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectField_declClass;
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectMethod_slot;
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectMethod_declClass;
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - java.lang.ref.Reference */
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangRefReference_referent;
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangRefReference_queue;
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangRefReference_queueNext;
3822a6f4846b2a9e252c914e5103270fc86cc786859Carl Shapiro    int         offJavaLangRefReference_pendingNext;
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
384ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    /* field offsets - java.lang.ref.FinalizerReference */
385ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    int offJavaLangRefFinalizerReference_zombie;
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
387ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    /* method pointers - java.lang.ref.ReferenceQueue */
388ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    Method* methJavaLangRefReferenceQueueAdd;
389ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro
390ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    /* method pointers - java.lang.ref.FinalizerReference */
391ce87bfed41bbe4248b2770fb1a90f34b2518f6faCarl Shapiro    Method* methJavaLangRefFinalizerReferenceAdd;
3923475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* constructor method pointers; no vtable involved, so use Method* */
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methJavaLangStackTraceElement_init;
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methJavaLangReflectConstructor_init;
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methJavaLangReflectField_init;
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methJavaLangReflectMethod_init;
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methOrgApacheHarmonyLangAnnotationAnnotationMember_init;
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* static method pointers - android.lang.annotation.* */
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        methOrgApacheHarmonyLangAnnotationAnnotationFactory_createAnnotation;
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* direct method pointers - java.lang.reflect.Proxy */
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method*     methJavaLangReflectProxy_constructorPrototype;
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* field offsets - java.lang.reflect.Proxy */
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         offJavaLangReflectProxy_h;
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41019cd2fcb98cbefe22a76d353020cb5b0277578aaAndy McFadden    /* field offsets - java.io.FileDescriptor */
41119cd2fcb98cbefe22a76d353020cb5b0277578aaAndy McFadden    int         offJavaIoFileDescriptor_descriptor;
41219cd2fcb98cbefe22a76d353020cb5b0277578aaAndy McFadden
413f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    /* direct method pointers - dalvik.system.NativeStart */
414f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    Method*     methDalvikSystemNativeStart_main;
415f5e6de992c4b1b9b89c5f327be453e7e8fba312bAndy McFadden    Method*     methDalvikSystemNativeStart_run;
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4178e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden    /* assorted direct buffer helpers */
4188e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden    Method*     methJavaNioReadWriteDirectByteBuffer_init;
4198e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden    int         offJavaNioBuffer_capacity;
4208e696dc0271299433cb3297e7aafc7bd0ee1b2b7Andy McFadden    int         offJavaNioBuffer_effectiveDirectAddress;
4215f612b82bbc2fcfb13865acd3c3835febab23466Andy McFadden
422ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    /* direct method pointers - org.apache.harmony.dalvik.ddmc.DdmServer */
423ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    Method*     methDalvikDdmcServer_dispatch;
424ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    Method*     methDalvikDdmcServer_broadcast;
425ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden
426ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    /* field offsets - org.apache.harmony.dalvik.ddmc.Chunk */
427ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    int         offDalvikDdmcChunk_type;
428ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    int         offDalvikDdmcChunk_data;
429ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    int         offDalvikDdmcChunk_offset;
430ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden    int         offDalvikDdmcChunk_length;
431ce1762c38447714349cfbf71a73750e7fa382c11Andy McFadden
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Thread list.  This always has at least one element in it (main),
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and main is always the first entry.
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The threadListLock is used for several things, including the thread
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * start condition variable.  Generally speaking, you must hold the
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * threadListLock when:
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  - adding/removing items from the list
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  - waiting on or signaling threadStartCond
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  - examining the Thread struct for another thread (this is to avoid
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    one thread freeing the Thread struct while another thread is
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    perusing it)
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread*     threadList;
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t threadListLock;
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_cond_t threadStartCond;
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The thread code grabs this before suspending all threads.  There
4522aa43610c391868eb6ef80bf3b1f947776defccaAndy McFadden     * are a few things that can cause a "suspend all":
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (1) the GC is starting;
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (2) the debugger has sent a "suspend all" request;
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (3) a thread has hit a breakpoint or exception that the debugger
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      has marked as a "suspend all" event;
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (4) the SignalCatcher caught a signal that requires suspension.
458ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  (5) (if implemented) the JIT needs to perform a heavyweight
459ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *      rearrangement of the translation cache or JitTable.
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Because we use "safe point" self-suspension, it is never safe to
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * do a blocking "lock" call on this mutex -- if it has been acquired,
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * somebody is probably trying to put you to sleep.  The leading '_' is
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * intended as a reminder that this lock is special.
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t _threadSuspendLock;
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
469389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee     * Guards Thread->suspendCount for all threads, and
4709a3147c7412f4794434b4c2604aa2ba784867774buzbee     * provides the lock for the condition variable that all suspended threads
4719a3147c7412f4794434b4c2604aa2ba784867774buzbee     * sleep on (threadSuspendCountCond).
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This has to be separate from threadListLock because of the way
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * threads put themselves to sleep.
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t threadSuspendCountLock;
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Suspended threads sleep on this.  They should sleep on the condition
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * variable until their "suspend count" is zero.
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Paired with "threadSuspendCountLock".
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_cond_t  threadSuspendCountCond;
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
487cb3081f675109049e63380170b60871e8275f9a8buzbee     * Sum of all threads' suspendCount fields. Guarded by
488cb3081f675109049e63380170b60871e8275f9a8buzbee     * threadSuspendCountLock.
48946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee     */
49046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    int  sumThreadSuspendCount;
49146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee
49246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    /*
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * MUTEX ORDERING: when locking multiple mutexes, always grab them in
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this order to avoid deadlock:
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (1) _threadSuspendLock      (use lockThreadSuspend())
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (2) threadListLock          (use dvmLockThreadList())
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  (3) threadSuspendCountLock  (use lockThreadSuspendCount())
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Thread ID bitmap.  We want threads to have small integer IDs so
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we can use them in "thin locks".
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    BitVector*  threadIdMap;
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Manage exit conditions.  The VM exits when all non-daemon threads
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * have exited.  If the main thread returns early, we need to sleep
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on a condition variable.
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         nonDaemonThreadCount;   /* must hold threadListLock to access */
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_cond_t  vmExitCond;
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The set of DEX files loaded by custom class loaders.
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HashTable*  userDexFiles;
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JNI global reference table.
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
524d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    IndirectRefTable jniGlobalRefTable;
525e4c3b5ef3b418ea50f577a850bdbdfaf97718601Carl Shapiro    IndirectRefTable jniWeakGlobalRefTable;
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t jniGlobalRefLock;
527e4c3b5ef3b418ea50f577a850bdbdfaf97718601Carl Shapiro    pthread_mutex_t jniWeakGlobalRefLock;
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         jniGlobalRefHiMark;
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         jniGlobalRefLoMark;
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
532c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden     * JNI pinned object table (used for primitive arrays).
533c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden     */
534c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden    ReferenceTable  jniPinRefTable;
535c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden    pthread_mutex_t jniPinRefLock;
536c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden
537c26bb63b50c7a855d25b396b1bf23a3aa6929b48Andy McFadden    /*
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Native shared library table.
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HashTable*  nativeLibs;
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * GC heap lock.  Functions like gcMalloc() acquire this before making
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * any changes to the heap.  It is held throughout garbage collection.
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t gcHeapLock;
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
548ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro    /*
549ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro     * Condition variable to queue threads waiting to retry an
550ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro     * allocation.  Signaled after a concurrent GC is completed.
551ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro     */
552ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro    pthread_cond_t gcHeapCond;
553ec47e2e081dcd43dca10d5e2c6856f73e94b0460Carl Shapiro
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Opaque pointer representing the heap. */
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GcHeap*     gcHeap;
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5574496ed9ef85e19447e697481d16842f47d265756Barry Hayes    /* The card table base, modified as needed for marking cards. */
5584496ed9ef85e19447e697481d16842f47d265756Barry Hayes    u1*         biasedCardTableBase;
5594496ed9ef85e19447e697481d16842f47d265756Barry Hayes
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5617fc3ce8f0223a90006ad2c431a43b0bc841ee3c2Andy McFadden     * Pre-allocated throwables.
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object*     outOfMemoryObj;
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object*     internalErrorObj;
5657fc3ce8f0223a90006ad2c431a43b0bc841ee3c2Andy McFadden    Object*     noClassDefFoundErrorObj;
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Monitor list, so we can free them */
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*volatile*/ Monitor* monitorList;
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Monitor for Thread.sleep() implementation */
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Monitor*    threadSleepMon;
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set when we create a second heap inside the zygote */
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        newZygoteHeapAllocated;
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TLS keys.
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_key_t pthreadKeySelf;       /* Thread*, for dvmThreadSelf */
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Cache results of "A instanceof B".
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    AtomicCache* instanceofCache;
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
586cb3c542b8712b7ef005aabc4b8139c667afc7a9dAndy McFadden    /* inline substitution table, used during optimization */
587cb3c542b8712b7ef005aabc4b8139c667afc7a9dAndy McFadden    InlineSub*          inlineSubs;
588cb3c542b8712b7ef005aabc4b8139c667afc7a9dAndy McFadden
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Bootstrap class loader linear allocator.
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LinearAllocHdr* pBootLoaderAlloc;
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compute some stats on loaded classes.
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
59799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    int         numLoadedClasses;
59899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    int         numDeclaredMethods;
59999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    int         numDeclaredInstFields;
60099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    int         numDeclaredStaticFields;
60199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
60299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /* when using a native debugger, set this to suppress watchdog timers */
60399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    bool        nativeDebuggerActive;
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JDWP debugger support.
6079a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
6089a3147c7412f4794434b4c2604aa2ba784867774buzbee     * Note: Each thread will normally determine whether the debugger is active
6099a3147c7412f4794434b4c2604aa2ba784867774buzbee     * for it by referring to its subMode flags.  "debuggerActive" here should be
6109a3147c7412f4794434b4c2604aa2ba784867774buzbee     * seen as "debugger is making requests of 1 or more threads".
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        debuggerConnected;      /* debugger or DDMS is connected */
6139a3147c7412f4794434b4c2604aa2ba784867774buzbee    bool        debuggerActive;         /* debugger is making requests */
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JdwpState*  jdwpState;
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Registry of objects known to the debugger.
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    HashTable*  dbgRegistry;
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
62296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden     * Debugger breakpoint table.
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
62496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden    BreakpointSet*  breakpointSet;
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Single-step control struct.  We currently only allow one thread to
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be single-stepping at a time, which is all that really makes sense,
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * but it's possible we may need to expand this to be per-thread.
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    StepControl stepControl;
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * DDM features embedded in the VM.
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        ddmThreadNotification;
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Zygote (partially-started process) support
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        zygote;
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Used for tracking allocations that we report to DDMS.  When the feature
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is enabled (through a DDMS request) the "allocRecords" pointer becomes
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * non-NULL.
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t allocTrackerLock;
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    AllocRecord*    allocRecords;
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int             allocRecordHead;        /* most-recently-added entry */
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int             allocRecordCount;       /* #of valid entries */
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6549a3147c7412f4794434b4c2604aa2ba784867774buzbee     * When a profiler is enabled, this is incremented.  Distinct profilers
6559a3147c7412f4794434b4c2604aa2ba784867774buzbee     * include "dmtrace" method tracing, emulator method tracing, and
6569a3147c7412f4794434b4c2604aa2ba784867774buzbee     * possibly instruction counting.
6579a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
6589a3147c7412f4794434b4c2604aa2ba784867774buzbee     * The purpose of this is to have a single value that shows whether any
6599a3147c7412f4794434b4c2604aa2ba784867774buzbee     * profiling is going on.  Individual thread will normally check their
6609a3147c7412f4794434b4c2604aa2ba784867774buzbee     * thread-private subMode flags to take any profiling action.
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6629a3147c7412f4794434b4c2604aa2ba784867774buzbee    volatile int activeProfilers;
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * State for method-trace profiling.
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MethodTraceState methodTrace;
6682ff04ab635eeba79c2dad82850c34188abcdfe62Andy McFadden    Method*     methodTraceGcMethod;
6692ff04ab635eeba79c2dad82850c34188abcdfe62Andy McFadden    Method*     methodTraceClassPrepMethod;
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * State for emulator tracing.
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void*       emulatorTracePage;
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int         emulatorTraceEnableCount;
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Global state for memory allocation profiling.
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    AllocProfState allocProf;
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Pointers to the original methods for things that have been inlined.
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This makes it easy for us to output method entry/exit records for
6850d615c3ce5bf97ae65b9347ee77968f38620d5e8Andy McFadden     * the method calls we're not actually making.  (Used by method
6860d615c3ce5bf97ae65b9347ee77968f38620d5e8Andy McFadden     * profiling.)
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method**    inlinedMethods;
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
691ccaab18ae6d203108445fef7682065dfbb007657Dan Bornstein     * Dalvik instruction counts (kNumPackedOpcodes entries).
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int*        executedInstrCounts;
6945183a199a15451a31b32a293fcd0e96a7321b0c5Andy McFadden    int         instructionCountEnableCount;
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signal catcher thread (for SIGQUIT).
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_t   signalCatcherHandle;
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool        haltSignalCatcher;
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Stdout/stderr conversion thread.
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool            haltStdioConverter;
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool            stdioConverterReady;
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_t       stdioConverterHandle;
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_mutex_t stdioConverterLock;
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pthread_cond_t  stdioConverterCond;
7100c32ebc544b8dd1528dc007090abda0be5f31174Carl Shapiro    int             stdoutPipe[2];
7110c32ebc544b8dd1528dc007090abda0be5f31174Carl Shapiro    int             stderrPipe[2];
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * pid of the system_server process. We track it so that when system server
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * crashes the Zygote process will be killed and restarted.
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pid_t systemServerPid;
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
719894dd4668c4b5c5f4259fd2d84ed4deaa5611efdSan Mehat    int kernelGroupScheduling;
720894dd4668c4b5c5f4259fd2d84ed4deaa5611efdSan Mehat
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//#define COUNT_PRECISE_METHODS
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef COUNT_PRECISE_METHODS
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    PointerSet* preciseMethods;
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
72599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
72699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /* some RegisterMap statistics, useful during development */
72799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    void*       registerMapStats;
728470cbbbe39cffd9b1cf52562048c60be543004c6Andy McFadden
729470cbbbe39cffd9b1cf52562048c60be543004c6Andy McFadden#ifdef VERIFIER_STATS
730470cbbbe39cffd9b1cf52562048c60be543004c6Andy McFadden    VerifierStats verifierStats;
731470cbbbe39cffd9b1cf52562048c60be543004c6Andy McFadden#endif
732f7c18055de6e7ffb3ee16a45680ea0ffd6158fbdBen Cheng
733f7c18055de6e7ffb3ee16a45680ea0ffd6158fbdBen Cheng    /* String pointed here will be deposited on the stack frame of dvmAbort */
734f7c18055de6e7ffb3ee16a45680ea0ffd6158fbdBen Cheng    const char *lastMessage;
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectextern struct DvmGlobals gDvm;
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
74038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
7412e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* Trace profiling modes.  Ordering matters - off states before on states */
742d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum TraceProfilingModes {
7432e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    kTraceProfilingDisabled = 0,      // Not profiling
7442e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    kTraceProfilingPeriodicOff = 1,   // Periodic profiling, off phase
7452e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    kTraceProfilingContinuous = 2,    // Always profiling
7462e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    kTraceProfilingPeriodicOn = 3     // Periodic profiling, on phase
747d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
7482e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
749ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
7506c10a977ec892c26c8e306356491833bbb073d40Ben Cheng * Exiting the compiled code w/o chaining will incur overhead to look up the
7516c10a977ec892c26c8e306356491833bbb073d40Ben Cheng * target in the code cache which is extra work only when JIT is enabled. So
7526c10a977ec892c26c8e306356491833bbb073d40Ben Cheng * we want to monitor it closely to make sure we don't have performance bugs.
7536c10a977ec892c26c8e306356491833bbb073d40Ben Cheng */
754d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum NoChainExits {
7556c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    kInlineCacheMiss = 0,
7566c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    kCallsiteInterpreted,
7576c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    kSwitchOverflow,
758fccb31dd58e5cb9f7a3f6e128d481f0ff35a51f0Bill Buzbee    kHeavyweightMonitor,
7596c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    kNoChainExitLast,
760d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
7616c10a977ec892c26c8e306356491833bbb073d40Ben Cheng
7626c10a977ec892c26c8e306356491833bbb073d40Ben Cheng/*
763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * JIT-specific global state
764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstruct DvmJitGlobals {
766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Guards writes to Dalvik PC (dPC), translated code address (codeAddr) and
768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * chain fields within the JIT hash table.  Note carefully the access
769ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * mechanism.
770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Only writes are guarded, and the guarded fields must be updated in a
771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * specific order using atomic operations.  Further, once a field is
772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * written it cannot be changed without halting all threads.
773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The write order is:
775ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *    1) codeAddr
776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *    2) dPC
777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *    3) chain [if necessary]
778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
779ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * This mutex also guards both read and write of curJitTableEntries.
780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    pthread_mutex_t tableLock;
782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* The JIT hash table.  Note that for access speed, copies of this pointer
784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * are stored in each thread. */
785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    struct JitEntry *pJitEntryTable;
786ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
7872e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    /* Array of compilation trigger threshold counters */
788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    unsigned char *pProfTable;
789ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
7902e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    /* Trace profiling counters */
7912e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    struct JitTraceProfCounters *pJitTraceProfCounters;
7922e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
79306bb83906737fec543c86ab36f450cc62066b58aBill Buzbee    /* Copy of pProfTable used for temporarily disabling the Jit */
79406bb83906737fec543c86ab36f450cc62066b58aBill Buzbee    unsigned char *pProfTableCopy;
79506bb83906737fec543c86ab36f450cc62066b58aBill Buzbee
796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Size of JIT hash table in entries.  Must be a power of 2 */
7972717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee    unsigned int jitTableSize;
7982717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee
7992717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee    /* Mask used in hash function for JitTable.  Should be jitTableSize-1 */
8002717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee    unsigned int jitTableMask;
8012717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee
8022717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee    /* How many entries in the JitEntryTable are in use */
8032717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee    unsigned int jitTableEntriesUsed;
804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
80594e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng    /* Bytes allocated for the code cache */
80694e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng    unsigned int codeCacheSize;
80794e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng
808ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Trigger for trace selection */
809ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    unsigned short threshold;
810ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
811ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* JIT Compiler Control */
812ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bool               haltCompilerThread;
813ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bool               blockingMode;
81418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bool               methodTraceSupport;
8157ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng    bool               genSuspendPoll;
816385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng    Thread*            compilerThread;
817ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    pthread_t          compilerHandle;
818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    pthread_mutex_t    compilerLock;
819c3b92b26df6416d3179e865adccb283ee4170ab1Ben Cheng    pthread_mutex_t    compilerICPatchLock;
820ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    pthread_cond_t     compilerQueueActivity;
821ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    pthread_cond_t     compilerQueueEmpty;
82288a0f970e47dc0091d2c9965aa9bd06667e5f4b7Ben Cheng    volatile int       compilerQueueLength;
823ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int                compilerHighWater;
824ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int                compilerWorkEnqueueIndex;
825ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int                compilerWorkDequeueIndex;
826c3b92b26df6416d3179e865adccb283ee4170ab1Ben Cheng    int                compilerICPatchIndex;
827ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
828ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* JIT internal stats */
829ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int                compilerMaxQueued;
830ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int                translationChains;
831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
832ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Compiled code cache */
833ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    void* codeCache;
834ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
835385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng    /*
836