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