OSDN Git Service

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