• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 #ifndef ART_RUNTIME_THREAD_H_
18 #define ART_RUNTIME_THREAD_H_
19 
20 #include <bitset>
21 #include <deque>
22 #include <iosfwd>
23 #include <list>
24 #include <memory>
25 #include <setjmp.h>
26 #include <string>
27 
28 #include "arch/context.h"
29 #include "arch/instruction_set.h"
30 #include "atomic.h"
31 #include "base/macros.h"
32 #include "base/mutex.h"
33 #include "entrypoints/jni/jni_entrypoints.h"
34 #include "entrypoints/quick/quick_entrypoints.h"
35 #include "globals.h"
36 #include "handle_scope.h"
37 #include "instrumentation.h"
38 #include "jvalue.h"
39 #include "object_callbacks.h"
40 #include "offsets.h"
41 #include "runtime_stats.h"
42 #include "stack.h"
43 #include "thread_state.h"
44 
45 class BacktraceMap;
46 
47 namespace art {
48 
49 namespace gc {
50 namespace accounting {
51   template<class T> class AtomicStack;
52 }  // namespace accounting
53 namespace collector {
54   class SemiSpace;
55 }  // namespace collector
56 }  // namespace gc
57 
58 namespace mirror {
59   class Array;
60   class Class;
61   class ClassLoader;
62   class Object;
63   template<class T> class ObjectArray;
64   template<class T> class PrimitiveArray;
65   typedef PrimitiveArray<int32_t> IntArray;
66   class StackTraceElement;
67   class String;
68   class Throwable;
69 }  // namespace mirror
70 
71 namespace verifier {
72 class MethodVerifier;
73 }  // namespace verifier
74 
75 class ArtMethod;
76 class BaseMutex;
77 class ClassLinker;
78 class Closure;
79 class Context;
80 struct DebugInvokeReq;
81 class DeoptimizationContextRecord;
82 class DexFile;
83 class FrameIdToShadowFrame;
84 class JavaVMExt;
85 struct JNIEnvExt;
86 class Monitor;
87 class Runtime;
88 class ScopedObjectAccessAlreadyRunnable;
89 class ShadowFrame;
90 class SingleStepControl;
91 class StackedShadowFrameRecord;
92 class Thread;
93 class ThreadList;
94 
95 // Thread priorities. These must match the Thread.MIN_PRIORITY,
96 // Thread.NORM_PRIORITY, and Thread.MAX_PRIORITY constants.
97 enum ThreadPriority {
98   kMinThreadPriority = 1,
99   kNormThreadPriority = 5,
100   kMaxThreadPriority = 10,
101 };
102 
103 enum ThreadFlag {
104   kSuspendRequest   = 1,  // If set implies that suspend_count_ > 0 and the Thread should enter the
105                           // safepoint handler.
106   kCheckpointRequest = 2,  // Request that the thread do some checkpoint work and then continue.
107   kActiveSuspendBarrier = 4  // Register that at least 1 suspend barrier needs to be passed.
108 };
109 
110 enum class StackedShadowFrameType {
111   kShadowFrameUnderConstruction,
112   kDeoptimizationShadowFrame,
113   kSingleFrameDeoptimizationShadowFrame
114 };
115 
116 // This should match RosAlloc::kNumThreadLocalSizeBrackets.
117 static constexpr size_t kNumRosAllocThreadLocalSizeBracketsInThread = 16;
118 
119 // Thread's stack layout for implicit stack overflow checks:
120 //
121 //   +---------------------+  <- highest address of stack memory
122 //   |                     |
123 //   .                     .  <- SP
124 //   |                     |
125 //   |                     |
126 //   +---------------------+  <- stack_end
127 //   |                     |
128 //   |  Gap                |
129 //   |                     |
130 //   +---------------------+  <- stack_begin
131 //   |                     |
132 //   | Protected region    |
133 //   |                     |
134 //   +---------------------+  <- lowest address of stack memory
135 //
136 // The stack always grows down in memory.  At the lowest address is a region of memory
137 // that is set mprotect(PROT_NONE).  Any attempt to read/write to this region will
138 // result in a segmentation fault signal.  At any point, the thread's SP will be somewhere
139 // between the stack_end and the highest address in stack memory.  An implicit stack
140 // overflow check is a read of memory at a certain offset below the current SP (4K typically).
141 // If the thread's SP is below the stack_end address this will be a read into the protected
142 // region.  If the SP is above the stack_end address, the thread is guaranteed to have
143 // at least 4K of space.  Because stack overflow checks are only performed in generated code,
144 // if the thread makes a call out to a native function (through JNI), that native function
145 // might only have 4K of memory (if the SP is adjacent to stack_end).
146 
147 class Thread {
148  public:
149   static const size_t kStackOverflowImplicitCheckSize;
150 
151   // Creates a new native thread corresponding to the given managed peer.
152   // Used to implement Thread.start.
153   static void CreateNativeThread(JNIEnv* env, jobject peer, size_t stack_size, bool daemon);
154 
155   // Attaches the calling native thread to the runtime, returning the new native peer.
156   // Used to implement JNI AttachCurrentThread and AttachCurrentThreadAsDaemon calls.
157   static Thread* Attach(const char* thread_name, bool as_daemon, jobject thread_group,
158                         bool create_peer);
159 
160   // Reset internal state of child thread after fork.
161   void InitAfterFork();
162 
163   // Get the currently executing thread, frequently referred to as 'self'. This call has reasonably
164   // high cost and so we favor passing self around when possible.
165   // TODO: mark as PURE so the compiler may coalesce and remove?
166   static Thread* Current();
167 
168   // On a runnable thread, check for pending thread suspension request and handle if pending.
169   void AllowThreadSuspension() SHARED_REQUIRES(Locks::mutator_lock_);
170 
171   // Process pending thread suspension request and handle if pending.
172   void CheckSuspend() SHARED_REQUIRES(Locks::mutator_lock_);
173 
174   static Thread* FromManagedThread(const ScopedObjectAccessAlreadyRunnable& ts,
175                                    mirror::Object* thread_peer)
176       REQUIRES(Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_)
177       SHARED_REQUIRES(Locks::mutator_lock_);
178   static Thread* FromManagedThread(const ScopedObjectAccessAlreadyRunnable& ts, jobject thread)
179       REQUIRES(Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_)
180       SHARED_REQUIRES(Locks::mutator_lock_);
181 
182   // Translates 172 to pAllocArrayFromCode and so on.
183   template<size_t size_of_pointers>
184   static void DumpThreadOffset(std::ostream& os, uint32_t offset);
185 
186   // Dumps a one-line summary of thread state (used for operator<<).
187   void ShortDump(std::ostream& os) const;
188 
189   // Dumps the detailed thread state and the thread stack (used for SIGQUIT).
190   void Dump(std::ostream& os,
191             bool dump_native_stack = true,
192             BacktraceMap* backtrace_map = nullptr) const
193       REQUIRES(!Locks::thread_suspend_count_lock_)
194       SHARED_REQUIRES(Locks::mutator_lock_);
195 
196   void DumpJavaStack(std::ostream& os) const
197       REQUIRES(!Locks::thread_suspend_count_lock_)
198       SHARED_REQUIRES(Locks::mutator_lock_);
199 
200   // Dumps the SIGQUIT per-thread header. 'thread' can be null for a non-attached thread, in which
201   // case we use 'tid' to identify the thread, and we'll include as much information as we can.
202   static void DumpState(std::ostream& os, const Thread* thread, pid_t tid)
203       REQUIRES(!Locks::thread_suspend_count_lock_)
204       SHARED_REQUIRES(Locks::mutator_lock_);
205 
GetState()206   ThreadState GetState() const {
207     DCHECK_GE(tls32_.state_and_flags.as_struct.state, kTerminated);
208     DCHECK_LE(tls32_.state_and_flags.as_struct.state, kSuspended);
209     return static_cast<ThreadState>(tls32_.state_and_flags.as_struct.state);
210   }
211 
212   ThreadState SetState(ThreadState new_state);
213 
GetSuspendCount()214   int GetSuspendCount() const REQUIRES(Locks::thread_suspend_count_lock_) {
215     return tls32_.suspend_count;
216   }
217 
GetDebugSuspendCount()218   int GetDebugSuspendCount() const REQUIRES(Locks::thread_suspend_count_lock_) {
219     return tls32_.debug_suspend_count;
220   }
221 
IsSuspended()222   bool IsSuspended() const {
223     union StateAndFlags state_and_flags;
224     state_and_flags.as_int = tls32_.state_and_flags.as_int;
225     return state_and_flags.as_struct.state != kRunnable &&
226         (state_and_flags.as_struct.flags & kSuspendRequest) != 0;
227   }
228 
229   bool ModifySuspendCount(Thread* self, int delta, AtomicInteger* suspend_barrier, bool for_debugger)
230       REQUIRES(Locks::thread_suspend_count_lock_);
231 
232   bool RequestCheckpoint(Closure* function)
233       REQUIRES(Locks::thread_suspend_count_lock_);
234 
235   void SetFlipFunction(Closure* function);
236   Closure* GetFlipFunction();
237 
GetThreadLocalMarkStack()238   gc::accounting::AtomicStack<mirror::Object>* GetThreadLocalMarkStack() {
239     CHECK(kUseReadBarrier);
240     return tlsPtr_.thread_local_mark_stack;
241   }
SetThreadLocalMarkStack(gc::accounting::AtomicStack<mirror::Object> * stack)242   void SetThreadLocalMarkStack(gc::accounting::AtomicStack<mirror::Object>* stack) {
243     CHECK(kUseReadBarrier);
244     tlsPtr_.thread_local_mark_stack = stack;
245   }
246 
247   // Called when thread detected that the thread_suspend_count_ was non-zero. Gives up share of
248   // mutator_lock_ and waits until it is resumed and thread_suspend_count_ is zero.
249   void FullSuspendCheck()
250       REQUIRES(!Locks::thread_suspend_count_lock_)
251       SHARED_REQUIRES(Locks::mutator_lock_);
252 
253   // Transition from non-runnable to runnable state acquiring share on mutator_lock_.
254   ALWAYS_INLINE ThreadState TransitionFromSuspendedToRunnable()
255       REQUIRES(!Locks::thread_suspend_count_lock_)
256       SHARED_LOCK_FUNCTION(Locks::mutator_lock_);
257 
258   // Transition from runnable into a state where mutator privileges are denied. Releases share of
259   // mutator lock.
260   ALWAYS_INLINE void TransitionFromRunnableToSuspended(ThreadState new_state)
261       REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_)
262       UNLOCK_FUNCTION(Locks::mutator_lock_);
263 
264   // Once called thread suspension will cause an assertion failure.
StartAssertNoThreadSuspension(const char * cause)265   const char* StartAssertNoThreadSuspension(const char* cause) ACQUIRE(Roles::uninterruptible_) {
266     Roles::uninterruptible_.Acquire();  // No-op.
267     if (kIsDebugBuild) {
268       CHECK(cause != nullptr);
269       const char* previous_cause = tlsPtr_.last_no_thread_suspension_cause;
270       tls32_.no_thread_suspension++;
271       tlsPtr_.last_no_thread_suspension_cause = cause;
272       return previous_cause;
273     } else {
274       return nullptr;
275     }
276   }
277 
278   // End region where no thread suspension is expected.
EndAssertNoThreadSuspension(const char * old_cause)279   void EndAssertNoThreadSuspension(const char* old_cause) RELEASE(Roles::uninterruptible_) {
280     if (kIsDebugBuild) {
281       CHECK(old_cause != nullptr || tls32_.no_thread_suspension == 1);
282       CHECK_GT(tls32_.no_thread_suspension, 0U);
283       tls32_.no_thread_suspension--;
284       tlsPtr_.last_no_thread_suspension_cause = old_cause;
285     }
286     Roles::uninterruptible_.Release();  // No-op.
287   }
288 
289   void AssertThreadSuspensionIsAllowable(bool check_locks = true) const;
290 
IsDaemon()291   bool IsDaemon() const {
292     return tls32_.daemon;
293   }
294 
295   size_t NumberOfHeldMutexes() const;
296 
297   bool HoldsLock(mirror::Object*) const SHARED_REQUIRES(Locks::mutator_lock_);
298 
299   /*
300    * Changes the priority of this thread to match that of the java.lang.Thread object.
301    *
302    * We map a priority value from 1-10 to Linux "nice" values, where lower
303    * numbers indicate higher priority.
304    */
305   void SetNativePriority(int newPriority);
306 
307   /*
308    * Returns the thread priority for the current thread by querying the system.
309    * This is useful when attaching a thread through JNI.
310    *
311    * Returns a value from 1 to 10 (compatible with java.lang.Thread values).
312    */
313   static int GetNativePriority();
314 
315   // Guaranteed to be non-zero.
GetThreadId()316   uint32_t GetThreadId() const {
317     return tls32_.thin_lock_thread_id;
318   }
319 
GetTid()320   pid_t GetTid() const {
321     return tls32_.tid;
322   }
323 
324   // Returns the java.lang.Thread's name, or null if this Thread* doesn't have a peer.
325   mirror::String* GetThreadName(const ScopedObjectAccessAlreadyRunnable& ts) const
326       SHARED_REQUIRES(Locks::mutator_lock_);
327 
328   // Sets 'name' to the java.lang.Thread's name. This requires no transition to managed code,
329   // allocation, or locking.
330   void GetThreadName(std::string& name) const;
331 
332   // Sets the thread's name.
333   void SetThreadName(const char* name) SHARED_REQUIRES(Locks::mutator_lock_);
334 
335   // Returns the thread-specific CPU-time clock in microseconds or -1 if unavailable.
336   uint64_t GetCpuMicroTime() const;
337 
GetPeer()338   mirror::Object* GetPeer() const SHARED_REQUIRES(Locks::mutator_lock_) {
339     CHECK(tlsPtr_.jpeer == nullptr);
340     return tlsPtr_.opeer;
341   }
342 
HasPeer()343   bool HasPeer() const {
344     return tlsPtr_.jpeer != nullptr || tlsPtr_.opeer != nullptr;
345   }
346 
GetStats()347   RuntimeStats* GetStats() {
348     return &tls64_.stats;
349   }
350 
351   bool IsStillStarting() const;
352 
IsExceptionPending()353   bool IsExceptionPending() const {
354     return tlsPtr_.exception != nullptr;
355   }
356 
GetException()357   mirror::Throwable* GetException() const SHARED_REQUIRES(Locks::mutator_lock_) {
358     return tlsPtr_.exception;
359   }
360 
361   void AssertPendingException() const;
362   void AssertPendingOOMException() const SHARED_REQUIRES(Locks::mutator_lock_);
363   void AssertNoPendingException() const;
364   void AssertNoPendingExceptionForNewException(const char* msg) const;
365 
366   void SetException(mirror::Throwable* new_exception) SHARED_REQUIRES(Locks::mutator_lock_);
367 
ClearException()368   void ClearException() SHARED_REQUIRES(Locks::mutator_lock_) {
369     tlsPtr_.exception = nullptr;
370   }
371 
372   // Find catch block and perform long jump to appropriate exception handle
373   NO_RETURN void QuickDeliverException() SHARED_REQUIRES(Locks::mutator_lock_);
374 
375   Context* GetLongJumpContext();
ReleaseLongJumpContext(Context * context)376   void ReleaseLongJumpContext(Context* context) {
377     if (tlsPtr_.long_jump_context != nullptr) {
378       // Each QuickExceptionHandler gets a long jump context and uses
379       // it for doing the long jump, after finding catch blocks/doing deoptimization.
380       // Both finding catch blocks and deoptimization can trigger another
381       // exception such as a result of class loading. So there can be nested
382       // cases of exception handling and multiple contexts being used.
383       // ReleaseLongJumpContext tries to save the context in tlsPtr_.long_jump_context
384       // for reuse so there is no need to always allocate a new one each time when
385       // getting a context. Since we only keep one context for reuse, delete the
386       // existing one since the passed in context is yet to be used for longjump.
387       delete tlsPtr_.long_jump_context;
388     }
389     tlsPtr_.long_jump_context = context;
390   }
391 
392   // Get the current method and dex pc. If there are errors in retrieving the dex pc, this will
393   // abort the runtime iff abort_on_error is true.
394   ArtMethod* GetCurrentMethod(uint32_t* dex_pc, bool abort_on_error = true) const
395       SHARED_REQUIRES(Locks::mutator_lock_);
396 
397   // Returns whether the given exception was thrown by the current Java method being executed
398   // (Note that this includes native Java methods).
399   bool IsExceptionThrownByCurrentMethod(mirror::Throwable* exception) const
400       SHARED_REQUIRES(Locks::mutator_lock_);
401 
SetTopOfStack(ArtMethod ** top_method)402   void SetTopOfStack(ArtMethod** top_method) {
403     tlsPtr_.managed_stack.SetTopQuickFrame(top_method);
404   }
405 
SetTopOfShadowStack(ShadowFrame * top)406   void SetTopOfShadowStack(ShadowFrame* top) {
407     tlsPtr_.managed_stack.SetTopShadowFrame(top);
408   }
409 
HasManagedStack()410   bool HasManagedStack() const {
411     return (tlsPtr_.managed_stack.GetTopQuickFrame() != nullptr) ||
412         (tlsPtr_.managed_stack.GetTopShadowFrame() != nullptr);
413   }
414 
415   // If 'msg' is null, no detail message is set.
416   void ThrowNewException(const char* exception_class_descriptor, const char* msg)
417       SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
418 
419   // If 'msg' is null, no detail message is set. An exception must be pending, and will be
420   // used as the new exception's cause.
421   void ThrowNewWrappedException(const char* exception_class_descriptor, const char* msg)
422       SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
423 
424   void ThrowNewExceptionF(const char* exception_class_descriptor, const char* fmt, ...)
425       __attribute__((format(printf, 3, 4)))
426       SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
427 
428   void ThrowNewExceptionV(const char* exception_class_descriptor, const char* fmt, va_list ap)
429       SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
430 
431   // OutOfMemoryError is special, because we need to pre-allocate an instance.
432   // Only the GC should call this.
433   void ThrowOutOfMemoryError(const char* msg) SHARED_REQUIRES(Locks::mutator_lock_)
434       REQUIRES(!Roles::uninterruptible_);
435 
436   static void Startup();
437   static void FinishStartup();
438   static void Shutdown();
439 
440   // JNI methods
GetJniEnv()441   JNIEnvExt* GetJniEnv() const {
442     return tlsPtr_.jni_env;
443   }
444 
445   // Convert a jobject into a Object*
446   mirror::Object* DecodeJObject(jobject obj) const SHARED_REQUIRES(Locks::mutator_lock_);
447   // Checks if the weak global ref has been cleared by the GC without decoding it.
448   bool IsJWeakCleared(jweak obj) const SHARED_REQUIRES(Locks::mutator_lock_);
449 
GetMonitorEnterObject()450   mirror::Object* GetMonitorEnterObject() const SHARED_REQUIRES(Locks::mutator_lock_) {
451     return tlsPtr_.monitor_enter_object;
452   }
453 
SetMonitorEnterObject(mirror::Object * obj)454   void SetMonitorEnterObject(mirror::Object* obj) SHARED_REQUIRES(Locks::mutator_lock_) {
455     tlsPtr_.monitor_enter_object = obj;
456   }
457 
458   // Implements java.lang.Thread.interrupted.
459   bool Interrupted() REQUIRES(!*wait_mutex_);
460   // Implements java.lang.Thread.isInterrupted.
461   bool IsInterrupted() REQUIRES(!*wait_mutex_);
IsInterruptedLocked()462   bool IsInterruptedLocked() REQUIRES(wait_mutex_) {
463     return interrupted_;
464   }
465   void Interrupt(Thread* self) REQUIRES(!*wait_mutex_);
SetInterruptedLocked(bool i)466   void SetInterruptedLocked(bool i) REQUIRES(wait_mutex_) {
467     interrupted_ = i;
468   }
469   void Notify() REQUIRES(!*wait_mutex_);
470 
471  private:
472   void NotifyLocked(Thread* self) REQUIRES(wait_mutex_);
473 
474  public:
GetWaitMutex()475   Mutex* GetWaitMutex() const LOCK_RETURNED(wait_mutex_) {
476     return wait_mutex_;
477   }
478 
GetWaitConditionVariable()479   ConditionVariable* GetWaitConditionVariable() const REQUIRES(wait_mutex_) {
480     return wait_cond_;
481   }
482 
GetWaitMonitor()483   Monitor* GetWaitMonitor() const REQUIRES(wait_mutex_) {
484     return wait_monitor_;
485   }
486 
SetWaitMonitor(Monitor * mon)487   void SetWaitMonitor(Monitor* mon) REQUIRES(wait_mutex_) {
488     wait_monitor_ = mon;
489   }
490 
491   // Waiter link-list support.
GetWaitNext()492   Thread* GetWaitNext() const {
493     return tlsPtr_.wait_next;
494   }
495 
SetWaitNext(Thread * next)496   void SetWaitNext(Thread* next) {
497     tlsPtr_.wait_next = next;
498   }
499 
GetClassLoaderOverride()500   jobject GetClassLoaderOverride() {
501     return tlsPtr_.class_loader_override;
502   }
503 
504   void SetClassLoaderOverride(jobject class_loader_override);
505 
506   // Create the internal representation of a stack trace, that is more time
507   // and space efficient to compute than the StackTraceElement[].
508   template<bool kTransactionActive>
509   jobject CreateInternalStackTrace(const ScopedObjectAccessAlreadyRunnable& soa) const
510       SHARED_REQUIRES(Locks::mutator_lock_);
511 
512   // Convert an internal stack trace representation (returned by CreateInternalStackTrace) to a
513   // StackTraceElement[]. If output_array is null, a new array is created, otherwise as many
514   // frames as will fit are written into the given array. If stack_depth is non-null, it's updated
515   // with the number of valid frames in the returned array.
516   static jobjectArray InternalStackTraceToStackTraceElementArray(
517       const ScopedObjectAccessAlreadyRunnable& soa, jobject internal,
518       jobjectArray output_array = nullptr, int* stack_depth = nullptr)
519       SHARED_REQUIRES(Locks::mutator_lock_);
520 
HasDebuggerShadowFrames()521   bool HasDebuggerShadowFrames() const {
522     return tlsPtr_.frame_id_to_shadow_frame != nullptr;
523   }
524 
525   void VisitRoots(RootVisitor* visitor) SHARED_REQUIRES(Locks::mutator_lock_);
526 
527   ALWAYS_INLINE void VerifyStack() SHARED_REQUIRES(Locks::mutator_lock_);
528 
529   //
530   // Offsets of various members of native Thread class, used by compiled code.
531   //
532 
533   template<size_t pointer_size>
ThinLockIdOffset()534   static ThreadOffset<pointer_size> ThinLockIdOffset() {
535     return ThreadOffset<pointer_size>(
536         OFFSETOF_MEMBER(Thread, tls32_) +
537         OFFSETOF_MEMBER(tls_32bit_sized_values, thin_lock_thread_id));
538   }
539 
540   template<size_t pointer_size>
ThreadFlagsOffset()541   static ThreadOffset<pointer_size> ThreadFlagsOffset() {
542     return ThreadOffset<pointer_size>(
543         OFFSETOF_MEMBER(Thread, tls32_) +
544         OFFSETOF_MEMBER(tls_32bit_sized_values, state_and_flags));
545   }
546 
547   template<size_t pointer_size>
IsGcMarkingOffset()548   static ThreadOffset<pointer_size> IsGcMarkingOffset() {
549     return ThreadOffset<pointer_size>(
550         OFFSETOF_MEMBER(Thread, tls32_) +
551         OFFSETOF_MEMBER(tls_32bit_sized_values, is_gc_marking));
552   }
553 
554   // Deoptimize the Java stack.
555   void DeoptimizeWithDeoptimizationException(JValue* result) SHARED_REQUIRES(Locks::mutator_lock_);
556 
557  private:
558   template<size_t pointer_size>
ThreadOffsetFromTlsPtr(size_t tls_ptr_offset)559   static ThreadOffset<pointer_size> ThreadOffsetFromTlsPtr(size_t tls_ptr_offset) {
560     size_t base = OFFSETOF_MEMBER(Thread, tlsPtr_);
561     size_t scale;
562     size_t shrink;
563     if (pointer_size == sizeof(void*)) {
564       scale = 1;
565       shrink = 1;
566     } else if (pointer_size > sizeof(void*)) {
567       scale = pointer_size / sizeof(void*);
568       shrink = 1;
569     } else {
570       DCHECK_GT(sizeof(void*), pointer_size);
571       scale = 1;
572       shrink = sizeof(void*) / pointer_size;
573     }
574     return ThreadOffset<pointer_size>(base + ((tls_ptr_offset * scale) / shrink));
575   }
576 
577  public:
QuickEntryPointOffsetWithSize(size_t quick_entrypoint_offset,size_t pointer_size)578   static uint32_t QuickEntryPointOffsetWithSize(size_t quick_entrypoint_offset,
579                                                 size_t pointer_size) {
580     DCHECK(pointer_size == 4 || pointer_size == 8) << pointer_size;
581     if (pointer_size == 4) {
582       return QuickEntryPointOffset<4>(quick_entrypoint_offset).Uint32Value();
583     } else {
584       return QuickEntryPointOffset<8>(quick_entrypoint_offset).Uint32Value();
585     }
586   }
587 
588   template<size_t pointer_size>
QuickEntryPointOffset(size_t quick_entrypoint_offset)589   static ThreadOffset<pointer_size> QuickEntryPointOffset(size_t quick_entrypoint_offset) {
590     return ThreadOffsetFromTlsPtr<pointer_size>(
591         OFFSETOF_MEMBER(tls_ptr_sized_values, quick_entrypoints) + quick_entrypoint_offset);
592   }
593 
594   template<size_t pointer_size>
JniEntryPointOffset(size_t jni_entrypoint_offset)595   static ThreadOffset<pointer_size> JniEntryPointOffset(size_t jni_entrypoint_offset) {
596     return ThreadOffsetFromTlsPtr<pointer_size>(
597         OFFSETOF_MEMBER(tls_ptr_sized_values, jni_entrypoints) + jni_entrypoint_offset);
598   }
599 
600   template<size_t pointer_size>
SelfOffset()601   static ThreadOffset<pointer_size> SelfOffset() {
602     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, self));
603   }
604 
605   template<size_t pointer_size>
MterpCurrentIBaseOffset()606   static ThreadOffset<pointer_size> MterpCurrentIBaseOffset() {
607     return ThreadOffsetFromTlsPtr<pointer_size>(
608         OFFSETOF_MEMBER(tls_ptr_sized_values, mterp_current_ibase));
609   }
610 
611   template<size_t pointer_size>
MterpDefaultIBaseOffset()612   static ThreadOffset<pointer_size> MterpDefaultIBaseOffset() {
613     return ThreadOffsetFromTlsPtr<pointer_size>(
614         OFFSETOF_MEMBER(tls_ptr_sized_values, mterp_default_ibase));
615   }
616 
617   template<size_t pointer_size>
MterpAltIBaseOffset()618   static ThreadOffset<pointer_size> MterpAltIBaseOffset() {
619     return ThreadOffsetFromTlsPtr<pointer_size>(
620         OFFSETOF_MEMBER(tls_ptr_sized_values, mterp_alt_ibase));
621   }
622 
623   template<size_t pointer_size>
ExceptionOffset()624   static ThreadOffset<pointer_size> ExceptionOffset() {
625     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, exception));
626   }
627 
628   template<size_t pointer_size>
PeerOffset()629   static ThreadOffset<pointer_size> PeerOffset() {
630     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, opeer));
631   }
632 
633 
634   template<size_t pointer_size>
CardTableOffset()635   static ThreadOffset<pointer_size> CardTableOffset() {
636     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, card_table));
637   }
638 
639   template<size_t pointer_size>
ThreadSuspendTriggerOffset()640   static ThreadOffset<pointer_size> ThreadSuspendTriggerOffset() {
641     return ThreadOffsetFromTlsPtr<pointer_size>(
642         OFFSETOF_MEMBER(tls_ptr_sized_values, suspend_trigger));
643   }
644 
645   template<size_t pointer_size>
ThreadLocalPosOffset()646   static ThreadOffset<pointer_size> ThreadLocalPosOffset() {
647     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, thread_local_pos));
648   }
649 
650   template<size_t pointer_size>
ThreadLocalEndOffset()651   static ThreadOffset<pointer_size> ThreadLocalEndOffset() {
652     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, thread_local_end));
653   }
654 
655   template<size_t pointer_size>
ThreadLocalObjectsOffset()656   static ThreadOffset<pointer_size> ThreadLocalObjectsOffset() {
657     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, thread_local_objects));
658   }
659 
660   template<size_t pointer_size>
RosAllocRunsOffset()661   static ThreadOffset<pointer_size> RosAllocRunsOffset() {
662     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
663                                                                 rosalloc_runs));
664   }
665 
666   template<size_t pointer_size>
ThreadLocalAllocStackTopOffset()667   static ThreadOffset<pointer_size> ThreadLocalAllocStackTopOffset() {
668     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
669                                                                 thread_local_alloc_stack_top));
670   }
671 
672   template<size_t pointer_size>
ThreadLocalAllocStackEndOffset()673   static ThreadOffset<pointer_size> ThreadLocalAllocStackEndOffset() {
674     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
675                                                                 thread_local_alloc_stack_end));
676   }
677 
678   // Size of stack less any space reserved for stack overflow
GetStackSize()679   size_t GetStackSize() const {
680     return tlsPtr_.stack_size - (tlsPtr_.stack_end - tlsPtr_.stack_begin);
681   }
682 
GetStackEndForInterpreter(bool implicit_overflow_check)683   uint8_t* GetStackEndForInterpreter(bool implicit_overflow_check) const {
684     if (implicit_overflow_check) {
685       // The interpreter needs the extra overflow bytes that stack_end does
686       // not include.
687       return tlsPtr_.stack_end + GetStackOverflowReservedBytes(kRuntimeISA);
688     } else {
689       return tlsPtr_.stack_end;
690     }
691   }
692 
GetStackEnd()693   uint8_t* GetStackEnd() const {
694     return tlsPtr_.stack_end;
695   }
696 
697   // Set the stack end to that to be used during a stack overflow
698   void SetStackEndForStackOverflow() SHARED_REQUIRES(Locks::mutator_lock_);
699 
700   // Set the stack end to that to be used during regular execution
ResetDefaultStackEnd()701   void ResetDefaultStackEnd() {
702     // Our stacks grow down, so we want stack_end_ to be near there, but reserving enough room
703     // to throw a StackOverflowError.
704     tlsPtr_.stack_end = tlsPtr_.stack_begin + GetStackOverflowReservedBytes(kRuntimeISA);
705   }
706 
707   // Install the protected region for implicit stack checks.
708   void InstallImplicitProtection();
709 
IsHandlingStackOverflow()710   bool IsHandlingStackOverflow() const {
711     return tlsPtr_.stack_end == tlsPtr_.stack_begin;
712   }
713 
714   template<size_t pointer_size>
StackEndOffset()715   static ThreadOffset<pointer_size> StackEndOffset() {
716     return ThreadOffsetFromTlsPtr<pointer_size>(
717         OFFSETOF_MEMBER(tls_ptr_sized_values, stack_end));
718   }
719 
720   template<size_t pointer_size>
JniEnvOffset()721   static ThreadOffset<pointer_size> JniEnvOffset() {
722     return ThreadOffsetFromTlsPtr<pointer_size>(
723         OFFSETOF_MEMBER(tls_ptr_sized_values, jni_env));
724   }
725 
726   template<size_t pointer_size>
TopOfManagedStackOffset()727   static ThreadOffset<pointer_size> TopOfManagedStackOffset() {
728     return ThreadOffsetFromTlsPtr<pointer_size>(
729         OFFSETOF_MEMBER(tls_ptr_sized_values, managed_stack) +
730         ManagedStack::TopQuickFrameOffset());
731   }
732 
GetManagedStack()733   const ManagedStack* GetManagedStack() const {
734     return &tlsPtr_.managed_stack;
735   }
736 
737   // Linked list recording fragments of managed stack.
PushManagedStackFragment(ManagedStack * fragment)738   void PushManagedStackFragment(ManagedStack* fragment) {
739     tlsPtr_.managed_stack.PushManagedStackFragment(fragment);
740   }
PopManagedStackFragment(const ManagedStack & fragment)741   void PopManagedStackFragment(const ManagedStack& fragment) {
742     tlsPtr_.managed_stack.PopManagedStackFragment(fragment);
743   }
744 
PushShadowFrame(ShadowFrame * new_top_frame)745   ShadowFrame* PushShadowFrame(ShadowFrame* new_top_frame) {
746     return tlsPtr_.managed_stack.PushShadowFrame(new_top_frame);
747   }
748 
PopShadowFrame()749   ShadowFrame* PopShadowFrame() {
750     return tlsPtr_.managed_stack.PopShadowFrame();
751   }
752 
753   template<size_t pointer_size>
TopShadowFrameOffset()754   static ThreadOffset<pointer_size> TopShadowFrameOffset() {
755     return ThreadOffsetFromTlsPtr<pointer_size>(
756         OFFSETOF_MEMBER(tls_ptr_sized_values, managed_stack) +
757         ManagedStack::TopShadowFrameOffset());
758   }
759 
760   // Number of references allocated in JNI ShadowFrames on this thread.
NumJniShadowFrameReferences()761   size_t NumJniShadowFrameReferences() const SHARED_REQUIRES(Locks::mutator_lock_) {
762     return tlsPtr_.managed_stack.NumJniShadowFrameReferences();
763   }
764 
765   // Number of references in handle scope on this thread.
766   size_t NumHandleReferences();
767 
768   // Number of references allocated in handle scopes & JNI shadow frames on this thread.
NumStackReferences()769   size_t NumStackReferences() SHARED_REQUIRES(Locks::mutator_lock_) {
770     return NumHandleReferences() + NumJniShadowFrameReferences();
771   }
772 
773   // Is the given obj in this thread's stack indirect reference table?
774   bool HandleScopeContains(jobject obj) const;
775 
776   void HandleScopeVisitRoots(RootVisitor* visitor, uint32_t thread_id)
777       SHARED_REQUIRES(Locks::mutator_lock_);
778 
GetTopHandleScope()779   HandleScope* GetTopHandleScope() {
780     return tlsPtr_.top_handle_scope;
781   }
782 
PushHandleScope(HandleScope * handle_scope)783   void PushHandleScope(HandleScope* handle_scope) {
784     DCHECK_EQ(handle_scope->GetLink(), tlsPtr_.top_handle_scope);
785     tlsPtr_.top_handle_scope = handle_scope;
786   }
787 
PopHandleScope()788   HandleScope* PopHandleScope() {
789     HandleScope* handle_scope = tlsPtr_.top_handle_scope;
790     DCHECK(handle_scope != nullptr);
791     tlsPtr_.top_handle_scope = tlsPtr_.top_handle_scope->GetLink();
792     return handle_scope;
793   }
794 
795   template<size_t pointer_size>
TopHandleScopeOffset()796   static ThreadOffset<pointer_size> TopHandleScopeOffset() {
797     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
798                                                                 top_handle_scope));
799   }
800 
GetInvokeReq()801   DebugInvokeReq* GetInvokeReq() const {
802     return tlsPtr_.debug_invoke_req;
803   }
804 
GetSingleStepControl()805   SingleStepControl* GetSingleStepControl() const {
806     return tlsPtr_.single_step_control;
807   }
808 
809   // Indicates whether this thread is ready to invoke a method for debugging. This
810   // is only true if the thread has been suspended by a debug event.
IsReadyForDebugInvoke()811   bool IsReadyForDebugInvoke() const {
812     return tls32_.ready_for_debug_invoke;
813   }
814 
SetReadyForDebugInvoke(bool ready)815   void SetReadyForDebugInvoke(bool ready) {
816     tls32_.ready_for_debug_invoke = ready;
817   }
818 
IsDebugMethodEntry()819   bool IsDebugMethodEntry() const {
820     return tls32_.debug_method_entry_;
821   }
822 
SetDebugMethodEntry()823   void SetDebugMethodEntry() {
824     tls32_.debug_method_entry_ = true;
825   }
826 
ClearDebugMethodEntry()827   void ClearDebugMethodEntry() {
828     tls32_.debug_method_entry_ = false;
829   }
830 
GetIsGcMarking()831   bool GetIsGcMarking() const {
832     CHECK(kUseReadBarrier);
833     return tls32_.is_gc_marking;
834   }
835 
SetIsGcMarking(bool is_marking)836   void SetIsGcMarking(bool is_marking) {
837     CHECK(kUseReadBarrier);
838     tls32_.is_gc_marking = is_marking;
839   }
840 
GetWeakRefAccessEnabled()841   bool GetWeakRefAccessEnabled() const {
842     CHECK(kUseReadBarrier);
843     return tls32_.weak_ref_access_enabled;
844   }
845 
SetWeakRefAccessEnabled(bool enabled)846   void SetWeakRefAccessEnabled(bool enabled) {
847     CHECK(kUseReadBarrier);
848     tls32_.weak_ref_access_enabled = enabled;
849   }
850 
GetDisableThreadFlipCount()851   uint32_t GetDisableThreadFlipCount() const {
852     CHECK(kUseReadBarrier);
853     return tls32_.disable_thread_flip_count;
854   }
855 
IncrementDisableThreadFlipCount()856   void IncrementDisableThreadFlipCount() {
857     CHECK(kUseReadBarrier);
858     ++tls32_.disable_thread_flip_count;
859   }
860 
DecrementDisableThreadFlipCount()861   void DecrementDisableThreadFlipCount() {
862     CHECK(kUseReadBarrier);
863     DCHECK_GT(tls32_.disable_thread_flip_count, 0U);
864     --tls32_.disable_thread_flip_count;
865   }
866 
867   // Activates single step control for debugging. The thread takes the
868   // ownership of the given SingleStepControl*. It is deleted by a call
869   // to DeactivateSingleStepControl or upon thread destruction.
870   void ActivateSingleStepControl(SingleStepControl* ssc);
871 
872   // Deactivates single step control for debugging.
873   void DeactivateSingleStepControl();
874 
875   // Sets debug invoke request for debugging. When the thread is resumed,
876   // it executes the method described by this request then sends the reply
877   // before suspending itself. The thread takes the ownership of the given
878   // DebugInvokeReq*. It is deleted by a call to ClearDebugInvokeReq.
879   void SetDebugInvokeReq(DebugInvokeReq* req);
880 
881   // Clears debug invoke request for debugging. When the thread completes
882   // method invocation, it deletes its debug invoke request and suspends
883   // itself.
884   void ClearDebugInvokeReq();
885 
886   // Returns the fake exception used to activate deoptimization.
GetDeoptimizationException()887   static mirror::Throwable* GetDeoptimizationException() {
888     return reinterpret_cast<mirror::Throwable*>(-1);
889   }
890 
891   // Currently deoptimization invokes verifier which can trigger class loading
892   // and execute Java code, so there might be nested deoptimizations happening.
893   // We need to save the ongoing deoptimization shadow frames and return
894   // values on stacks.
895   // 'from_code' denotes whether the deoptimization was explicitly made from
896   // compiled code.
897   void PushDeoptimizationContext(const JValue& return_value,
898                                  bool is_reference,
899                                  bool from_code,
900                                  mirror::Throwable* exception)
901       SHARED_REQUIRES(Locks::mutator_lock_);
902   void PopDeoptimizationContext(JValue* result, mirror::Throwable** exception, bool* from_code)
903       SHARED_REQUIRES(Locks::mutator_lock_);
904   void AssertHasDeoptimizationContext()
905       SHARED_REQUIRES(Locks::mutator_lock_);
906   void PushStackedShadowFrame(ShadowFrame* sf, StackedShadowFrameType type);
907   ShadowFrame* PopStackedShadowFrame(StackedShadowFrameType type, bool must_be_present = true);
908 
909   // For debugger, find the shadow frame that corresponds to a frame id.
910   // Or return null if there is none.
911   ShadowFrame* FindDebuggerShadowFrame(size_t frame_id)
912       SHARED_REQUIRES(Locks::mutator_lock_);
913   // For debugger, find the bool array that keeps track of the updated vreg set
914   // for a frame id.
915   bool* GetUpdatedVRegFlags(size_t frame_id) SHARED_REQUIRES(Locks::mutator_lock_);
916   // For debugger, find the shadow frame that corresponds to a frame id. If
917   // one doesn't exist yet, create one and track it in frame_id_to_shadow_frame.
918   ShadowFrame* FindOrCreateDebuggerShadowFrame(size_t frame_id,
919                                                uint32_t num_vregs,
920                                                ArtMethod* method,
921                                                uint32_t dex_pc)
922       SHARED_REQUIRES(Locks::mutator_lock_);
923 
924   // Delete the entry that maps from frame_id to shadow_frame.
925   void RemoveDebuggerShadowFrameMapping(size_t frame_id)
926       SHARED_REQUIRES(Locks::mutator_lock_);
927 
GetInstrumentationStack()928   std::deque<instrumentation::InstrumentationStackFrame>* GetInstrumentationStack() {
929     return tlsPtr_.instrumentation_stack;
930   }
931 
GetStackTraceSample()932   std::vector<ArtMethod*>* GetStackTraceSample() const {
933     return tlsPtr_.stack_trace_sample;
934   }
935 
SetStackTraceSample(std::vector<ArtMethod * > * sample)936   void SetStackTraceSample(std::vector<ArtMethod*>* sample) {
937     tlsPtr_.stack_trace_sample = sample;
938   }
939 
GetTraceClockBase()940   uint64_t GetTraceClockBase() const {
941     return tls64_.trace_clock_base;
942   }
943 
SetTraceClockBase(uint64_t clock_base)944   void SetTraceClockBase(uint64_t clock_base) {
945     tls64_.trace_clock_base = clock_base;
946   }
947 
GetHeldMutex(LockLevel level)948   BaseMutex* GetHeldMutex(LockLevel level) const {
949     return tlsPtr_.held_mutexes[level];
950   }
951 
SetHeldMutex(LockLevel level,BaseMutex * mutex)952   void SetHeldMutex(LockLevel level, BaseMutex* mutex) {
953     tlsPtr_.held_mutexes[level] = mutex;
954   }
955 
956   void RunCheckpointFunction();
957 
958   bool PassActiveSuspendBarriers(Thread* self)
959       REQUIRES(!Locks::thread_suspend_count_lock_);
960 
961   void ClearSuspendBarrier(AtomicInteger* target)
962       REQUIRES(Locks::thread_suspend_count_lock_);
963 
ReadFlag(ThreadFlag flag)964   bool ReadFlag(ThreadFlag flag) const {
965     return (tls32_.state_and_flags.as_struct.flags & flag) != 0;
966   }
967 
TestAllFlags()968   bool TestAllFlags() const {
969     return (tls32_.state_and_flags.as_struct.flags != 0);
970   }
971 
AtomicSetFlag(ThreadFlag flag)972   void AtomicSetFlag(ThreadFlag flag) {
973     tls32_.state_and_flags.as_atomic_int.FetchAndOrSequentiallyConsistent(flag);
974   }
975 
AtomicClearFlag(ThreadFlag flag)976   void AtomicClearFlag(ThreadFlag flag) {
977     tls32_.state_and_flags.as_atomic_int.FetchAndAndSequentiallyConsistent(-1 ^ flag);
978   }
979 
980   void ResetQuickAllocEntryPointsForThread();
981 
982   // Returns the remaining space in the TLAB.
983   size_t TlabSize() const;
984   // Doesn't check that there is room.
985   mirror::Object* AllocTlab(size_t bytes);
986   void SetTlab(uint8_t* start, uint8_t* end);
987   bool HasTlab() const;
GetTlabStart()988   uint8_t* GetTlabStart() {
989     return tlsPtr_.thread_local_start;
990   }
GetTlabPos()991   uint8_t* GetTlabPos() {
992     return tlsPtr_.thread_local_pos;
993   }
994 
995   // Remove the suspend trigger for this thread by making the suspend_trigger_ TLS value
996   // equal to a valid pointer.
997   // TODO: does this need to atomic?  I don't think so.
RemoveSuspendTrigger()998   void RemoveSuspendTrigger() {
999     tlsPtr_.suspend_trigger = reinterpret_cast<uintptr_t*>(&tlsPtr_.suspend_trigger);
1000   }
1001 
1002   // Trigger a suspend check by making the suspend_trigger_ TLS value an invalid pointer.
1003   // The next time a suspend check is done, it will load from the value at this address
1004   // and trigger a SIGSEGV.
TriggerSuspend()1005   void TriggerSuspend() {
1006     tlsPtr_.suspend_trigger = nullptr;
1007   }
1008 
1009 
1010   // Push an object onto the allocation stack.
1011   bool PushOnThreadLocalAllocationStack(mirror::Object* obj)
1012       SHARED_REQUIRES(Locks::mutator_lock_);
1013 
1014   // Set the thread local allocation pointers to the given pointers.
1015   void SetThreadLocalAllocationStack(StackReference<mirror::Object>* start,
1016                                      StackReference<mirror::Object>* end);
1017 
1018   // Resets the thread local allocation pointers.
1019   void RevokeThreadLocalAllocationStack();
1020 
GetThreadLocalBytesAllocated()1021   size_t GetThreadLocalBytesAllocated() const {
1022     return tlsPtr_.thread_local_end - tlsPtr_.thread_local_start;
1023   }
1024 
GetThreadLocalObjectsAllocated()1025   size_t GetThreadLocalObjectsAllocated() const {
1026     return tlsPtr_.thread_local_objects;
1027   }
1028 
GetRosAllocRun(size_t index)1029   void* GetRosAllocRun(size_t index) const {
1030     return tlsPtr_.rosalloc_runs[index];
1031   }
1032 
SetRosAllocRun(size_t index,void * run)1033   void SetRosAllocRun(size_t index, void* run) {
1034     tlsPtr_.rosalloc_runs[index] = run;
1035   }
1036 
1037   bool ProtectStack(bool fatal_on_error = true);
1038   bool UnprotectStack();
1039 
SetMterpDefaultIBase(void * ibase)1040   void SetMterpDefaultIBase(void* ibase) {
1041     tlsPtr_.mterp_default_ibase = ibase;
1042   }
1043 
SetMterpCurrentIBase(void * ibase)1044   void SetMterpCurrentIBase(void* ibase) {
1045     tlsPtr_.mterp_current_ibase = ibase;
1046   }
1047 
SetMterpAltIBase(void * ibase)1048   void SetMterpAltIBase(void* ibase) {
1049     tlsPtr_.mterp_alt_ibase = ibase;
1050   }
1051 
GetMterpDefaultIBase()1052   const void* GetMterpDefaultIBase() const {
1053     return tlsPtr_.mterp_default_ibase;
1054   }
1055 
GetMterpCurrentIBase()1056   const void* GetMterpCurrentIBase() const {
1057     return tlsPtr_.mterp_current_ibase;
1058   }
1059 
GetMterpAltIBase()1060   const void* GetMterpAltIBase() const {
1061     return tlsPtr_.mterp_alt_ibase;
1062   }
1063 
NoteSignalBeingHandled()1064   void NoteSignalBeingHandled() {
1065     if (tls32_.handling_signal_) {
1066       LOG(FATAL) << "Detected signal while processing a signal";
1067     }
1068     tls32_.handling_signal_ = true;
1069   }
1070 
NoteSignalHandlerDone()1071   void NoteSignalHandlerDone() {
1072     tls32_.handling_signal_ = false;
1073   }
1074 
GetNestedSignalState()1075   jmp_buf* GetNestedSignalState() {
1076     return tlsPtr_.nested_signal_state;
1077   }
1078 
IsSuspendedAtSuspendCheck()1079   bool IsSuspendedAtSuspendCheck() const {
1080     return tls32_.suspended_at_suspend_check;
1081   }
1082 
1083   void PushVerifier(verifier::MethodVerifier* verifier);
1084   void PopVerifier(verifier::MethodVerifier* verifier);
1085 
1086   void InitStringEntryPoints();
1087 
ModifyDebugDisallowReadBarrier(int8_t delta)1088   void ModifyDebugDisallowReadBarrier(int8_t delta) {
1089     debug_disallow_read_barrier_ += delta;
1090   }
1091 
GetDebugDisallowReadBarrierCount()1092   uint8_t GetDebugDisallowReadBarrierCount() const {
1093     return debug_disallow_read_barrier_;
1094   }
1095 
1096   // Returns true if the current thread is the jit sensitive thread.
IsJitSensitiveThread()1097   bool IsJitSensitiveThread() const {
1098     return this == jit_sensitive_thread_;
1099   }
1100 
1101   // Returns true if StrictMode events are traced for the current thread.
IsSensitiveThread()1102   static bool IsSensitiveThread() {
1103     if (is_sensitive_thread_hook_ != nullptr) {
1104       return (*is_sensitive_thread_hook_)();
1105     }
1106     return false;
1107   }
1108 
1109  private:
1110   explicit Thread(bool daemon);
1111   ~Thread() REQUIRES(!Locks::mutator_lock_, !Locks::thread_suspend_count_lock_);
1112   void Destroy();
1113 
1114   void CreatePeer(const char* name, bool as_daemon, jobject thread_group);
1115 
1116   template<bool kTransactionActive>
1117   void InitPeer(ScopedObjectAccess& soa, jboolean thread_is_daemon, jobject thread_group,
1118                 jobject thread_name, jint thread_priority)
1119       SHARED_REQUIRES(Locks::mutator_lock_);
1120 
1121   // Avoid use, callers should use SetState. Used only by SignalCatcher::HandleSigQuit, ~Thread and
1122   // Dbg::Disconnected.
SetStateUnsafe(ThreadState new_state)1123   ThreadState SetStateUnsafe(ThreadState new_state) {
1124     ThreadState old_state = GetState();
1125     if (old_state == kRunnable && new_state != kRunnable) {
1126       // Need to run pending checkpoint and suspend barriers. Run checkpoints in runnable state in
1127       // case they need to use a ScopedObjectAccess. If we are holding the mutator lock and a SOA
1128       // attempts to TransitionFromSuspendedToRunnable, it results in a deadlock.
1129       TransitionToSuspendedAndRunCheckpoints(new_state);
1130       // Since we transitioned to a suspended state, check the pass barrier requests.
1131       PassActiveSuspendBarriers();
1132     } else {
1133       tls32_.state_and_flags.as_struct.state = new_state;
1134     }
1135     return old_state;
1136   }
1137 
1138   void VerifyStackImpl() SHARED_REQUIRES(Locks::mutator_lock_);
1139 
1140   void DumpState(std::ostream& os) const SHARED_REQUIRES(Locks::mutator_lock_);
1141   void DumpStack(std::ostream& os,
1142                  bool dump_native_stack = true,
1143                  BacktraceMap* backtrace_map = nullptr) const
1144       REQUIRES(!Locks::thread_suspend_count_lock_)
1145       SHARED_REQUIRES(Locks::mutator_lock_);
1146 
1147   // Out-of-line conveniences for debugging in gdb.
1148   static Thread* CurrentFromGdb();  // Like Thread::Current.
1149   // Like Thread::Dump(std::cerr).
1150   void DumpFromGdb() const SHARED_REQUIRES(Locks::mutator_lock_);
1151 
1152   static void* CreateCallback(void* arg);
1153 
1154   void HandleUncaughtExceptions(ScopedObjectAccess& soa)
1155       SHARED_REQUIRES(Locks::mutator_lock_);
1156   void RemoveFromThreadGroup(ScopedObjectAccess& soa) SHARED_REQUIRES(Locks::mutator_lock_);
1157 
1158   // Initialize a thread.
1159   //
1160   // The third parameter is not mandatory. If given, the thread will use this JNIEnvExt. In case
1161   // Init succeeds, this means the thread takes ownership of it. If Init fails, it is the caller's
1162   // responsibility to destroy the given JNIEnvExt. If the parameter is null, Init will try to
1163   // create a JNIEnvExt on its own (and potentially fail at that stage, indicated by a return value
1164   // of false).
1165   bool Init(ThreadList*, JavaVMExt*, JNIEnvExt* jni_env_ext = nullptr)
1166       REQUIRES(Locks::runtime_shutdown_lock_);
1167   void InitCardTable();
1168   void InitCpu();
1169   void CleanupCpu();
1170   void InitTlsEntryPoints();
1171   void InitTid();
1172   void InitPthreadKeySelf();
1173   bool InitStackHwm();
1174 
1175   void SetUpAlternateSignalStack();
1176   void TearDownAlternateSignalStack();
1177 
1178   ALWAYS_INLINE void TransitionToSuspendedAndRunCheckpoints(ThreadState new_state)
1179       REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_);
1180 
1181   ALWAYS_INLINE void PassActiveSuspendBarriers()
1182       REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_);
1183 
1184   // Registers the current thread as the jit sensitive thread. Should be called just once.
SetJitSensitiveThread()1185   static void SetJitSensitiveThread() {
1186     if (jit_sensitive_thread_ == nullptr) {
1187       jit_sensitive_thread_ = Thread::Current();
1188     } else {
1189       LOG(WARNING) << "Attempt to set the sensitive thread twice. Tid:"
1190           << Thread::Current()->GetTid();
1191     }
1192   }
1193 
SetSensitiveThreadHook(bool (* is_sensitive_thread_hook)())1194   static void SetSensitiveThreadHook(bool (*is_sensitive_thread_hook)()) {
1195     is_sensitive_thread_hook_ = is_sensitive_thread_hook;
1196   }
1197 
1198   // 32 bits of atomically changed state and flags. Keeping as 32 bits allows and atomic CAS to
1199   // change from being Suspended to Runnable without a suspend request occurring.
1200   union PACKED(4) StateAndFlags {
StateAndFlags()1201     StateAndFlags() {}
1202     struct PACKED(4) {
1203       // Bitfield of flag values. Must be changed atomically so that flag values aren't lost. See
1204       // ThreadFlags for bit field meanings.
1205       volatile uint16_t flags;
1206       // Holds the ThreadState. May be changed non-atomically between Suspended (ie not Runnable)
1207       // transitions. Changing to Runnable requires that the suspend_request be part of the atomic
1208       // operation. If a thread is suspended and a suspend_request is present, a thread may not
1209       // change to Runnable as a GC or other operation is in progress.
1210       volatile uint16_t state;
1211     } as_struct;
1212     AtomicInteger as_atomic_int;
1213     volatile int32_t as_int;
1214 
1215    private:
1216     // gcc does not handle struct with volatile member assignments correctly.
1217     // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47409
1218     DISALLOW_COPY_AND_ASSIGN(StateAndFlags);
1219   };
1220   static_assert(sizeof(StateAndFlags) == sizeof(int32_t), "Weird state_and_flags size");
1221 
1222   static void ThreadExitCallback(void* arg);
1223 
1224   // Maximum number of checkpoint functions.
1225   static constexpr uint32_t kMaxCheckpoints = 3;
1226 
1227   // Maximum number of suspend barriers.
1228   static constexpr uint32_t kMaxSuspendBarriers = 3;
1229 
1230   // Has Thread::Startup been called?
1231   static bool is_started_;
1232 
1233   // TLS key used to retrieve the Thread*.
1234   static pthread_key_t pthread_key_self_;
1235 
1236   // Used to notify threads that they should attempt to resume, they will suspend again if
1237   // their suspend count is > 0.
1238   static ConditionVariable* resume_cond_ GUARDED_BY(Locks::thread_suspend_count_lock_);
1239 
1240   // Hook passed by framework which returns true
1241   // when StrictMode events are traced for the current thread.
1242   static bool (*is_sensitive_thread_hook_)();
1243   // Stores the jit sensitive thread (which for now is the UI thread).
1244   static Thread* jit_sensitive_thread_;
1245 
1246   /***********************************************************************************************/
1247   // Thread local storage. Fields are grouped by size to enable 32 <-> 64 searching to account for
1248   // pointer size differences. To encourage shorter encoding, more frequently used values appear
1249   // first if possible.
1250   /***********************************************************************************************/
1251 
1252   struct PACKED(4) tls_32bit_sized_values {
1253     // We have no control over the size of 'bool', but want our boolean fields
1254     // to be 4-byte quantities.
1255     typedef uint32_t bool32_t;
1256 
tls_32bit_sized_valuestls_32bit_sized_values1257     explicit tls_32bit_sized_values(bool is_daemon) :
1258       suspend_count(0), debug_suspend_count(0), thin_lock_thread_id(0), tid(0),
1259       daemon(is_daemon), throwing_OutOfMemoryError(false), no_thread_suspension(0),
1260       thread_exit_check_count(0), handling_signal_(false),
1261       suspended_at_suspend_check(false), ready_for_debug_invoke(false),
1262       debug_method_entry_(false), is_gc_marking(false), weak_ref_access_enabled(true),
1263       disable_thread_flip_count(0) {
1264     }
1265 
1266     union StateAndFlags state_and_flags;
1267     static_assert(sizeof(union StateAndFlags) == sizeof(int32_t),
1268                   "Size of state_and_flags and int32 are different");
1269 
1270     // A non-zero value is used to tell the current thread to enter a safe point
1271     // at the next poll.
1272     int suspend_count GUARDED_BY(Locks::thread_suspend_count_lock_);
1273 
1274     // How much of 'suspend_count_' is by request of the debugger, used to set things right
1275     // when the debugger detaches. Must be <= suspend_count_.
1276     int debug_suspend_count GUARDED_BY(Locks::thread_suspend_count_lock_);
1277 
1278     // Thin lock thread id. This is a small integer used by the thin lock implementation.
1279     // This is not to be confused with the native thread's tid, nor is it the value returned
1280     // by java.lang.Thread.getId --- this is a distinct value, used only for locking. One
1281     // important difference between this id and the ids visible to managed code is that these
1282     // ones get reused (to ensure that they fit in the number of bits available).
1283     uint32_t thin_lock_thread_id;
1284 
1285     // System thread id.
1286     uint32_t tid;
1287 
1288     // Is the thread a daemon?
1289     const bool32_t daemon;
1290 
1291     // A boolean telling us whether we're recursively throwing OOME.
1292     bool32_t throwing_OutOfMemoryError;
1293 
1294     // A positive value implies we're in a region where thread suspension isn't expected.
1295     uint32_t no_thread_suspension;
1296 
1297     // How many times has our pthread key's destructor been called?
1298     uint32_t thread_exit_check_count;
1299 
1300     // True if signal is being handled by this thread.
1301     bool32_t handling_signal_;
1302 
1303     // True if the thread is suspended in FullSuspendCheck(). This is
1304     // used to distinguish runnable threads that are suspended due to
1305     // a normal suspend check from other threads.
1306     bool32_t suspended_at_suspend_check;
1307 
1308     // True if the thread has been suspended by a debugger event. This is
1309     // used to invoke method from the debugger which is only allowed when
1310     // the thread is suspended by an event.
1311     bool32_t ready_for_debug_invoke;
1312 
1313     // True if the thread enters a method. This is used to detect method entry
1314     // event for the debugger.
1315     bool32_t debug_method_entry_;
1316 
1317     // True if the GC is in the marking phase. This is used for the CC collector only. This is
1318     // thread local so that we can simplify the logic to check for the fast path of read barriers of
1319     // GC roots.
1320     bool32_t is_gc_marking;
1321 
1322     // True if the thread is allowed to access a weak ref (Reference::GetReferent() and system
1323     // weaks) and to potentially mark an object alive/gray. This is used for concurrent reference
1324     // processing of the CC collector only. This is thread local so that we can enable/disable weak
1325     // ref access by using a checkpoint and avoid a race around the time weak ref access gets
1326     // disabled and concurrent reference processing begins (if weak ref access is disabled during a
1327     // pause, this is not an issue.) Other collectors use Runtime::DisallowNewSystemWeaks() and
1328     // ReferenceProcessor::EnableSlowPath().
1329     bool32_t weak_ref_access_enabled;
1330 
1331     // A thread local version of Heap::disable_thread_flip_count_. This keeps track of how many
1332     // levels of (nested) JNI critical sections the thread is in and is used to detect a nested JNI
1333     // critical section enter.
1334     uint32_t disable_thread_flip_count;
1335   } tls32_;
1336 
1337   struct PACKED(8) tls_64bit_sized_values {
tls_64bit_sized_valuestls_64bit_sized_values1338     tls_64bit_sized_values() : trace_clock_base(0) {
1339     }
1340 
1341     // The clock base used for tracing.
1342     uint64_t trace_clock_base;
1343 
1344     RuntimeStats stats;
1345   } tls64_;
1346 
PACKED(sizeof (void *))1347   struct PACKED(sizeof(void*)) tls_ptr_sized_values {
1348       tls_ptr_sized_values() : card_table(nullptr), exception(nullptr), stack_end(nullptr),
1349       managed_stack(), suspend_trigger(nullptr), jni_env(nullptr), tmp_jni_env(nullptr),
1350       self(nullptr), opeer(nullptr), jpeer(nullptr), stack_begin(nullptr), stack_size(0),
1351       stack_trace_sample(nullptr), wait_next(nullptr), monitor_enter_object(nullptr),
1352       top_handle_scope(nullptr), class_loader_override(nullptr), long_jump_context(nullptr),
1353       instrumentation_stack(nullptr), debug_invoke_req(nullptr), single_step_control(nullptr),
1354       stacked_shadow_frame_record(nullptr), deoptimization_context_stack(nullptr),
1355       frame_id_to_shadow_frame(nullptr), name(nullptr), pthread_self(0),
1356       last_no_thread_suspension_cause(nullptr), thread_local_objects(0),
1357       thread_local_start(nullptr), thread_local_pos(nullptr), thread_local_end(nullptr),
1358       mterp_current_ibase(nullptr), mterp_default_ibase(nullptr), mterp_alt_ibase(nullptr),
1359       thread_local_alloc_stack_top(nullptr), thread_local_alloc_stack_end(nullptr),
1360       nested_signal_state(nullptr), flip_function(nullptr), method_verifier(nullptr),
1361       thread_local_mark_stack(nullptr) {
1362       std::fill(held_mutexes, held_mutexes + kLockLevelCount, nullptr);
1363     }
1364 
1365     // The biased card table, see CardTable for details.
1366     uint8_t* card_table;
1367 
1368     // The pending exception or null.
1369     mirror::Throwable* exception;
1370 
1371     // The end of this thread's stack. This is the lowest safely-addressable address on the stack.
1372     // We leave extra space so there's room for the code that throws StackOverflowError.
1373     uint8_t* stack_end;
1374 
1375     // The top of the managed stack often manipulated directly by compiler generated code.
1376     ManagedStack managed_stack;
1377 
1378     // In certain modes, setting this to 0 will trigger a SEGV and thus a suspend check.  It is
1379     // normally set to the address of itself.
1380     uintptr_t* suspend_trigger;
1381 
1382     // Every thread may have an associated JNI environment
1383     JNIEnvExt* jni_env;
1384 
1385     // Temporary storage to transfer a pre-allocated JNIEnvExt from the creating thread to the
1386     // created thread.
1387     JNIEnvExt* tmp_jni_env;
1388 
1389     // Initialized to "this". On certain architectures (such as x86) reading off of Thread::Current
1390     // is easy but getting the address of Thread::Current is hard. This field can be read off of
1391     // Thread::Current to give the address.
1392     Thread* self;
1393 
1394     // Our managed peer (an instance of java.lang.Thread). The jobject version is used during thread
1395     // start up, until the thread is registered and the local opeer_ is used.
1396     mirror::Object* opeer;
1397     jobject jpeer;
1398 
1399     // The "lowest addressable byte" of the stack.
1400     uint8_t* stack_begin;
1401 
1402     // Size of the stack.
1403     size_t stack_size;
1404 
1405     // Pointer to previous stack trace captured by sampling profiler.
1406     std::vector<ArtMethod*>* stack_trace_sample;
1407 
1408     // The next thread in the wait set this thread is part of or null if not waiting.
1409     Thread* wait_next;
1410 
1411     // If we're blocked in MonitorEnter, this is the object we're trying to lock.
1412     mirror::Object* monitor_enter_object;
1413 
1414     // Top of linked list of handle scopes or null for none.
1415     HandleScope* top_handle_scope;
1416 
1417     // Needed to get the right ClassLoader in JNI_OnLoad, but also
1418     // useful for testing.
1419     jobject class_loader_override;
1420 
1421     // Thread local, lazily allocated, long jump context. Used to deliver exceptions.
1422     Context* long_jump_context;
1423 
1424     // Additional stack used by method instrumentation to store method and return pc values.
1425     // Stored as a pointer since std::deque is not PACKED.
1426     std::deque<instrumentation::InstrumentationStackFrame>* instrumentation_stack;
1427 
1428     // JDWP invoke-during-breakpoint support.
1429     DebugInvokeReq* debug_invoke_req;
1430 
1431     // JDWP single-stepping support.
1432     SingleStepControl* single_step_control;
1433 
1434     // For gc purpose, a shadow frame record stack that keeps track of:
1435     // 1) shadow frames under construction.
1436     // 2) deoptimization shadow frames.
1437     StackedShadowFrameRecord* stacked_shadow_frame_record;
1438 
1439     // Deoptimization return value record stack.
1440     DeoptimizationContextRecord* deoptimization_context_stack;
1441 
1442     // For debugger, a linked list that keeps the mapping from frame_id to shadow frame.
1443     // Shadow frames may be created before deoptimization happens so that the debugger can
1444     // set local values there first.
1445     FrameIdToShadowFrame* frame_id_to_shadow_frame;
1446 
1447     // A cached copy of the java.lang.Thread's name.
1448     std::string* name;
1449 
1450     // A cached pthread_t for the pthread underlying this Thread*.
1451     pthread_t pthread_self;
1452 
1453     // If no_thread_suspension_ is > 0, what is causing that assertion.
1454     const char* last_no_thread_suspension_cause;
1455 
1456     // Pending checkpoint function or null if non-pending. Installation guarding by
1457     // Locks::thread_suspend_count_lock_.
1458     Closure* checkpoint_functions[kMaxCheckpoints];
1459 
1460     // Pending barriers that require passing or NULL if non-pending. Installation guarding by
1461     // Locks::thread_suspend_count_lock_.
1462     // They work effectively as art::Barrier, but implemented directly using AtomicInteger and futex
1463     // to avoid additional cost of a mutex and a condition variable, as used in art::Barrier.
1464     AtomicInteger* active_suspend_barriers[kMaxSuspendBarriers];
1465 
1466     // Entrypoint function pointers.
1467     // TODO: move this to more of a global offset table model to avoid per-thread duplication.
1468     JniEntryPoints jni_entrypoints;
1469     QuickEntryPoints quick_entrypoints;
1470 
1471     // Thread-local allocation pointer.
1472     size_t thread_local_objects;
1473     uint8_t* thread_local_start;
1474     // thread_local_pos and thread_local_end must be consecutive for ldrd and are 8 byte aligned for
1475     // potentially better performance.
1476     uint8_t* thread_local_pos;
1477     uint8_t* thread_local_end;
1478 
1479     // Mterp jump table bases.
1480     void* mterp_current_ibase;
1481     void* mterp_default_ibase;
1482     void* mterp_alt_ibase;
1483 
1484     // There are RosAlloc::kNumThreadLocalSizeBrackets thread-local size brackets per thread.
1485     void* rosalloc_runs[kNumRosAllocThreadLocalSizeBracketsInThread];
1486 
1487     // Thread-local allocation stack data/routines.
1488     StackReference<mirror::Object>* thread_local_alloc_stack_top;
1489     StackReference<mirror::Object>* thread_local_alloc_stack_end;
1490 
1491     // Support for Mutex lock hierarchy bug detection.
1492     BaseMutex* held_mutexes[kLockLevelCount];
1493 
1494     // Recorded thread state for nested signals.
1495     jmp_buf* nested_signal_state;
1496 
1497     // The function used for thread flip.
1498     Closure* flip_function;
1499 
1500     // Current method verifier, used for root marking.
1501     verifier::MethodVerifier* method_verifier;
1502 
1503     // Thread-local mark stack for the concurrent copying collector.
1504     gc::accounting::AtomicStack<mirror::Object>* thread_local_mark_stack;
1505   } tlsPtr_;
1506 
1507   // Guards the 'interrupted_' and 'wait_monitor_' members.
1508   Mutex* wait_mutex_ DEFAULT_MUTEX_ACQUIRED_AFTER;
1509 
1510   // Condition variable waited upon during a wait.
1511   ConditionVariable* wait_cond_ GUARDED_BY(wait_mutex_);
1512   // Pointer to the monitor lock we're currently waiting on or null if not waiting.
1513   Monitor* wait_monitor_ GUARDED_BY(wait_mutex_);
1514 
1515   // Thread "interrupted" status; stays raised until queried or thrown.
1516   bool interrupted_ GUARDED_BY(wait_mutex_);
1517 
1518   // Debug disable read barrier count, only is checked for debug builds and only in the runtime.
1519   uint8_t debug_disallow_read_barrier_ = 0;
1520 
1521   friend class Dbg;  // For SetStateUnsafe.
1522   friend class gc::collector::SemiSpace;  // For getting stack traces.
1523   friend class Runtime;  // For CreatePeer.
1524   friend class QuickExceptionHandler;  // For dumping the stack.
1525   friend class ScopedThreadStateChange;
1526   friend class StubTest;  // For accessing entrypoints.
1527   friend class ThreadList;  // For ~Thread and Destroy.
1528 
1529   friend class EntrypointsOrderTest;  // To test the order of tls entries.
1530 
1531   DISALLOW_COPY_AND_ASSIGN(Thread);
1532 };
1533 
1534 class SCOPED_CAPABILITY ScopedAssertNoThreadSuspension {
1535  public:
ScopedAssertNoThreadSuspension(Thread * self,const char * cause)1536   ScopedAssertNoThreadSuspension(Thread* self, const char* cause) ACQUIRE(Roles::uninterruptible_)
1537       : self_(self), old_cause_(self->StartAssertNoThreadSuspension(cause)) {
1538   }
RELEASE(Roles::uninterruptible_)1539   ~ScopedAssertNoThreadSuspension() RELEASE(Roles::uninterruptible_) {
1540     self_->EndAssertNoThreadSuspension(old_cause_);
1541   }
Self()1542   Thread* Self() {
1543     return self_;
1544   }
1545 
1546  private:
1547   Thread* const self_;
1548   const char* const old_cause_;
1549 };
1550 
1551 class ScopedStackedShadowFramePusher {
1552  public:
ScopedStackedShadowFramePusher(Thread * self,ShadowFrame * sf,StackedShadowFrameType type)1553   ScopedStackedShadowFramePusher(Thread* self, ShadowFrame* sf, StackedShadowFrameType type)
1554     : self_(self), type_(type) {
1555     self_->PushStackedShadowFrame(sf, type);
1556   }
~ScopedStackedShadowFramePusher()1557   ~ScopedStackedShadowFramePusher() {
1558     self_->PopStackedShadowFrame(type_);
1559   }
1560 
1561  private:
1562   Thread* const self_;
1563   const StackedShadowFrameType type_;
1564 
1565   DISALLOW_COPY_AND_ASSIGN(ScopedStackedShadowFramePusher);
1566 };
1567 
1568 // Only works for debug builds.
1569 class ScopedDebugDisallowReadBarriers {
1570  public:
ScopedDebugDisallowReadBarriers(Thread * self)1571   explicit ScopedDebugDisallowReadBarriers(Thread* self) : self_(self) {
1572     self_->ModifyDebugDisallowReadBarrier(1);
1573   }
~ScopedDebugDisallowReadBarriers()1574   ~ScopedDebugDisallowReadBarriers() {
1575     self_->ModifyDebugDisallowReadBarrier(-1);
1576   }
1577 
1578  private:
1579   Thread* const self_;
1580 };
1581 
1582 std::ostream& operator<<(std::ostream& os, const Thread& thread);
1583 std::ostream& operator<<(std::ostream& os, const StackedShadowFrameType& thread);
1584 
1585 }  // namespace art
1586 
1587 #endif  // ART_RUNTIME_THREAD_H_
1588