OSDN Git Service

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