• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
30 #define _DALVIK_GLOBALS
31 
32 #include <stdarg.h>
33 #include <pthread.h>
34 
35 #define MAX_BREAKPOINTS 20      /* used for a debugger optimization */
36 
37 /* private structures */
38 typedef struct GcHeap GcHeap;
39 typedef struct BreakpointSet BreakpointSet;
40 typedef struct InlineSub InlineSub;
41 
42 /*
43  * One of these for each -ea/-da/-esa/-dsa on the command line.
44  */
45 typedef struct AssertionControl {
46     char*   pkgOrClass;         /* package/class string, or NULL for esa/dsa */
47     int     pkgOrClassLen;      /* string length, for quick compare */
48     bool    enable;             /* enable or disable */
49     bool    isPackage;          /* string ended with "..."? */
50 } AssertionControl;
51 
52 /*
53  * Execution mode, e.g. interpreter vs. JIT.
54  */
55 typedef enum ExecutionMode {
56     kExecutionModeUnknown = 0,
57     kExecutionModeInterpPortable,
58     kExecutionModeInterpFast,
59 #if defined(WITH_JIT)
60     kExecutionModeJit,
61 #endif
62 } ExecutionMode;
63 
64 /*
65  * All fields are initialized to zero.
66  *
67  * Storage allocated here must be freed by a subsystem shutdown function or
68  * from within freeGlobals().
69  */
70 struct DvmGlobals {
71     /*
72      * Some options from the command line or environment.
73      */
74     char*       bootClassPathStr;
75     char*       classPathStr;
76 
77     unsigned int    heapSizeStart;
78     unsigned int    heapSizeMax;
79     unsigned int    stackSize;
80 
81     bool        verboseGc;
82     bool        verboseJni;
83     bool        verboseClass;
84     bool        verboseShutdown;
85 
86     bool        jdwpAllowed;        // debugging allowed for this process?
87     bool        jdwpConfigured;     // has debugging info been provided?
88     int         jdwpTransport;
89     bool        jdwpServer;
90     char*       jdwpHost;
91     int         jdwpPort;
92     bool        jdwpSuspend;
93 
94     /* use wall clock as method profiler clock source? */
95     bool        profilerWallClock;
96 
97     /*
98      * Lock profiling threshold value in milliseconds.  Acquires that
99      * exceed threshold are logged.  Acquires within the threshold are
100      * logged with a probability of $\frac{time}{threshold}$ .  If the
101      * threshold is unset no additional logging occurs.
102      */
103     u4          lockProfThreshold;
104 
105     int         (*vfprintfHook)(FILE*, const char*, va_list);
106     void        (*exitHook)(int);
107     void        (*abortHook)(void);
108 
109     int         jniGrefLimit;       // 0 means no limit
110     char*       jniTrace;
111     bool        reduceSignals;
112     bool        noQuitHandler;
113     bool        verifyDexChecksum;
114     char*       stackTraceFile;     // for SIGQUIT-inspired output
115 
116     bool        logStdio;
117 
118     DexOptimizerMode    dexOptMode;
119     DexClassVerifyMode  classVerifyMode;
120 
121     bool        dexOptForSmp;
122 
123     /*
124      * GC option flags.
125      */
126     bool        preciseGc;
127     bool        preVerify;
128     bool        postVerify;
129     bool        generateRegisterMaps;
130     bool        concurrentMarkSweep;
131     bool        verifyCardTable;
132 
133     int         assertionCtrlCount;
134     AssertionControl*   assertionCtrl;
135 
136     ExecutionMode   executionMode;
137 
138     /*
139      * VM init management.
140      */
141     bool        initializing;
142     int         initExceptionCount;
143     bool        optimizing;
144 
145     /*
146      * java.lang.System properties set from the command line.
147      */
148     int         numProps;
149     int         maxProps;
150     char**      propList;
151 
152     /*
153      * Where the VM goes to find system classes.
154      */
155     ClassPathEntry* bootClassPath;
156     /* used by the DEX optimizer to load classes from an unfinished DEX */
157     DvmDex*     bootClassPathOptExtra;
158     bool        optimizingBootstrapClass;
159 
160     /*
161      * Loaded classes, hashed by class name.  Each entry is a ClassObject*,
162      * allocated in GC space.
163      */
164     HashTable*  loadedClasses;
165 
166     /*
167      * Value for the next class serial number to be assigned.  This is
168      * incremented as we load classes.  Failed loads and races may result
169      * in some numbers being skipped, and the serial number is not
170      * guaranteed to start at 1, so the current value should not be used
171      * as a count of loaded classes.
172      */
173     volatile int classSerialNumber;
174 
175     /*
176      * Classes with a low classSerialNumber are probably in the zygote, and
177      * their InitiatingLoaderList is not used, to promote sharing. The list is
178      * kept here instead.
179      */
180     InitiatingLoaderList* initiatingLoaderList;
181 
182     /*
183      * Interned strings.
184      */
185 
186     /* A mutex that guards access to the interned string tables. */
187     pthread_mutex_t internLock;
188 
189     /* Hash table of strings interned by the user. */
190     HashTable*  internedStrings;
191 
192     /* Hash table of strings interned by the class loader. */
193     HashTable*  literalStrings;
194 
195     /*
196      * Quick lookups for popular classes used internally.
197      */
198     ClassObject* classJavaLangClass;
199     ClassObject* classJavaLangClassArray;
200     ClassObject* classJavaLangError;
201     ClassObject* classJavaLangObject;
202     ClassObject* classJavaLangObjectArray;
203     ClassObject* classJavaLangRuntimeException;
204     ClassObject* classJavaLangString;
205     ClassObject* classJavaLangThread;
206     ClassObject* classJavaLangVMThread;
207     ClassObject* classJavaLangThreadGroup;
208     ClassObject* classJavaLangThrowable;
209     ClassObject* classJavaLangStackOverflowError;
210     ClassObject* classJavaLangStackTraceElement;
211     ClassObject* classJavaLangStackTraceElementArray;
212     ClassObject* classJavaLangAnnotationAnnotationArray;
213     ClassObject* classJavaLangAnnotationAnnotationArrayArray;
214     ClassObject* classJavaLangReflectAccessibleObject;
215     ClassObject* classJavaLangReflectConstructor;
216     ClassObject* classJavaLangReflectConstructorArray;
217     ClassObject* classJavaLangReflectField;
218     ClassObject* classJavaLangReflectFieldArray;
219     ClassObject* classJavaLangReflectMethod;
220     ClassObject* classJavaLangReflectMethodArray;
221     ClassObject* classJavaLangReflectProxy;
222     ClassObject* classJavaLangExceptionInInitializerError;
223     ClassObject* classJavaLangRefPhantomReference;
224     ClassObject* classJavaLangRefReference;
225     ClassObject* classJavaNioReadWriteDirectByteBuffer;
226     ClassObject* classJavaSecurityAccessController;
227     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationFactory;
228     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMember;
229     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMemberArray;
230     ClassObject* classOrgApacheHarmonyNioInternalDirectBuffer;
231     jclass      jclassOrgApacheHarmonyNioInternalDirectBuffer;
232 
233     /* synthetic classes for arrays of primitives */
234     ClassObject* classArrayBoolean;
235     ClassObject* classArrayChar;
236     ClassObject* classArrayFloat;
237     ClassObject* classArrayDouble;
238     ClassObject* classArrayByte;
239     ClassObject* classArrayShort;
240     ClassObject* classArrayInt;
241     ClassObject* classArrayLong;
242 
243     /* method offsets - Object */
244     int         voffJavaLangObject_equals;
245     int         voffJavaLangObject_hashCode;
246     int         voffJavaLangObject_toString;
247     int         voffJavaLangObject_finalize;
248 
249     /* field offsets - Class */
250     int         offJavaLangClass_pd;
251 
252     /* field offsets - String */
253     int         javaLangStringReady;    /* 0=not init, 1=ready, -1=initing */
254     int         offJavaLangString_value;
255     int         offJavaLangString_count;
256     int         offJavaLangString_offset;
257     int         offJavaLangString_hashCode;
258 
259     /* field offsets - Thread */
260     int         offJavaLangThread_vmThread;
261     int         offJavaLangThread_group;
262     int         offJavaLangThread_daemon;
263     int         offJavaLangThread_name;
264     int         offJavaLangThread_priority;
265 
266     /* method offsets - Thread */
267     int         voffJavaLangThread_run;
268 
269     /* field offsets - VMThread */
270     int         offJavaLangVMThread_thread;
271     int         offJavaLangVMThread_vmData;
272 
273     /* method offsets - ThreadGroup */
274     int         voffJavaLangThreadGroup_removeThread;
275 
276     /* field offsets - Throwable */
277     int         offJavaLangThrowable_stackState;
278     int         offJavaLangThrowable_message;
279     int         offJavaLangThrowable_cause;
280 
281     /* field offsets - java.lang.reflect.* */
282     int         offJavaLangReflectAccessibleObject_flag;
283     int         offJavaLangReflectConstructor_slot;
284     int         offJavaLangReflectConstructor_declClass;
285     int         offJavaLangReflectField_slot;
286     int         offJavaLangReflectField_declClass;
287     int         offJavaLangReflectMethod_slot;
288     int         offJavaLangReflectMethod_declClass;
289 
290     /* field offsets - java.lang.ref.Reference */
291     int         offJavaLangRefReference_referent;
292     int         offJavaLangRefReference_queue;
293     int         offJavaLangRefReference_queueNext;
294     int         offJavaLangRefReference_pendingNext;
295 
296     /* method pointers - java.lang.ref.Reference */
297     Method*     methJavaLangRefReference_enqueueInternal;
298 
299     /* field offsets - java.nio.Buffer and java.nio.DirectByteBufferImpl */
300     //int         offJavaNioBuffer_capacity;
301     //int         offJavaNioDirectByteBufferImpl_pointer;
302 
303     /* method pointers - java.security.AccessController */
304     volatile int javaSecurityAccessControllerReady;
305     Method*     methJavaSecurityAccessController_doPrivileged[4];
306 
307     /* constructor method pointers; no vtable involved, so use Method* */
308     Method*     methJavaLangStackTraceElement_init;
309     Method*     methJavaLangExceptionInInitializerError_init;
310     Method*     methJavaLangRefPhantomReference_init;
311     Method*     methJavaLangReflectConstructor_init;
312     Method*     methJavaLangReflectField_init;
313     Method*     methJavaLangReflectMethod_init;
314     Method*     methOrgApacheHarmonyLangAnnotationAnnotationMember_init;
315 
316     /* static method pointers - android.lang.annotation.* */
317     Method*
318         methOrgApacheHarmonyLangAnnotationAnnotationFactory_createAnnotation;
319 
320     /* direct method pointers - java.lang.reflect.Proxy */
321     Method*     methJavaLangReflectProxy_constructorPrototype;
322 
323     /* field offsets - java.lang.reflect.Proxy */
324     int         offJavaLangReflectProxy_h;
325 
326     /* fake native entry point method */
327     Method*     methFakeNativeEntry;
328 
329     /* assorted direct buffer helpers */
330     Method*     methJavaNioReadWriteDirectByteBuffer_init;
331     Method*     methOrgApacheHarmonyLuniPlatformPlatformAddress_on;
332     Method*     methOrgApacheHarmonyNioInternalDirectBuffer_getEffectiveAddress;
333     int         offJavaNioBuffer_capacity;
334     int         offJavaNioBuffer_effectiveDirectAddress;
335     int         offOrgApacheHarmonyLuniPlatformPlatformAddress_osaddr;
336     int         voffOrgApacheHarmonyLuniPlatformPlatformAddress_toLong;
337 
338     /*
339      * VM-synthesized primitive classes, for arrays.
340      */
341     ClassObject* volatile primitiveClass[PRIM_MAX];
342 
343     /*
344      * Thread list.  This always has at least one element in it (main),
345      * and main is always the first entry.
346      *
347      * The threadListLock is used for several things, including the thread
348      * start condition variable.  Generally speaking, you must hold the
349      * threadListLock when:
350      *  - adding/removing items from the list
351      *  - waiting on or signaling threadStartCond
352      *  - examining the Thread struct for another thread (this is to avoid
353      *    one thread freeing the Thread struct while another thread is
354      *    perusing it)
355      */
356     Thread*     threadList;
357     pthread_mutex_t threadListLock;
358 
359     pthread_cond_t threadStartCond;
360 
361     /*
362      * The thread code grabs this before suspending all threads.  There
363      * are a few things that can cause a "suspend all":
364      *  (1) the GC is starting;
365      *  (2) the debugger has sent a "suspend all" request;
366      *  (3) a thread has hit a breakpoint or exception that the debugger
367      *      has marked as a "suspend all" event;
368      *  (4) the SignalCatcher caught a signal that requires suspension.
369      *  (5) (if implemented) the JIT needs to perform a heavyweight
370      *      rearrangement of the translation cache or JitTable.
371      *
372      * Because we use "safe point" self-suspension, it is never safe to
373      * do a blocking "lock" call on this mutex -- if it has been acquired,
374      * somebody is probably trying to put you to sleep.  The leading '_' is
375      * intended as a reminder that this lock is special.
376      */
377     pthread_mutex_t _threadSuspendLock;
378 
379     /*
380      * Guards Thread->suspendCount for all threads, and provides the lock
381      * for the condition variable that all suspended threads sleep on
382      * (threadSuspendCountCond).
383      *
384      * This has to be separate from threadListLock because of the way
385      * threads put themselves to sleep.
386      */
387     pthread_mutex_t threadSuspendCountLock;
388 
389     /*
390      * Suspended threads sleep on this.  They should sleep on the condition
391      * variable until their "suspend count" is zero.
392      *
393      * Paired with "threadSuspendCountLock".
394      */
395     pthread_cond_t  threadSuspendCountCond;
396 
397     /*
398      * Sum of all threads' suspendCount fields.  The JIT needs to know if any
399      * thread is suspended.  Guarded by threadSuspendCountLock.
400      */
401     int  sumThreadSuspendCount;
402 
403     /*
404      * MUTEX ORDERING: when locking multiple mutexes, always grab them in
405      * this order to avoid deadlock:
406      *
407      *  (1) _threadSuspendLock      (use lockThreadSuspend())
408      *  (2) threadListLock          (use dvmLockThreadList())
409      *  (3) threadSuspendCountLock  (use lockThreadSuspendCount())
410      */
411 
412 
413     /*
414      * Thread ID bitmap.  We want threads to have small integer IDs so
415      * we can use them in "thin locks".
416      */
417     BitVector*  threadIdMap;
418 
419     /*
420      * Manage exit conditions.  The VM exits when all non-daemon threads
421      * have exited.  If the main thread returns early, we need to sleep
422      * on a condition variable.
423      */
424     int         nonDaemonThreadCount;   /* must hold threadListLock to access */
425     //pthread_mutex_t vmExitLock;
426     pthread_cond_t  vmExitCond;
427 
428     /*
429      * The set of DEX files loaded by custom class loaders.
430      */
431     HashTable*  userDexFiles;
432 
433     /*
434      * JNI global reference table.
435      */
436 #ifdef USE_INDIRECT_REF
437     IndirectRefTable jniGlobalRefTable;
438 #else
439     ReferenceTable  jniGlobalRefTable;
440 #endif
441     pthread_mutex_t jniGlobalRefLock;
442     int         jniGlobalRefHiMark;
443     int         jniGlobalRefLoMark;
444 
445     /*
446      * JNI pinned object table (used for primitive arrays).
447      */
448     ReferenceTable  jniPinRefTable;
449     pthread_mutex_t jniPinRefLock;
450 
451     /*
452      * Native shared library table.
453      */
454     HashTable*  nativeLibs;
455 
456     /*
457      * GC heap lock.  Functions like gcMalloc() acquire this before making
458      * any changes to the heap.  It is held throughout garbage collection.
459      */
460     pthread_mutex_t gcHeapLock;
461 
462     /*
463      * Condition variable to queue threads waiting to retry an
464      * allocation.  Signaled after a concurrent GC is completed.
465      */
466     pthread_cond_t gcHeapCond;
467 
468     /* Opaque pointer representing the heap. */
469     GcHeap*     gcHeap;
470 
471     /* The card table base, modified as needed for marking cards. */
472     u1*         biasedCardTableBase;
473 
474     /*
475      * Pre-allocated throwables.
476      */
477     Object*     outOfMemoryObj;
478     Object*     internalErrorObj;
479     Object*     noClassDefFoundErrorObj;
480 
481     /* Monitor list, so we can free them */
482     /*volatile*/ Monitor* monitorList;
483 
484     /* Monitor for Thread.sleep() implementation */
485     Monitor*    threadSleepMon;
486 
487     /* set when we create a second heap inside the zygote */
488     bool        newZygoteHeapAllocated;
489 
490     /*
491      * TLS keys.
492      */
493     pthread_key_t pthreadKeySelf;       /* Thread*, for dvmThreadSelf */
494 
495     /*
496      * JNI allows you to have multiple VMs, but we limit ourselves to 1,
497      * so "vmList" is really just a pointer to the one and only VM.
498      */
499     JavaVM*     vmList;
500 
501     /*
502      * Cache results of "A instanceof B".
503      */
504     AtomicCache* instanceofCache;
505 
506     /* instruction width table, used for optimization and verification */
507     InstructionWidth*   instrWidth;
508     /* instruction flags table, used for verification */
509     InstructionFlags*   instrFlags;
510     /* instruction format table, used for verification */
511     InstructionFormat*  instrFormat;
512 
513     /* inline substitution table, used during optimization */
514     InlineSub*          inlineSubs;
515 
516     /*
517      * Bootstrap class loader linear allocator.
518      */
519     LinearAllocHdr* pBootLoaderAlloc;
520 
521 
522     /*
523      * Heap worker thread.
524      */
525     bool            heapWorkerInitialized;
526     bool            heapWorkerReady;
527     bool            haltHeapWorker;
528     pthread_t       heapWorkerHandle;
529     pthread_mutex_t heapWorkerLock;
530     pthread_cond_t  heapWorkerCond;
531     pthread_cond_t  heapWorkerIdleCond;
532     pthread_mutex_t heapWorkerListLock;
533 
534     /*
535      * Compute some stats on loaded classes.
536      */
537     int         numLoadedClasses;
538     int         numDeclaredMethods;
539     int         numDeclaredInstFields;
540     int         numDeclaredStaticFields;
541 
542     /* when using a native debugger, set this to suppress watchdog timers */
543     bool        nativeDebuggerActive;
544 
545     /*
546      * JDWP debugger support.
547      *
548      * Note "debuggerActive" is accessed from mterp, so its storage size and
549      * meaning must not be changed without updating the assembly sources.
550      */
551     bool        debuggerConnected;      /* debugger or DDMS is connected */
552     u1          debuggerActive;         /* debugger is making requests */
553     JdwpState*  jdwpState;
554 
555     /*
556      * Registry of objects known to the debugger.
557      */
558     HashTable*  dbgRegistry;
559 
560     /*
561      * Debugger breakpoint table.
562      */
563     BreakpointSet*  breakpointSet;
564 
565     /*
566      * Single-step control struct.  We currently only allow one thread to
567      * be single-stepping at a time, which is all that really makes sense,
568      * but it's possible we may need to expand this to be per-thread.
569      */
570     StepControl stepControl;
571 
572     /*
573      * DDM features embedded in the VM.
574      */
575     bool        ddmThreadNotification;
576 
577     /*
578      * Zygote (partially-started process) support
579      */
580     bool        zygote;
581 
582     /*
583      * Used for tracking allocations that we report to DDMS.  When the feature
584      * is enabled (through a DDMS request) the "allocRecords" pointer becomes
585      * non-NULL.
586      */
587     pthread_mutex_t allocTrackerLock;
588     AllocRecord*    allocRecords;
589     int             allocRecordHead;        /* most-recently-added entry */
590     int             allocRecordCount;       /* #of valid entries */
591 
592 #ifdef WITH_ALLOC_LIMITS
593     /* set on first use of an alloc limit, never cleared */
594     bool        checkAllocLimits;
595     /* allocation limit, for setGlobalAllocationLimit() regression testing */
596     int         allocationLimit;
597 #endif
598 
599 #ifdef WITH_DEADLOCK_PREDICTION
600     /* global lock on history tree accesses */
601     pthread_mutex_t deadlockHistoryLock;
602 
603     enum { kDPOff=0, kDPWarn, kDPErr, kDPAbort } deadlockPredictMode;
604 #endif
605 
606     /*
607      * When a profiler is enabled, this is incremented.  Distinct profilers
608      * include "dmtrace" method tracing, emulator method tracing, and
609      * possibly instruction counting.
610      *
611      * The purpose of this is to have a single value that the interpreter
612      * can check to see if any profiling activity is enabled.
613      */
614     volatile int activeProfilers;
615 
616     /*
617      * State for method-trace profiling.
618      */
619     MethodTraceState methodTrace;
620 
621     /*
622      * State for emulator tracing.
623      */
624     void*       emulatorTracePage;
625     int         emulatorTraceEnableCount;
626 
627     /*
628      * Global state for memory allocation profiling.
629      */
630     AllocProfState allocProf;
631 
632     /*
633      * Pointers to the original methods for things that have been inlined.
634      * This makes it easy for us to output method entry/exit records for
635      * the method calls we're not actually making.  (Used by method
636      * profiling.)
637      */
638     Method**    inlinedMethods;
639 
640     /*
641      * Dalvik instruction counts (256 entries).
642      */
643     int*        executedInstrCounts;
644     bool        instructionCountEnableCount;
645 
646     /*
647      * Signal catcher thread (for SIGQUIT).
648      */
649     pthread_t   signalCatcherHandle;
650     bool        haltSignalCatcher;
651 
652     /*
653      * Stdout/stderr conversion thread.
654      */
655     bool            haltStdioConverter;
656     bool            stdioConverterReady;
657     pthread_t       stdioConverterHandle;
658     pthread_mutex_t stdioConverterLock;
659     pthread_cond_t  stdioConverterCond;
660 
661     /*
662      * pid of the system_server process. We track it so that when system server
663      * crashes the Zygote process will be killed and restarted.
664      */
665     pid_t systemServerPid;
666 
667     int kernelGroupScheduling;
668 
669 //#define COUNT_PRECISE_METHODS
670 #ifdef COUNT_PRECISE_METHODS
671     PointerSet* preciseMethods;
672 #endif
673 
674     /* some RegisterMap statistics, useful during development */
675     void*       registerMapStats;
676 };
677 
678 extern struct DvmGlobals gDvm;
679 
680 #if defined(WITH_JIT)
681 
682 /*
683  * Exiting the compiled code w/o chaining will incur overhead to look up the
684  * target in the code cache which is extra work only when JIT is enabled. So
685  * we want to monitor it closely to make sure we don't have performance bugs.
686  */
687 typedef enum NoChainExits {
688     kInlineCacheMiss = 0,
689     kCallsiteInterpreted,
690     kSwitchOverflow,
691     kHeavyweightMonitor,
692     kNoChainExitLast,
693 } NoChainExits;
694 
695 /*
696  * JIT-specific global state
697  */
698 struct DvmJitGlobals {
699     /*
700      * Guards writes to Dalvik PC (dPC), translated code address (codeAddr) and
701      * chain fields within the JIT hash table.  Note carefully the access
702      * mechanism.
703      * Only writes are guarded, and the guarded fields must be updated in a
704      * specific order using atomic operations.  Further, once a field is
705      * written it cannot be changed without halting all threads.
706      *
707      * The write order is:
708      *    1) codeAddr
709      *    2) dPC
710      *    3) chain [if necessary]
711      *
712      * This mutex also guards both read and write of curJitTableEntries.
713      */
714     pthread_mutex_t tableLock;
715 
716     /* The JIT hash table.  Note that for access speed, copies of this pointer
717      * are stored in each thread. */
718     struct JitEntry *pJitEntryTable;
719 
720     /* Array of profile threshold counters */
721     unsigned char *pProfTable;
722 
723     /* Copy of pProfTable used for temporarily disabling the Jit */
724     unsigned char *pProfTableCopy;
725 
726     /* Size of JIT hash table in entries.  Must be a power of 2 */
727     unsigned int jitTableSize;
728 
729     /* Mask used in hash function for JitTable.  Should be jitTableSize-1 */
730     unsigned int jitTableMask;
731 
732     /* How many entries in the JitEntryTable are in use */
733     unsigned int jitTableEntriesUsed;
734 
735     /* Bytes allocated for the code cache */
736     unsigned int codeCacheSize;
737 
738     /* Trigger for trace selection */
739     unsigned short threshold;
740 
741     /* JIT Compiler Control */
742     bool               haltCompilerThread;
743     bool               blockingMode;
744     pthread_t          compilerHandle;
745     pthread_mutex_t    compilerLock;
746     pthread_mutex_t    compilerICPatchLock;
747     pthread_cond_t     compilerQueueActivity;
748     pthread_cond_t     compilerQueueEmpty;
749     volatile int       compilerQueueLength;
750     int                compilerHighWater;
751     int                compilerWorkEnqueueIndex;
752     int                compilerWorkDequeueIndex;
753     int                compilerICPatchIndex;
754 
755     /* JIT internal stats */
756     int                compilerMaxQueued;
757     int                translationChains;
758 
759     /* Compiled code cache */
760     void* codeCache;
761 
762     /* Bytes used by the code templates */
763     unsigned int templateSize;
764 
765     /* Bytes already used in the code cache */
766     unsigned int codeCacheByteUsed;
767 
768     /* Number of installed compilations in the cache */
769     unsigned int numCompilations;
770 
771     /* Flag to indicate that the code cache is full */
772     bool codeCacheFull;
773 
774     /* Page size  - 1 */
775     unsigned int pageSizeMask;
776 
777     /* Lock to change the protection type of the code cache */
778     pthread_mutex_t    codeCacheProtectionLock;
779 
780     /* Number of times that the code cache has been reset */
781     int numCodeCacheReset;
782 
783     /* Number of times that the code cache reset request has been delayed */
784     int numCodeCacheResetDelayed;
785 
786     /* true/false: compile/reject opcodes specified in the -Xjitop list */
787     bool includeSelectedOp;
788 
789     /* true/false: compile/reject methods specified in the -Xjitmethod list */
790     bool includeSelectedMethod;
791 
792     /* Disable JIT for selected opcodes - one bit for each opcode */
793     char opList[32];
794 
795     /* Disable JIT for selected methods */
796     HashTable *methodTable;
797 
798     /* Flag to dump all compiled code */
799     bool printMe;
800 
801     /* Flag to count trace execution */
802     bool profile;
803 
804     /* Vector to disable selected optimizations */
805     int disableOpt;
806 
807     /* Table to track the overall and trace statistics of hot methods */
808     HashTable*  methodStatsTable;
809 
810     /* Filter method compilation blacklist with call-graph information */
811     bool checkCallGraph;
812 
813     /* New translation chain has been set up */
814     volatile bool hasNewChain;
815 
816 #if defined(WITH_SELF_VERIFICATION)
817     /* Spin when error is detected, volatile so GDB can reset it */
818     volatile bool selfVerificationSpin;
819 #endif
820 
821     /* Framework or stand-alone? */
822     bool runningInAndroidFramework;
823 
824     /* Framework callback happened? */
825     bool alreadyEnabledViaFramework;
826 
827     /* Framework requests to disable the JIT for good */
828     bool disableJit;
829 
830 #if defined(SIGNATURE_BREAKPOINT)
831     /* Signature breakpoint */
832     u4 signatureBreakpointSize;         // # of words
833     u4 *signatureBreakpoint;            // Signature content
834 #endif
835 
836 #if defined(WITH_JIT_TUNING)
837     /* Performance tuning counters */
838     int                addrLookupsFound;
839     int                addrLookupsNotFound;
840     int                noChainExit[kNoChainExitLast];
841     int                normalExit;
842     int                puntExit;
843     int                invokeMonomorphic;
844     int                invokePolymorphic;
845     int                invokeNative;
846     int                invokeMonoGetterInlined;
847     int                invokeMonoSetterInlined;
848     int                invokePolyGetterInlined;
849     int                invokePolySetterInlined;
850     int                returnOp;
851     int                icPatchInit;
852     int                icPatchLockFree;
853     int                icPatchQueued;
854     int                icPatchRejected;
855     int                icPatchDropped;
856     u8                 jitTime;
857     int                codeCachePatches;
858 #endif
859 
860     /* Place arrays at the end to ease the display in gdb sessions */
861 
862     /* Work order queue for compilations */
863     CompilerWorkOrder compilerWorkQueue[COMPILER_WORK_QUEUE_SIZE];
864 
865     /* Work order queue for predicted chain patching */
866     ICPatchWorkOrder compilerICPatchQueue[COMPILER_IC_PATCH_QUEUE_SIZE];
867 };
868 
869 extern struct DvmJitGlobals gDvmJit;
870 
871 #if defined(WITH_JIT_TUNING)
872 extern int gDvmICHitCount;
873 #endif
874 
875 #endif
876 
877 #endif /*_DALVIK_GLOBALS*/
878