1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Variables with library scope. 19 * 20 * Prefer this over scattered static and global variables -- it's easier to 21 * view the state in a debugger, it makes clean shutdown simpler, we can 22 * trivially dump the state into a crash log, and it dodges most naming 23 * collisions that will arise when we are embedded in a larger program. 24 * 25 * If we want multiple VMs per process, this can get stuffed into TLS (or 26 * accessed through a Thread field). May need to pass it around for some 27 * of the early initialization functions. 28 */ 29 #ifndef DALVIK_GLOBALS_H_ 30 #define DALVIK_GLOBALS_H_ 31 32 #include <string> 33 #include <vector> 34 35 #include <stdarg.h> 36 #include <pthread.h> 37 38 /* private structures */ 39 struct GcHeap; 40 struct BreakpointSet; 41 struct InlineSub; 42 43 /* 44 * One of these for each -ea/-da/-esa/-dsa on the command line. 45 */ 46 struct AssertionControl { 47 char* pkgOrClass; /* package/class string, or NULL for esa/dsa */ 48 int pkgOrClassLen; /* string length, for quick compare */ 49 bool enable; /* enable or disable */ 50 bool isPackage; /* string ended with "..."? */ 51 }; 52 53 /* 54 * Register map generation mode. Only applicable when generateRegisterMaps 55 * is enabled. (The "disabled" state is not folded into this because 56 * there are callers like dexopt that want to enable/disable without 57 * specifying the configuration details.) 58 * 59 * "TypePrecise" is slower and requires additional storage for the register 60 * maps, but allows type-precise GC. "LivePrecise" is even slower and 61 * requires additional heap during processing, but allows live-precise GC. 62 */ 63 enum RegisterMapMode { 64 kRegisterMapModeUnknown = 0, 65 kRegisterMapModeTypePrecise, 66 kRegisterMapModeLivePrecise 67 }; 68 69 /* 70 * Profiler clock source. 71 */ 72 enum ProfilerClockSource { 73 kProfilerClockSourceThreadCpu, 74 kProfilerClockSourceWall, 75 kProfilerClockSourceDual, 76 }; 77 78 /* 79 * All fields are initialized to zero. 80 * 81 * Storage allocated here must be freed by a subsystem shutdown function. 82 */ 83 struct DvmGlobals { 84 /* 85 * Some options from the command line or environment. 86 */ 87 char* bootClassPathStr; 88 char* classPathStr; 89 90 size_t heapStartingSize; 91 size_t heapMaximumSize; 92 size_t heapGrowthLimit; 93 double heapTargetUtilization; 94 size_t heapMinFree; 95 size_t heapMaxFree; 96 size_t stackSize; 97 size_t mainThreadStackSize; 98 99 bool verboseGc; 100 bool verboseJni; 101 bool verboseClass; 102 bool verboseShutdown; 103 104 bool jdwpAllowed; // debugging allowed for this process? 105 bool jdwpConfigured; // has debugging info been provided? 106 JdwpTransportType jdwpTransport; 107 bool jdwpServer; 108 char* jdwpHost; 109 int jdwpPort; 110 bool jdwpSuspend; 111 112 ProfilerClockSource profilerClockSource; 113 114 /* 115 * Lock profiling threshold value in milliseconds. Acquires that 116 * exceed threshold are logged. Acquires within the threshold are 117 * logged with a probability of $\frac{time}{threshold}$ . If the 118 * threshold is unset no additional logging occurs. 119 */ 120 u4 lockProfThreshold; 121 122 int (*vfprintfHook)(FILE*, const char*, va_list); 123 void (*exitHook)(int); 124 void (*abortHook)(void); 125 bool (*isSensitiveThreadHook)(void); 126 127 int jniGrefLimit; // 0 means no limit 128 char* jniTrace; 129 bool reduceSignals; 130 bool noQuitHandler; 131 bool verifyDexChecksum; 132 char* stackTraceFile; // for SIGQUIT-inspired output 133 134 bool logStdio; 135 136 DexOptimizerMode dexOptMode; 137 DexClassVerifyMode classVerifyMode; 138 139 bool generateRegisterMaps; 140 RegisterMapMode registerMapMode; 141 142 bool monitorVerification; 143 144 bool dexOptForSmp; 145 146 /* 147 * GC option flags. 148 */ 149 bool preciseGc; 150 bool preVerify; 151 bool postVerify; 152 bool concurrentMarkSweep; 153 bool verifyCardTable; 154 bool disableExplicitGc; 155 156 int assertionCtrlCount; 157 AssertionControl* assertionCtrl; 158 159 ExecutionMode executionMode; 160 161 bool commonInit; /* whether common stubs are generated */ 162 bool constInit; /* whether global constants are initialized */ 163 164 /* 165 * VM init management. 166 */ 167 bool initializing; 168 bool optimizing; 169 170 /* 171 * java.lang.System properties set from the command line with -D. 172 * This is effectively a set, where later entries override earlier 173 * ones. 174 */ 175 std::vector<std::string>* properties; 176 177 /* 178 * Where the VM goes to find system classes. 179 */ 180 ClassPathEntry* bootClassPath; 181 /* used by the DEX optimizer to load classes from an unfinished DEX */ 182 DvmDex* bootClassPathOptExtra; 183 bool optimizingBootstrapClass; 184 185 /* 186 * Loaded classes, hashed by class name. Each entry is a ClassObject*, 187 * allocated in GC space. 188 */ 189 HashTable* loadedClasses; 190 191 /* 192 * Value for the next class serial number to be assigned. This is 193 * incremented as we load classes. Failed loads and races may result 194 * in some numbers being skipped, and the serial number is not 195 * guaranteed to start at 1, so the current value should not be used 196 * as a count of loaded classes. 197 */ 198 volatile int classSerialNumber; 199 200 /* 201 * Classes with a low classSerialNumber are probably in the zygote, and 202 * their InitiatingLoaderList is not used, to promote sharing. The list is 203 * kept here instead. 204 */ 205 InitiatingLoaderList* initiatingLoaderList; 206 207 /* 208 * Interned strings. 209 */ 210 211 /* A mutex that guards access to the interned string tables. */ 212 pthread_mutex_t internLock; 213 214 /* Hash table of strings interned by the user. */ 215 HashTable* internedStrings; 216 217 /* Hash table of strings interned by the class loader. */ 218 HashTable* literalStrings; 219 220 /* 221 * Classes constructed directly by the vm. 222 */ 223 224 /* the class Class */ 225 ClassObject* classJavaLangClass; 226 227 /* synthetic classes representing primitive types */ 228 ClassObject* typeVoid; 229 ClassObject* typeBoolean; 230 ClassObject* typeByte; 231 ClassObject* typeShort; 232 ClassObject* typeChar; 233 ClassObject* typeInt; 234 ClassObject* typeLong; 235 ClassObject* typeFloat; 236 ClassObject* typeDouble; 237 238 /* synthetic classes for arrays of primitives */ 239 ClassObject* classArrayBoolean; 240 ClassObject* classArrayByte; 241 ClassObject* classArrayShort; 242 ClassObject* classArrayChar; 243 ClassObject* classArrayInt; 244 ClassObject* classArrayLong; 245 ClassObject* classArrayFloat; 246 ClassObject* classArrayDouble; 247 248 /* 249 * Quick lookups for popular classes used internally. 250 */ 251 ClassObject* classJavaLangClassArray; 252 ClassObject* classJavaLangClassLoader; 253 ClassObject* classJavaLangObject; 254 ClassObject* classJavaLangObjectArray; 255 ClassObject* classJavaLangString; 256 ClassObject* classJavaLangThread; 257 ClassObject* classJavaLangVMThread; 258 ClassObject* classJavaLangThreadGroup; 259 ClassObject* classJavaLangStackTraceElement; 260 ClassObject* classJavaLangStackTraceElementArray; 261 ClassObject* classJavaLangAnnotationAnnotationArray; 262 ClassObject* classJavaLangAnnotationAnnotationArrayArray; 263 ClassObject* classJavaLangReflectAccessibleObject; 264 ClassObject* classJavaLangReflectConstructor; 265 ClassObject* classJavaLangReflectConstructorArray; 266 ClassObject* classJavaLangReflectField; 267 ClassObject* classJavaLangReflectFieldArray; 268 ClassObject* classJavaLangReflectMethod; 269 ClassObject* classJavaLangReflectMethodArray; 270 ClassObject* classJavaLangReflectProxy; 271 ClassObject* classJavaNioDirectByteBuffer; 272 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationFactory; 273 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMember; 274 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMemberArray; 275 ClassObject* classOrgApacheHarmonyDalvikDdmcChunk; 276 ClassObject* classOrgApacheHarmonyDalvikDdmcDdmServer; 277 ClassObject* classJavaLangRefFinalizerReference; 278 279 /* 280 * classes representing exception types. The names here don't include 281 * packages, just to keep the use sites a bit less verbose. All are 282 * in java.lang, except where noted. 283 */ 284 ClassObject* exAbstractMethodError; 285 ClassObject* exArithmeticException; 286 ClassObject* exArrayIndexOutOfBoundsException; 287 ClassObject* exArrayStoreException; 288 ClassObject* exClassCastException; 289 ClassObject* exClassCircularityError; 290 ClassObject* exClassFormatError; 291 ClassObject* exClassNotFoundException; 292 ClassObject* exError; 293 ClassObject* exExceptionInInitializerError; 294 ClassObject* exFileNotFoundException; /* in java.io */ 295 ClassObject* exIOException; /* in java.io */ 296 ClassObject* exIllegalAccessError; 297 ClassObject* exIllegalAccessException; 298 ClassObject* exIllegalArgumentException; 299 ClassObject* exIllegalMonitorStateException; 300 ClassObject* exIllegalStateException; 301 ClassObject* exIllegalThreadStateException; 302 ClassObject* exIncompatibleClassChangeError; 303 ClassObject* exInstantiationError; 304 ClassObject* exInstantiationException; 305 ClassObject* exInternalError; 306 ClassObject* exInterruptedException; 307 ClassObject* exLinkageError; 308 ClassObject* exNegativeArraySizeException; 309 ClassObject* exNoClassDefFoundError; 310 ClassObject* exNoSuchFieldError; 311 ClassObject* exNoSuchFieldException; 312 ClassObject* exNoSuchMethodError; 313 ClassObject* exNullPointerException; 314 ClassObject* exOutOfMemoryError; 315 ClassObject* exRuntimeException; 316 ClassObject* exStackOverflowError; 317 ClassObject* exStaleDexCacheError; /* in dalvik.system */ 318 ClassObject* exStringIndexOutOfBoundsException; 319 ClassObject* exThrowable; 320 ClassObject* exTypeNotPresentException; 321 ClassObject* exUnsatisfiedLinkError; 322 ClassObject* exUnsupportedOperationException; 323 ClassObject* exVerifyError; 324 ClassObject* exVirtualMachineError; 325 326 /* method offsets - Object */ 327 int voffJavaLangObject_equals; 328 int voffJavaLangObject_hashCode; 329 int voffJavaLangObject_toString; 330 331 /* field offsets - String */ 332 int offJavaLangString_value; 333 int offJavaLangString_count; 334 int offJavaLangString_offset; 335 int offJavaLangString_hashCode; 336 337 /* field offsets - Thread */ 338 int offJavaLangThread_vmThread; 339 int offJavaLangThread_group; 340 int offJavaLangThread_daemon; 341 int offJavaLangThread_name; 342 int offJavaLangThread_priority; 343 int offJavaLangThread_uncaughtHandler; 344 int offJavaLangThread_contextClassLoader; 345 346 /* method offsets - Thread */ 347 int voffJavaLangThread_run; 348 349 /* field offsets - ThreadGroup */ 350 int offJavaLangThreadGroup_name; 351 int offJavaLangThreadGroup_parent; 352 353 /* field offsets - VMThread */ 354 int offJavaLangVMThread_thread; 355 int offJavaLangVMThread_vmData; 356 357 /* method offsets - ThreadGroup */ 358 int voffJavaLangThreadGroup_removeThread; 359 360 /* field offsets - Throwable */ 361 int offJavaLangThrowable_stackState; 362 int offJavaLangThrowable_cause; 363 364 /* method offsets - ClassLoader */ 365 int voffJavaLangClassLoader_loadClass; 366 367 /* direct method pointers - ClassLoader */ 368 Method* methJavaLangClassLoader_getSystemClassLoader; 369 370 /* field offsets - java.lang.reflect.* */ 371 int offJavaLangReflectConstructor_slot; 372 int offJavaLangReflectConstructor_declClass; 373 int offJavaLangReflectField_slot; 374 int offJavaLangReflectField_declClass; 375 int offJavaLangReflectMethod_slot; 376 int offJavaLangReflectMethod_declClass; 377 378 /* field offsets - java.lang.ref.Reference */ 379 int offJavaLangRefReference_referent; 380 int offJavaLangRefReference_queue; 381 int offJavaLangRefReference_queueNext; 382 int offJavaLangRefReference_pendingNext; 383 384 /* field offsets - java.lang.ref.FinalizerReference */ 385 int offJavaLangRefFinalizerReference_zombie; 386 387 /* method pointers - java.lang.ref.ReferenceQueue */ 388 Method* methJavaLangRefReferenceQueueAdd; 389 390 /* method pointers - java.lang.ref.FinalizerReference */ 391 Method* methJavaLangRefFinalizerReferenceAdd; 392 393 /* constructor method pointers; no vtable involved, so use Method* */ 394 Method* methJavaLangStackTraceElement_init; 395 Method* methJavaLangReflectConstructor_init; 396 Method* methJavaLangReflectField_init; 397 Method* methJavaLangReflectMethod_init; 398 Method* methOrgApacheHarmonyLangAnnotationAnnotationMember_init; 399 400 /* static method pointers - android.lang.annotation.* */ 401 Method* 402 methOrgApacheHarmonyLangAnnotationAnnotationFactory_createAnnotation; 403 404 /* direct method pointers - java.lang.reflect.Proxy */ 405 Method* methJavaLangReflectProxy_constructorPrototype; 406 407 /* field offsets - java.lang.reflect.Proxy */ 408 int offJavaLangReflectProxy_h; 409 410 /* field offsets - java.io.FileDescriptor */ 411 int offJavaIoFileDescriptor_descriptor; 412 413 /* direct method pointers - dalvik.system.NativeStart */ 414 Method* methDalvikSystemNativeStart_main; 415 Method* methDalvikSystemNativeStart_run; 416 417 /* assorted direct buffer helpers */ 418 Method* methJavaNioDirectByteBuffer_init; 419 int offJavaNioBuffer_capacity; 420 int offJavaNioBuffer_effectiveDirectAddress; 421 422 /* direct method pointers - org.apache.harmony.dalvik.ddmc.DdmServer */ 423 Method* methDalvikDdmcServer_dispatch; 424 Method* methDalvikDdmcServer_broadcast; 425 426 /* field offsets - org.apache.harmony.dalvik.ddmc.Chunk */ 427 int offDalvikDdmcChunk_type; 428 int offDalvikDdmcChunk_data; 429 int offDalvikDdmcChunk_offset; 430 int offDalvikDdmcChunk_length; 431 432 /* 433 * Thread list. This always has at least one element in it (main), 434 * and main is always the first entry. 435 * 436 * The threadListLock is used for several things, including the thread 437 * start condition variable. Generally speaking, you must hold the 438 * threadListLock when: 439 * - adding/removing items from the list 440 * - waiting on or signaling threadStartCond 441 * - examining the Thread struct for another thread (this is to avoid 442 * one thread freeing the Thread struct while another thread is 443 * perusing it) 444 */ 445 Thread* threadList; 446 pthread_mutex_t threadListLock; 447 448 pthread_cond_t threadStartCond; 449 450 /* 451 * The thread code grabs this before suspending all threads. There 452 * are a few things that can cause a "suspend all": 453 * (1) the GC is starting; 454 * (2) the debugger has sent a "suspend all" request; 455 * (3) a thread has hit a breakpoint or exception that the debugger 456 * has marked as a "suspend all" event; 457 * (4) the SignalCatcher caught a signal that requires suspension. 458 * (5) (if implemented) the JIT needs to perform a heavyweight 459 * rearrangement of the translation cache or JitTable. 460 * 461 * Because we use "safe point" self-suspension, it is never safe to 462 * do a blocking "lock" call on this mutex -- if it has been acquired, 463 * somebody is probably trying to put you to sleep. The leading '_' is 464 * intended as a reminder that this lock is special. 465 */ 466 pthread_mutex_t _threadSuspendLock; 467 468 /* 469 * Guards Thread->suspendCount for all threads, and 470 * provides the lock for the condition variable that all suspended threads 471 * sleep on (threadSuspendCountCond). 472 * 473 * This has to be separate from threadListLock because of the way 474 * threads put themselves to sleep. 475 */ 476 pthread_mutex_t threadSuspendCountLock; 477 478 /* 479 * Suspended threads sleep on this. They should sleep on the condition 480 * variable until their "suspend count" is zero. 481 * 482 * Paired with "threadSuspendCountLock". 483 */ 484 pthread_cond_t threadSuspendCountCond; 485 486 /* 487 * Sum of all threads' suspendCount fields. Guarded by 488 * threadSuspendCountLock. 489 */ 490 int sumThreadSuspendCount; 491 492 /* 493 * MUTEX ORDERING: when locking multiple mutexes, always grab them in 494 * this order to avoid deadlock: 495 * 496 * (1) _threadSuspendLock (use lockThreadSuspend()) 497 * (2) threadListLock (use dvmLockThreadList()) 498 * (3) threadSuspendCountLock (use lockThreadSuspendCount()) 499 */ 500 501 502 /* 503 * Thread ID bitmap. We want threads to have small integer IDs so 504 * we can use them in "thin locks". 505 */ 506 BitVector* threadIdMap; 507 508 /* 509 * Manage exit conditions. The VM exits when all non-daemon threads 510 * have exited. If the main thread returns early, we need to sleep 511 * on a condition variable. 512 */ 513 int nonDaemonThreadCount; /* must hold threadListLock to access */ 514 pthread_cond_t vmExitCond; 515 516 /* 517 * The set of DEX files loaded by custom class loaders. 518 */ 519 HashTable* userDexFiles; 520 521 /* 522 * JNI global reference table. 523 */ 524 IndirectRefTable jniGlobalRefTable; 525 IndirectRefTable jniWeakGlobalRefTable; 526 pthread_mutex_t jniGlobalRefLock; 527 pthread_mutex_t jniWeakGlobalRefLock; 528 int jniGlobalRefHiMark; 529 int jniGlobalRefLoMark; 530 531 /* 532 * JNI pinned object table (used for primitive arrays). 533 */ 534 ReferenceTable jniPinRefTable; 535 pthread_mutex_t jniPinRefLock; 536 537 /* 538 * Native shared library table. 539 */ 540 HashTable* nativeLibs; 541 542 /* 543 * GC heap lock. Functions like gcMalloc() acquire this before making 544 * any changes to the heap. It is held throughout garbage collection. 545 */ 546 pthread_mutex_t gcHeapLock; 547 548 /* 549 * Condition variable to queue threads waiting to retry an 550 * allocation. Signaled after a concurrent GC is completed. 551 */ 552 pthread_cond_t gcHeapCond; 553 554 /* Opaque pointer representing the heap. */ 555 GcHeap* gcHeap; 556 557 /* The card table base, modified as needed for marking cards. */ 558 u1* biasedCardTableBase; 559 560 /* 561 * Pre-allocated throwables. 562 */ 563 Object* outOfMemoryObj; 564 Object* internalErrorObj; 565 Object* noClassDefFoundErrorObj; 566 567 /* Monitor list, so we can free them */ 568 /*volatile*/ Monitor* monitorList; 569 570 /* Monitor for Thread.sleep() implementation */ 571 Monitor* threadSleepMon; 572 573 /* set when we create a second heap inside the zygote */ 574 bool newZygoteHeapAllocated; 575 576 /* 577 * TLS keys. 578 */ 579 pthread_key_t pthreadKeySelf; /* Thread*, for dvmThreadSelf */ 580 581 /* 582 * Cache results of "A instanceof B". 583 */ 584 AtomicCache* instanceofCache; 585 586 /* inline substitution table, used during optimization */ 587 InlineSub* inlineSubs; 588 589 /* 590 * Bootstrap class loader linear allocator. 591 */ 592 LinearAllocHdr* pBootLoaderAlloc; 593 594 /* 595 * Compute some stats on loaded classes. 596 */ 597 int numLoadedClasses; 598 int numDeclaredMethods; 599 int numDeclaredInstFields; 600 int numDeclaredStaticFields; 601 602 /* when using a native debugger, set this to suppress watchdog timers */ 603 bool nativeDebuggerActive; 604 605 /* 606 * JDWP debugger support. 607 * 608 * Note: Each thread will normally determine whether the debugger is active 609 * for it by referring to its subMode flags. "debuggerActive" here should be 610 * seen as "debugger is making requests of 1 or more threads". 611 */ 612 bool debuggerConnected; /* debugger or DDMS is connected */ 613 bool debuggerActive; /* debugger is making requests */ 614 JdwpState* jdwpState; 615 616 /* 617 * Registry of objects known to the debugger. 618 */ 619 HashTable* dbgRegistry; 620 621 /* 622 * Debugger breakpoint table. 623 */ 624 BreakpointSet* breakpointSet; 625 626 /* 627 * Single-step control struct. We currently only allow one thread to 628 * be single-stepping at a time, which is all that really makes sense, 629 * but it's possible we may need to expand this to be per-thread. 630 */ 631 StepControl stepControl; 632 633 /* 634 * DDM features embedded in the VM. 635 */ 636 bool ddmThreadNotification; 637 638 /* 639 * Zygote (partially-started process) support 640 */ 641 bool zygote; 642 643 /* 644 * Used for tracking allocations that we report to DDMS. When the feature 645 * is enabled (through a DDMS request) the "allocRecords" pointer becomes 646 * non-NULL. 647 */ 648 pthread_mutex_t allocTrackerLock; 649 AllocRecord* allocRecords; 650 int allocRecordHead; /* most-recently-added entry */ 651 int allocRecordCount; /* #of valid entries */ 652 653 /* 654 * When a profiler is enabled, this is incremented. Distinct profilers 655 * include "dmtrace" method tracing, emulator method tracing, and 656 * possibly instruction counting. 657 * 658 * The purpose of this is to have a single value that shows whether any 659 * profiling is going on. Individual thread will normally check their 660 * thread-private subMode flags to take any profiling action. 661 */ 662 volatile int activeProfilers; 663 664 /* 665 * State for method-trace profiling. 666 */ 667 MethodTraceState methodTrace; 668 Method* methodTraceGcMethod; 669 Method* methodTraceClassPrepMethod; 670 671 /* 672 * State for emulator tracing. 673 */ 674 void* emulatorTracePage; 675 int emulatorTraceEnableCount; 676 677 /* 678 * Global state for memory allocation profiling. 679 */ 680 AllocProfState allocProf; 681 682 /* 683 * Pointers to the original methods for things that have been inlined. 684 * This makes it easy for us to output method entry/exit records for 685 * the method calls we're not actually making. (Used by method 686 * profiling.) 687 */ 688 Method** inlinedMethods; 689 690 /* 691 * Dalvik instruction counts (kNumPackedOpcodes entries). 692 */ 693 int* executedInstrCounts; 694 int instructionCountEnableCount; 695 696 /* 697 * Signal catcher thread (for SIGQUIT). 698 */ 699 pthread_t signalCatcherHandle; 700 bool haltSignalCatcher; 701 702 /* 703 * Stdout/stderr conversion thread. 704 */ 705 bool haltStdioConverter; 706 bool stdioConverterReady; 707 pthread_t stdioConverterHandle; 708 pthread_mutex_t stdioConverterLock; 709 pthread_cond_t stdioConverterCond; 710 int stdoutPipe[2]; 711 int stderrPipe[2]; 712 713 /* 714 * pid of the system_server process. We track it so that when system server 715 * crashes the Zygote process will be killed and restarted. 716 */ 717 pid_t systemServerPid; 718 719 int kernelGroupScheduling; 720 721 //#define COUNT_PRECISE_METHODS 722 #ifdef COUNT_PRECISE_METHODS 723 PointerSet* preciseMethods; 724 #endif 725 726 /* some RegisterMap statistics, useful during development */ 727 void* registerMapStats; 728 729 #ifdef VERIFIER_STATS 730 VerifierStats verifierStats; 731 #endif 732 733 /* String pointed here will be deposited on the stack frame of dvmAbort */ 734 const char *lastMessage; 735 }; 736 737 extern struct DvmGlobals gDvm; 738 739 #if defined(WITH_JIT) 740 741 /* Trace profiling modes. Ordering matters - off states before on states */ 742 enum TraceProfilingModes { 743 kTraceProfilingDisabled = 0, // Not profiling 744 kTraceProfilingPeriodicOff = 1, // Periodic profiling, off phase 745 kTraceProfilingContinuous = 2, // Always profiling 746 kTraceProfilingPeriodicOn = 3 // Periodic profiling, on phase 747 }; 748 749 /* 750 * Exiting the compiled code w/o chaining will incur overhead to look up the 751 * target in the code cache which is extra work only when JIT is enabled. So 752 * we want to monitor it closely to make sure we don't have performance bugs. 753 */ 754 enum NoChainExits { 755 kInlineCacheMiss = 0, 756 kCallsiteInterpreted, 757 kSwitchOverflow, 758 kHeavyweightMonitor, 759 kNoChainExitLast, 760 }; 761 762 /* 763 * JIT-specific global state 764 */ 765 struct DvmJitGlobals { 766 /* 767 * Guards writes to Dalvik PC (dPC), translated code address (codeAddr) and 768 * chain fields within the JIT hash table. Note carefully the access 769 * mechanism. 770 * Only writes are guarded, and the guarded fields must be updated in a 771 * specific order using atomic operations. Further, once a field is 772 * written it cannot be changed without halting all threads. 773 * 774 * The write order is: 775 * 1) codeAddr 776 * 2) dPC 777 * 3) chain [if necessary] 778 * 779 * This mutex also guards both read and write of curJitTableEntries. 780 */ 781 pthread_mutex_t tableLock; 782 783 /* The JIT hash table. Note that for access speed, copies of this pointer 784 * are stored in each thread. */ 785 struct JitEntry *pJitEntryTable; 786 787 /* Array of compilation trigger threshold counters */ 788 unsigned char *pProfTable; 789 790 /* Trace profiling counters */ 791 struct JitTraceProfCounters *pJitTraceProfCounters; 792 793 /* Copy of pProfTable used for temporarily disabling the Jit */ 794 unsigned char *pProfTableCopy; 795 796 /* Size of JIT hash table in entries. Must be a power of 2 */ 797 unsigned int jitTableSize; 798 799 /* Mask used in hash function for JitTable. Should be jitTableSize-1 */ 800 unsigned int jitTableMask; 801 802 /* How many entries in the JitEntryTable are in use */ 803 unsigned int jitTableEntriesUsed; 804 805 /* Bytes allocated for the code cache */ 806 unsigned int codeCacheSize; 807 808 /* Trigger for trace selection */ 809 unsigned short threshold; 810 811 /* JIT Compiler Control */ 812 bool haltCompilerThread; 813 bool blockingMode; 814 bool methodTraceSupport; 815 bool genSuspendPoll; 816 Thread* compilerThread; 817 pthread_t compilerHandle; 818 pthread_mutex_t compilerLock; 819 pthread_mutex_t compilerICPatchLock; 820 pthread_cond_t compilerQueueActivity; 821 pthread_cond_t compilerQueueEmpty; 822 volatile int compilerQueueLength; 823 int compilerHighWater; 824 int compilerWorkEnqueueIndex; 825 int compilerWorkDequeueIndex; 826 int compilerICPatchIndex; 827 828 /* JIT internal stats */ 829 int compilerMaxQueued; 830 int translationChains; 831 832 /* Compiled code cache */ 833 void* codeCache; 834 835 /* 836 * This is used to store the base address of an in-flight compilation whose 837 * class object pointers have been calculated to populate literal pool. 838 * Once the compiler thread has changed its status to VM_WAIT, we cannot 839 * guarantee whether GC has happened before the code address has been 840 * installed to the JIT table. Because of that, this field can only 841 * been cleared/overwritten by the compiler thread if it is in the 842 * THREAD_RUNNING state or in a safe point. 843 */ 844 void *inflightBaseAddr; 845 846 /* Translation cache version (protected by compilerLock */ 847 int cacheVersion; 848 849 /* Bytes used by the code templates */ 850 unsigned int templateSize; 851 852 /* Bytes already used in the code cache */ 853 unsigned int codeCacheByteUsed; 854 855 /* Number of installed compilations in the cache */ 856 unsigned int numCompilations; 857 858 /* Flag to indicate that the code cache is full */ 859 bool codeCacheFull; 860 861 /* Page size - 1 */ 862 unsigned int pageSizeMask; 863 864 /* Lock to change the protection type of the code cache */ 865 pthread_mutex_t codeCacheProtectionLock; 866 867 /* Number of times that the code cache has been reset */ 868 int numCodeCacheReset; 869 870 /* Number of times that the code cache reset request has been delayed */ 871 int numCodeCacheResetDelayed; 872 873 /* true/false: compile/reject opcodes specified in the -Xjitop list */ 874 bool includeSelectedOp; 875 876 /* true/false: compile/reject methods specified in the -Xjitmethod list */ 877 bool includeSelectedMethod; 878 879 /* true/false: compile/reject traces with offset specified in the -Xjitoffset list */ 880 bool includeSelectedOffset; 881 882 /* Disable JIT for selected opcodes - one bit for each opcode */ 883 char opList[(kNumPackedOpcodes+7)/8]; 884 885 /* Disable JIT for selected methods */ 886 HashTable *methodTable; 887 888 /* Disable JIT for selected classes */ 889 HashTable *classTable; 890 891 /* Disable JIT for selected offsets */ 892 unsigned int pcTable[COMPILER_PC_OFFSET_SIZE]; 893 int num_entries_pcTable; 894 895 /* Flag to dump all compiled code */ 896 bool printMe; 897 898 /* Flag to dump compiled binary code in bytes */ 899 bool printBinary; 900 901 /* Per-process debug flag toggled when receiving a SIGUSR2 */ 902 bool receivedSIGUSR2; 903 904 /* Trace profiling mode */ 905 TraceProfilingModes profileMode; 906 907 /* Periodic trace profiling countdown timer */ 908 int profileCountdown; 909 910 /* Vector to disable selected optimizations */ 911 int disableOpt; 912 913 /* Table to track the overall and trace statistics of hot methods */ 914 HashTable* methodStatsTable; 915 916 /* Filter method compilation blacklist with call-graph information */ 917 bool checkCallGraph; 918 919 /* New translation chain has been set up */ 920 volatile bool hasNewChain; 921 922 #if defined(WITH_SELF_VERIFICATION) 923 /* Spin when error is detected, volatile so GDB can reset it */ 924 volatile bool selfVerificationSpin; 925 #endif 926 927 /* Framework or stand-alone? */ 928 bool runningInAndroidFramework; 929 930 /* Framework callback happened? */ 931 bool alreadyEnabledViaFramework; 932 933 /* Framework requests to disable the JIT for good */ 934 bool disableJit; 935 936 #if defined(SIGNATURE_BREAKPOINT) 937 /* Signature breakpoint */ 938 u4 signatureBreakpointSize; // # of words 939 u4 *signatureBreakpoint; // Signature content 940 #endif 941 942 #if defined(WITH_JIT_TUNING) 943 /* Performance tuning counters */ 944 int addrLookupsFound; 945 int addrLookupsNotFound; 946 int noChainExit[kNoChainExitLast]; 947 int normalExit; 948 int puntExit; 949 int invokeMonomorphic; 950 int invokePolymorphic; 951 int invokeNative; 952 int invokeMonoGetterInlined; 953 int invokeMonoSetterInlined; 954 int invokePolyGetterInlined; 955 int invokePolySetterInlined; 956 int returnOp; 957 int icPatchInit; 958 int icPatchLockFree; 959 int icPatchQueued; 960 int icPatchRejected; 961 int icPatchDropped; 962 int codeCachePatches; 963 int numCompilerThreadBlockGC; 964 u8 jitTime; 965 u8 compilerThreadBlockGCStart; 966 u8 compilerThreadBlockGCTime; 967 u8 maxCompilerThreadBlockGCTime; 968 #endif 969 970 #if defined(ARCH_IA32) 971 JitOptLevel optLevel; 972 #endif 973 974 /* Place arrays at the end to ease the display in gdb sessions */ 975 976 /* Work order queue for compilations */ 977 CompilerWorkOrder compilerWorkQueue[COMPILER_WORK_QUEUE_SIZE]; 978 979 /* Work order queue for predicted chain patching */ 980 ICPatchWorkOrder compilerICPatchQueue[COMPILER_IC_PATCH_QUEUE_SIZE]; 981 }; 982 983 extern struct DvmJitGlobals gDvmJit; 984 985 #if defined(WITH_JIT_TUNING) 986 extern int gDvmICHitCount; 987 #endif 988 989 #endif 990 991 struct DvmJniGlobals { 992 bool useCheckJni; 993 bool warnOnly; 994 bool forceCopy; 995 996 // Provide backwards compatibility for pre-ICS apps on ICS. 997 bool workAroundAppJniBugs; 998 999 // Debugging help for third-party developers. Similar to -Xjnitrace. 1000 bool logThirdPartyJni; 1001 1002 // We only support a single JavaVM per process. 1003 JavaVM* jniVm; 1004 }; 1005 1006 extern struct DvmJniGlobals gDvmJni; 1007 1008 #endif // DALVIK_GLOBALS_H_ 1009