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