xref: /aosp_15_r20/art/runtime/thread.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_THREAD_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_THREAD_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <atomic>
21*795d594fSAndroid Build Coastguard Worker #include <bitset>
22*795d594fSAndroid Build Coastguard Worker #include <deque>
23*795d594fSAndroid Build Coastguard Worker #include <iosfwd>
24*795d594fSAndroid Build Coastguard Worker #include <list>
25*795d594fSAndroid Build Coastguard Worker #include <memory>
26*795d594fSAndroid Build Coastguard Worker #include <string>
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker #include "base/atomic.h"
29*795d594fSAndroid Build Coastguard Worker #include "base/bit_field.h"
30*795d594fSAndroid Build Coastguard Worker #include "base/bit_utils.h"
31*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
32*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
33*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
34*795d594fSAndroid Build Coastguard Worker #include "base/safe_map.h"
35*795d594fSAndroid Build Coastguard Worker #include "base/value_object.h"
36*795d594fSAndroid Build Coastguard Worker #include "entrypoints/jni/jni_entrypoints.h"
37*795d594fSAndroid Build Coastguard Worker #include "entrypoints/quick/quick_entrypoints.h"
38*795d594fSAndroid Build Coastguard Worker #include "handle.h"
39*795d594fSAndroid Build Coastguard Worker #include "handle_scope.h"
40*795d594fSAndroid Build Coastguard Worker #include "interpreter/interpreter_cache.h"
41*795d594fSAndroid Build Coastguard Worker #include "interpreter/shadow_frame.h"
42*795d594fSAndroid Build Coastguard Worker #include "javaheapprof/javaheapsampler.h"
43*795d594fSAndroid Build Coastguard Worker #include "jvalue.h"
44*795d594fSAndroid Build Coastguard Worker #include "managed_stack.h"
45*795d594fSAndroid Build Coastguard Worker #include "offsets.h"
46*795d594fSAndroid Build Coastguard Worker #include "read_barrier_config.h"
47*795d594fSAndroid Build Coastguard Worker #include "reflective_handle_scope.h"
48*795d594fSAndroid Build Coastguard Worker #include "runtime_globals.h"
49*795d594fSAndroid Build Coastguard Worker #include "runtime_stats.h"
50*795d594fSAndroid Build Coastguard Worker #include "suspend_reason.h"
51*795d594fSAndroid Build Coastguard Worker #include "thread_state.h"
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker namespace unwindstack {
54*795d594fSAndroid Build Coastguard Worker class AndroidLocalUnwinder;
55*795d594fSAndroid Build Coastguard Worker }  // namespace unwindstack
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker namespace gc {
60*795d594fSAndroid Build Coastguard Worker namespace accounting {
61*795d594fSAndroid Build Coastguard Worker template<class T> class AtomicStack;
62*795d594fSAndroid Build Coastguard Worker }  // namespace accounting
63*795d594fSAndroid Build Coastguard Worker namespace collector {
64*795d594fSAndroid Build Coastguard Worker class SemiSpace;
65*795d594fSAndroid Build Coastguard Worker }  // namespace collector
66*795d594fSAndroid Build Coastguard Worker }  // namespace gc
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker namespace instrumentation {
69*795d594fSAndroid Build Coastguard Worker struct InstrumentationStackFrame;
70*795d594fSAndroid Build Coastguard Worker }  // namespace instrumentation
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker namespace mirror {
73*795d594fSAndroid Build Coastguard Worker class Array;
74*795d594fSAndroid Build Coastguard Worker class Class;
75*795d594fSAndroid Build Coastguard Worker class ClassLoader;
76*795d594fSAndroid Build Coastguard Worker class Object;
77*795d594fSAndroid Build Coastguard Worker template<class T> class ObjectArray;
78*795d594fSAndroid Build Coastguard Worker template<class T> class PrimitiveArray;
79*795d594fSAndroid Build Coastguard Worker using IntArray = PrimitiveArray<int32_t>;
80*795d594fSAndroid Build Coastguard Worker class StackTraceElement;
81*795d594fSAndroid Build Coastguard Worker class String;
82*795d594fSAndroid Build Coastguard Worker class Throwable;
83*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker namespace verifier {
86*795d594fSAndroid Build Coastguard Worker class VerifierDeps;
87*795d594fSAndroid Build Coastguard Worker }  // namespace verifier
88*795d594fSAndroid Build Coastguard Worker 
89*795d594fSAndroid Build Coastguard Worker class ArtMethod;
90*795d594fSAndroid Build Coastguard Worker class BaseMutex;
91*795d594fSAndroid Build Coastguard Worker class ClassLinker;
92*795d594fSAndroid Build Coastguard Worker class Closure;
93*795d594fSAndroid Build Coastguard Worker class Context;
94*795d594fSAndroid Build Coastguard Worker class DeoptimizationContextRecord;
95*795d594fSAndroid Build Coastguard Worker class DexFile;
96*795d594fSAndroid Build Coastguard Worker class FrameIdToShadowFrame;
97*795d594fSAndroid Build Coastguard Worker class IsMarkedVisitor;
98*795d594fSAndroid Build Coastguard Worker class JavaVMExt;
99*795d594fSAndroid Build Coastguard Worker class JNIEnvExt;
100*795d594fSAndroid Build Coastguard Worker class Monitor;
101*795d594fSAndroid Build Coastguard Worker class RootVisitor;
102*795d594fSAndroid Build Coastguard Worker class ScopedObjectAccessAlreadyRunnable;
103*795d594fSAndroid Build Coastguard Worker class ShadowFrame;
104*795d594fSAndroid Build Coastguard Worker class StackedShadowFrameRecord;
105*795d594fSAndroid Build Coastguard Worker class Thread;
106*795d594fSAndroid Build Coastguard Worker class ThreadList;
107*795d594fSAndroid Build Coastguard Worker enum VisitRootFlags : uint8_t;
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker // A piece of data that can be held in the CustomTls. The destructor will be called during thread
110*795d594fSAndroid Build Coastguard Worker // shutdown. The thread the destructor is called on is not necessarily the same thread it was stored
111*795d594fSAndroid Build Coastguard Worker // on.
112*795d594fSAndroid Build Coastguard Worker class TLSData {
113*795d594fSAndroid Build Coastguard Worker  public:
~TLSData()114*795d594fSAndroid Build Coastguard Worker   virtual ~TLSData() {}
115*795d594fSAndroid Build Coastguard Worker };
116*795d594fSAndroid Build Coastguard Worker 
117*795d594fSAndroid Build Coastguard Worker // Thread priorities. These must match the Thread.MIN_PRIORITY,
118*795d594fSAndroid Build Coastguard Worker // Thread.NORM_PRIORITY, and Thread.MAX_PRIORITY constants.
119*795d594fSAndroid Build Coastguard Worker enum ThreadPriority {
120*795d594fSAndroid Build Coastguard Worker   kMinThreadPriority = 1,
121*795d594fSAndroid Build Coastguard Worker   kNormThreadPriority = 5,
122*795d594fSAndroid Build Coastguard Worker   kMaxThreadPriority = 10,
123*795d594fSAndroid Build Coastguard Worker };
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker enum class ThreadFlag : uint32_t {
126*795d594fSAndroid Build Coastguard Worker   // If set, implies that suspend_count_ > 0 and the Thread should enter the safepoint handler.
127*795d594fSAndroid Build Coastguard Worker   kSuspendRequest = 1u << 0,
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker   // Request that the thread do some checkpoint work and then continue.
130*795d594fSAndroid Build Coastguard Worker   kCheckpointRequest = 1u << 1,
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker   // Request that the thread do empty checkpoint and then continue.
133*795d594fSAndroid Build Coastguard Worker   kEmptyCheckpointRequest = 1u << 2,
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker   // Register that at least 1 suspend barrier needs to be passed.
136*795d594fSAndroid Build Coastguard Worker   // Changes to this flag are guarded by suspend_count_lock_ .
137*795d594fSAndroid Build Coastguard Worker   kActiveSuspendBarrier = 1u << 3,
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker   // Marks that a "flip function" needs to be executed on this thread.
140*795d594fSAndroid Build Coastguard Worker   // Set only while holding thread_list_lock_.
141*795d594fSAndroid Build Coastguard Worker   kPendingFlipFunction = 1u << 4,
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker   // Marks that the "flip function" is being executed by another thread.
144*795d594fSAndroid Build Coastguard Worker   //
145*795d594fSAndroid Build Coastguard Worker   // This is used to guard against multiple threads trying to run the
146*795d594fSAndroid Build Coastguard Worker   // "flip function" for the same thread while the thread is suspended.
147*795d594fSAndroid Build Coastguard Worker   //
148*795d594fSAndroid Build Coastguard Worker   // Set when we have some way to ensure that the thread cannot disappear out from under us,
149*795d594fSAndroid Build Coastguard Worker   // Either:
150*795d594fSAndroid Build Coastguard Worker   //   1) Set by the thread itself,
151*795d594fSAndroid Build Coastguard Worker   //   2) by a thread holding thread_list_lock_, or
152*795d594fSAndroid Build Coastguard Worker   //   3) while the target has a pending suspension request.
153*795d594fSAndroid Build Coastguard Worker   // Once set, prevents a thread from exiting.
154*795d594fSAndroid Build Coastguard Worker   kRunningFlipFunction = 1u << 5,
155*795d594fSAndroid Build Coastguard Worker 
156*795d594fSAndroid Build Coastguard Worker   // We are responsible for resuming all other threads. We ignore suspension requests,
157*795d594fSAndroid Build Coastguard Worker   // but not checkpoint requests, until a more opportune time. GC code should
158*795d594fSAndroid Build Coastguard Worker   // in any case not check for such requests; other clients of SuspendAll might.
159*795d594fSAndroid Build Coastguard Worker   // Prevents a situation in which we are asked to suspend just before we suspend all
160*795d594fSAndroid Build Coastguard Worker   // other threads, and then notice the suspension request and suspend ourselves,
161*795d594fSAndroid Build Coastguard Worker   // leading to deadlock. Guarded by suspend_count_lock_ .
162*795d594fSAndroid Build Coastguard Worker   // Should not ever be set when we try to transition to kRunnable.
163*795d594fSAndroid Build Coastguard Worker   // TODO(b/296639267): Generalize use to prevent SuspendAll from blocking
164*795d594fSAndroid Build Coastguard Worker   // in-progress GC.
165*795d594fSAndroid Build Coastguard Worker   kSuspensionImmune = 1u << 6,
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker   // Request that compiled JNI stubs do not transition to Native or Runnable with
168*795d594fSAndroid Build Coastguard Worker   // inlined code, but take a slow path for monitoring method entry and exit events.
169*795d594fSAndroid Build Coastguard Worker   kMonitorJniEntryExit = 1u << 7,
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker   // Indicates the last flag. Used for checking that the flags do not overlap thread state.
172*795d594fSAndroid Build Coastguard Worker   kLastFlag = kMonitorJniEntryExit
173*795d594fSAndroid Build Coastguard Worker };
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker enum class StackedShadowFrameType {
176*795d594fSAndroid Build Coastguard Worker   kShadowFrameUnderConstruction,
177*795d594fSAndroid Build Coastguard Worker   kDeoptimizationShadowFrame,
178*795d594fSAndroid Build Coastguard Worker };
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker // The type of method that triggers deoptimization. It contains info on whether
181*795d594fSAndroid Build Coastguard Worker // the deoptimized method should advance dex_pc.
182*795d594fSAndroid Build Coastguard Worker enum class DeoptimizationMethodType {
183*795d594fSAndroid Build Coastguard Worker   kKeepDexPc,  // dex pc is required to be kept upon deoptimization.
184*795d594fSAndroid Build Coastguard Worker   kDefault     // dex pc may or may not advance depending on other conditions.
185*795d594fSAndroid Build Coastguard Worker };
186*795d594fSAndroid Build Coastguard Worker 
187*795d594fSAndroid Build Coastguard Worker // For the CC colector, normal weak reference access can be disabled on a per-thread basis, while
188*795d594fSAndroid Build Coastguard Worker // processing references.  After finishing, the reference processor asynchronously sets the
189*795d594fSAndroid Build Coastguard Worker // per-thread flags back to kEnabled with release memory ordering semantics. Each mutator thread
190*795d594fSAndroid Build Coastguard Worker // should check its flag with acquire semantics before assuming that it is enabled. However,
191*795d594fSAndroid Build Coastguard Worker // that is often too expensive, so the reading thread sets it to kVisiblyEnabled after seeing it
192*795d594fSAndroid Build Coastguard Worker // kEnabled.  The Reference.get() intrinsic can thus read it in relaxed mode, and reread (by
193*795d594fSAndroid Build Coastguard Worker // resorting to the slow path) with acquire semantics if it sees a value of kEnabled rather than
194*795d594fSAndroid Build Coastguard Worker // kVisiblyEnabled.
195*795d594fSAndroid Build Coastguard Worker enum class WeakRefAccessState : int32_t {
196*795d594fSAndroid Build Coastguard Worker   kVisiblyEnabled = 0,  // Enabled, and previously read with acquire load by this thread.
197*795d594fSAndroid Build Coastguard Worker   kEnabled,
198*795d594fSAndroid Build Coastguard Worker   kDisabled
199*795d594fSAndroid Build Coastguard Worker };
200*795d594fSAndroid Build Coastguard Worker 
201*795d594fSAndroid Build Coastguard Worker // ART uses two types of ABI/code: quick and native.
202*795d594fSAndroid Build Coastguard Worker //
203*795d594fSAndroid Build Coastguard Worker // Quick code includes:
204*795d594fSAndroid Build Coastguard Worker // - The code that ART compiles to, e.g: Java/dex code compiled to Arm64.
205*795d594fSAndroid Build Coastguard Worker // - Quick assembly entrypoints.
206*795d594fSAndroid Build Coastguard Worker //
207*795d594fSAndroid Build Coastguard Worker // Native code includes:
208*795d594fSAndroid Build Coastguard Worker // - Interpreter.
209*795d594fSAndroid Build Coastguard Worker // - GC.
210*795d594fSAndroid Build Coastguard Worker // - JNI.
211*795d594fSAndroid Build Coastguard Worker // - Runtime methods, i.e.: all ART C++ code.
212*795d594fSAndroid Build Coastguard Worker //
213*795d594fSAndroid Build Coastguard Worker // In regular (non-simulator) mode, both native and quick code are of the same ISA and will operate
214*795d594fSAndroid Build Coastguard Worker // on the hardware stack. The hardware stack is allocated by the kernel to ART and grows down in
215*795d594fSAndroid Build Coastguard Worker // memory.
216*795d594fSAndroid Build Coastguard Worker //
217*795d594fSAndroid Build Coastguard Worker // In simulator mode, native and quick code use different ISA's and will use different stacks.
218*795d594fSAndroid Build Coastguard Worker // Native code will use the hardware stack while quick code will use the simulated stack. The
219*795d594fSAndroid Build Coastguard Worker // simulated stack is a simple buffer in the native heap owned by the Simulator class.
220*795d594fSAndroid Build Coastguard Worker //
221*795d594fSAndroid Build Coastguard Worker // The StackType enum reflects the underlying type of stack in use by any given function while two
222*795d594fSAndroid Build Coastguard Worker // constexpr StackTypes (kNativeStackType and kQuickStackType) indicate which type of stack is used
223*795d594fSAndroid Build Coastguard Worker // for native and quick code. Whenever possible kNativeStackType and kQuickStackType should be used
224*795d594fSAndroid Build Coastguard Worker // instead of using the StackType directly.
225*795d594fSAndroid Build Coastguard Worker enum class StackType {
226*795d594fSAndroid Build Coastguard Worker   kHardware,
227*795d594fSAndroid Build Coastguard Worker   kSimulated
228*795d594fSAndroid Build Coastguard Worker };
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker // The type of stack used when executing native code, i.e.: runtime helpers, interpreter, JNI, etc.
231*795d594fSAndroid Build Coastguard Worker // This stack is the native machine's call stack and so should be used when comparing against
232*795d594fSAndroid Build Coastguard Worker // values returned from builtin functions such as __builtin_frame_address.
233*795d594fSAndroid Build Coastguard Worker static constexpr StackType kNativeStackType = StackType::kHardware;
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker // The type of stack used when executing quick code, i.e.: compiled dex code and quick entrypoints.
236*795d594fSAndroid Build Coastguard Worker // For simulator builds this is the kSimulated stack and for non-simulator builds this is the
237*795d594fSAndroid Build Coastguard Worker // kHardware stack.
238*795d594fSAndroid Build Coastguard Worker static constexpr StackType kQuickStackType = StackType::kHardware;
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker // See Thread.tlsPtr_.active_suspend1_barriers below for explanation.
241*795d594fSAndroid Build Coastguard Worker struct WrappedSuspend1Barrier {
242*795d594fSAndroid Build Coastguard Worker   // TODO(b/323668816): At least weaken CHECKs to DCHECKs once the bug is fixed.
243*795d594fSAndroid Build Coastguard Worker   static constexpr int kMagic = 0xba8;
WrappedSuspend1BarrierWrappedSuspend1Barrier244*795d594fSAndroid Build Coastguard Worker   WrappedSuspend1Barrier() : magic_(kMagic), barrier_(1), next_(nullptr) {}
245*795d594fSAndroid Build Coastguard Worker   int magic_;
246*795d594fSAndroid Build Coastguard Worker   AtomicInteger barrier_;
247*795d594fSAndroid Build Coastguard Worker   struct WrappedSuspend1Barrier* next_ GUARDED_BY(Locks::thread_suspend_count_lock_);
248*795d594fSAndroid Build Coastguard Worker };
249*795d594fSAndroid Build Coastguard Worker 
250*795d594fSAndroid Build Coastguard Worker // Mostly opaque structure allocated by the client of NotifyOnThreadExit.  Allows a client to
251*795d594fSAndroid Build Coastguard Worker // check whether the thread still exists after temporarily releasing thread_list_lock_, usually
252*795d594fSAndroid Build Coastguard Worker // because we need to wait for something.
253*795d594fSAndroid Build Coastguard Worker class ThreadExitFlag {
254*795d594fSAndroid Build Coastguard Worker  public:
ThreadExitFlag()255*795d594fSAndroid Build Coastguard Worker   ThreadExitFlag() : exited_(false) {}
HasExited()256*795d594fSAndroid Build Coastguard Worker   bool HasExited() REQUIRES(Locks::thread_list_lock_) { return exited_; }
257*795d594fSAndroid Build Coastguard Worker 
258*795d594fSAndroid Build Coastguard Worker  private:
259*795d594fSAndroid Build Coastguard Worker   // All ThreadExitFlags associated with a thread and with exited_ == false are in a doubly linked
260*795d594fSAndroid Build Coastguard Worker   // list.  tlsPtr_.thread_exit_flags points to the first element.  first.prev_ and last.next_ are
261*795d594fSAndroid Build Coastguard Worker   // null. This list contains no ThreadExitFlags with exited_ == true;
262*795d594fSAndroid Build Coastguard Worker   ThreadExitFlag* next_ GUARDED_BY(Locks::thread_list_lock_);
263*795d594fSAndroid Build Coastguard Worker   ThreadExitFlag* prev_ GUARDED_BY(Locks::thread_list_lock_);
264*795d594fSAndroid Build Coastguard Worker   bool exited_ GUARDED_BY(Locks::thread_list_lock_);
265*795d594fSAndroid Build Coastguard Worker   friend class Thread;
266*795d594fSAndroid Build Coastguard Worker };
267*795d594fSAndroid Build Coastguard Worker 
268*795d594fSAndroid Build Coastguard Worker // This should match RosAlloc::kNumThreadLocalSizeBrackets.
269*795d594fSAndroid Build Coastguard Worker static constexpr size_t kNumRosAllocThreadLocalSizeBracketsInThread = 16;
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker static constexpr size_t kSharedMethodHotnessThreshold = 0x1fff;
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker // Thread's stack layout for implicit stack overflow checks:
274*795d594fSAndroid Build Coastguard Worker //
275*795d594fSAndroid Build Coastguard Worker //   +---------------------+  <- highest address of stack memory
276*795d594fSAndroid Build Coastguard Worker //   |                     |
277*795d594fSAndroid Build Coastguard Worker //   .                     .  <- SP
278*795d594fSAndroid Build Coastguard Worker //   |                     |
279*795d594fSAndroid Build Coastguard Worker //   |                     |
280*795d594fSAndroid Build Coastguard Worker //   +---------------------+  <- stack_end
281*795d594fSAndroid Build Coastguard Worker //   |                     |
282*795d594fSAndroid Build Coastguard Worker //   |  Gap                |
283*795d594fSAndroid Build Coastguard Worker //   |                     |
284*795d594fSAndroid Build Coastguard Worker //   +---------------------+  <- stack_begin
285*795d594fSAndroid Build Coastguard Worker //   |                     |
286*795d594fSAndroid Build Coastguard Worker //   | Protected region    |
287*795d594fSAndroid Build Coastguard Worker //   |                     |
288*795d594fSAndroid Build Coastguard Worker //   +---------------------+  <- lowest address of stack memory
289*795d594fSAndroid Build Coastguard Worker //
290*795d594fSAndroid Build Coastguard Worker // The stack always grows down in memory.  At the lowest address is a region of memory
291*795d594fSAndroid Build Coastguard Worker // that is set mprotect(PROT_NONE).  Any attempt to read/write to this region will
292*795d594fSAndroid Build Coastguard Worker // result in a segmentation fault signal.  At any point, the thread's SP will be somewhere
293*795d594fSAndroid Build Coastguard Worker // between the stack_end and the highest address in stack memory.  An implicit stack
294*795d594fSAndroid Build Coastguard Worker // overflow check is a read of memory at a certain offset below the current SP (8K typically).
295*795d594fSAndroid Build Coastguard Worker // If the thread's SP is below the stack_end address this will be a read into the protected
296*795d594fSAndroid Build Coastguard Worker // region.  If the SP is above the stack_end address, the thread is guaranteed to have
297*795d594fSAndroid Build Coastguard Worker // at least 8K of space.  Because stack overflow checks are only performed in generated code,
298*795d594fSAndroid Build Coastguard Worker // if the thread makes a call out to a native function (through JNI), that native function
299*795d594fSAndroid Build Coastguard Worker // might only have 4K of memory (if the SP is adjacent to stack_end).
300*795d594fSAndroid Build Coastguard Worker 
301*795d594fSAndroid Build Coastguard Worker class EXPORT Thread {
302*795d594fSAndroid Build Coastguard Worker  public:
303*795d594fSAndroid Build Coastguard Worker   static const size_t kStackOverflowImplicitCheckSize;
304*795d594fSAndroid Build Coastguard Worker   static constexpr bool kVerifyStack = kIsDebugBuild;
305*795d594fSAndroid Build Coastguard Worker 
306*795d594fSAndroid Build Coastguard Worker   // Creates a new native thread corresponding to the given managed peer.
307*795d594fSAndroid Build Coastguard Worker   // Used to implement Thread.start.
308*795d594fSAndroid Build Coastguard Worker   static void CreateNativeThread(JNIEnv* env, jobject peer, size_t stack_size, bool daemon);
309*795d594fSAndroid Build Coastguard Worker 
310*795d594fSAndroid Build Coastguard Worker   // Attaches the calling native thread to the runtime, returning the new native peer.
311*795d594fSAndroid Build Coastguard Worker   // Used to implement JNI AttachCurrentThread and AttachCurrentThreadAsDaemon calls.
312*795d594fSAndroid Build Coastguard Worker   static Thread* Attach(const char* thread_name,
313*795d594fSAndroid Build Coastguard Worker                         bool as_daemon,
314*795d594fSAndroid Build Coastguard Worker                         jobject thread_group,
315*795d594fSAndroid Build Coastguard Worker                         bool create_peer,
316*795d594fSAndroid Build Coastguard Worker                         bool should_run_callbacks);
317*795d594fSAndroid Build Coastguard Worker   // Attaches the calling native thread to the runtime, returning the new native peer.
318*795d594fSAndroid Build Coastguard Worker   static Thread* Attach(const char* thread_name, bool as_daemon, jobject thread_peer);
319*795d594fSAndroid Build Coastguard Worker 
320*795d594fSAndroid Build Coastguard Worker   // Reset internal state of child thread after fork.
321*795d594fSAndroid Build Coastguard Worker   void InitAfterFork();
322*795d594fSAndroid Build Coastguard Worker 
323*795d594fSAndroid Build Coastguard Worker   // Get the currently executing thread, frequently referred to as 'self'. This call has reasonably
324*795d594fSAndroid Build Coastguard Worker   // high cost and so we favor passing self around when possible.
325*795d594fSAndroid Build Coastguard Worker   // TODO: mark as PURE so the compiler may coalesce and remove?
326*795d594fSAndroid Build Coastguard Worker   static Thread* Current();
327*795d594fSAndroid Build Coastguard Worker 
328*795d594fSAndroid Build Coastguard Worker   // Get the thread from the JNI environment.
329*795d594fSAndroid Build Coastguard Worker   static Thread* ForEnv(JNIEnv* env);
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker   // For implicit overflow checks we reserve an extra piece of memory at the bottom of the stack
332*795d594fSAndroid Build Coastguard Worker   // (lowest memory). The higher portion of the memory is protected against reads and the lower is
333*795d594fSAndroid Build Coastguard Worker   // available for use while throwing the StackOverflow exception.
334*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE static size_t GetStackOverflowProtectedSize();
335*795d594fSAndroid Build Coastguard Worker 
336*795d594fSAndroid Build Coastguard Worker   // On a runnable thread, check for pending thread suspension request and handle if pending.
337*795d594fSAndroid Build Coastguard Worker   void AllowThreadSuspension() REQUIRES_SHARED(Locks::mutator_lock_);
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   // Process pending thread suspension request and handle if pending.
340*795d594fSAndroid Build Coastguard Worker   void CheckSuspend(bool implicit = false) REQUIRES_SHARED(Locks::mutator_lock_);
341*795d594fSAndroid Build Coastguard Worker 
342*795d594fSAndroid Build Coastguard Worker   // Process a pending empty checkpoint if pending.
343*795d594fSAndroid Build Coastguard Worker   void CheckEmptyCheckpointFromWeakRefAccess(BaseMutex* cond_var_mutex);
344*795d594fSAndroid Build Coastguard Worker   void CheckEmptyCheckpointFromMutex();
345*795d594fSAndroid Build Coastguard Worker 
346*795d594fSAndroid Build Coastguard Worker   static Thread* FromManagedThread(Thread* self, ObjPtr<mirror::Object> thread_peer)
347*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_)
348*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
349*795d594fSAndroid Build Coastguard Worker   static Thread* FromManagedThread(const ScopedObjectAccessAlreadyRunnable& ts, jobject thread)
350*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_)
351*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
352*795d594fSAndroid Build Coastguard Worker 
353*795d594fSAndroid Build Coastguard Worker   // Translates 172 to pAllocArrayFromCode and so on.
354*795d594fSAndroid Build Coastguard Worker   template<PointerSize size_of_pointers>
355*795d594fSAndroid Build Coastguard Worker   static void DumpThreadOffset(std::ostream& os, uint32_t offset);
356*795d594fSAndroid Build Coastguard Worker 
357*795d594fSAndroid Build Coastguard Worker   // Dumps a one-line summary of thread state (used for operator<<).
358*795d594fSAndroid Build Coastguard Worker   void ShortDump(std::ostream& os) const;
359*795d594fSAndroid Build Coastguard Worker 
360*795d594fSAndroid Build Coastguard Worker   // Order of threads for ANRs (ANRs can be trimmed, so we print important ones first).
361*795d594fSAndroid Build Coastguard Worker   enum class DumpOrder : uint8_t {
362*795d594fSAndroid Build Coastguard Worker     kMain,     // Always print the main thread first (there might not be one).
363*795d594fSAndroid Build Coastguard Worker     kBlocked,  // Then print all threads that are blocked due to waiting on lock.
364*795d594fSAndroid Build Coastguard Worker     kLocked,   // Then print all threads that are holding some lock already.
365*795d594fSAndroid Build Coastguard Worker     kDefault,  // Print all other threads which might not be interesting for ANR.
366*795d594fSAndroid Build Coastguard Worker   };
367*795d594fSAndroid Build Coastguard Worker 
368*795d594fSAndroid Build Coastguard Worker   // Dumps the detailed thread state and the thread stack (used for SIGQUIT).
369*795d594fSAndroid Build Coastguard Worker   DumpOrder Dump(std::ostream& os,
370*795d594fSAndroid Build Coastguard Worker                  bool dump_native_stack = true,
371*795d594fSAndroid Build Coastguard Worker                  bool force_dump_stack = false) const
372*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
373*795d594fSAndroid Build Coastguard Worker   DumpOrder Dump(std::ostream& os,
374*795d594fSAndroid Build Coastguard Worker                  unwindstack::AndroidLocalUnwinder& unwinder,
375*795d594fSAndroid Build Coastguard Worker                  bool dump_native_stack = true,
376*795d594fSAndroid Build Coastguard Worker                  bool force_dump_stack = false) const
377*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
378*795d594fSAndroid Build Coastguard Worker 
379*795d594fSAndroid Build Coastguard Worker   DumpOrder DumpJavaStack(std::ostream& os,
380*795d594fSAndroid Build Coastguard Worker                           bool check_suspended = true,
381*795d594fSAndroid Build Coastguard Worker                           bool dump_locks = true) const
382*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
383*795d594fSAndroid Build Coastguard Worker 
384*795d594fSAndroid Build Coastguard Worker   // Dumps the SIGQUIT per-thread header. 'thread' can be null for a non-attached thread, in which
385*795d594fSAndroid Build Coastguard Worker   // case we use 'tid' to identify the thread, and we'll include as much information as we can.
386*795d594fSAndroid Build Coastguard Worker   static void DumpState(std::ostream& os, const Thread* thread, pid_t tid)
387*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
388*795d594fSAndroid Build Coastguard Worker 
GetState()389*795d594fSAndroid Build Coastguard Worker   ThreadState GetState() const {
390*795d594fSAndroid Build Coastguard Worker     return GetStateAndFlags(std::memory_order_relaxed).GetState();
391*795d594fSAndroid Build Coastguard Worker   }
392*795d594fSAndroid Build Coastguard Worker 
393*795d594fSAndroid Build Coastguard Worker   ThreadState SetState(ThreadState new_state);
394*795d594fSAndroid Build Coastguard Worker 
GetSuspendCount()395*795d594fSAndroid Build Coastguard Worker   int GetSuspendCount() const REQUIRES(Locks::thread_suspend_count_lock_) {
396*795d594fSAndroid Build Coastguard Worker     return tls32_.suspend_count;
397*795d594fSAndroid Build Coastguard Worker   }
398*795d594fSAndroid Build Coastguard Worker 
GetUserCodeSuspendCount()399*795d594fSAndroid Build Coastguard Worker   int GetUserCodeSuspendCount() const REQUIRES(Locks::thread_suspend_count_lock_,
400*795d594fSAndroid Build Coastguard Worker                                                Locks::user_code_suspension_lock_) {
401*795d594fSAndroid Build Coastguard Worker     return tls32_.user_code_suspend_count;
402*795d594fSAndroid Build Coastguard Worker   }
403*795d594fSAndroid Build Coastguard Worker 
IsSuspended()404*795d594fSAndroid Build Coastguard Worker   bool IsSuspended() const {
405*795d594fSAndroid Build Coastguard Worker     // We need to ensure that once we return true, all prior accesses to the Java data by "this"
406*795d594fSAndroid Build Coastguard Worker     // thread are complete. Hence we need "acquire" ordering here, and "release" when the flags
407*795d594fSAndroid Build Coastguard Worker     // are set.
408*795d594fSAndroid Build Coastguard Worker     StateAndFlags state_and_flags = GetStateAndFlags(std::memory_order_acquire);
409*795d594fSAndroid Build Coastguard Worker     return state_and_flags.GetState() != ThreadState::kRunnable &&
410*795d594fSAndroid Build Coastguard Worker            state_and_flags.IsFlagSet(ThreadFlag::kSuspendRequest);
411*795d594fSAndroid Build Coastguard Worker   }
412*795d594fSAndroid Build Coastguard Worker 
DecrDefineClassCount()413*795d594fSAndroid Build Coastguard Worker   void DecrDefineClassCount() {
414*795d594fSAndroid Build Coastguard Worker     tls32_.define_class_counter--;
415*795d594fSAndroid Build Coastguard Worker   }
416*795d594fSAndroid Build Coastguard Worker 
IncrDefineClassCount()417*795d594fSAndroid Build Coastguard Worker   void IncrDefineClassCount() {
418*795d594fSAndroid Build Coastguard Worker     tls32_.define_class_counter++;
419*795d594fSAndroid Build Coastguard Worker   }
GetDefineClassCount()420*795d594fSAndroid Build Coastguard Worker   uint32_t GetDefineClassCount() const {
421*795d594fSAndroid Build Coastguard Worker     return tls32_.define_class_counter;
422*795d594fSAndroid Build Coastguard Worker   }
423*795d594fSAndroid Build Coastguard Worker 
424*795d594fSAndroid Build Coastguard Worker   // Increment suspend count and optionally install at most one suspend barrier.
425*795d594fSAndroid Build Coastguard Worker   // Must hold thread_list_lock, OR be called with self == this, so that the Thread cannot
426*795d594fSAndroid Build Coastguard Worker   // disappear while we're running. If it's known that this == self, and thread_list_lock_
427*795d594fSAndroid Build Coastguard Worker   // is not held, FakeMutexLock should be used to fake-acquire thread_list_lock_ for
428*795d594fSAndroid Build Coastguard Worker   // static checking purposes.
429*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE
430*795d594fSAndroid Build Coastguard Worker   void IncrementSuspendCount(Thread* self,
431*795d594fSAndroid Build Coastguard Worker                              AtomicInteger* suspendall_barrier,
432*795d594fSAndroid Build Coastguard Worker                              WrappedSuspend1Barrier* suspend1_barrier,
433*795d594fSAndroid Build Coastguard Worker                              SuspendReason reason) REQUIRES(Locks::thread_suspend_count_lock_)
434*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_);
435*795d594fSAndroid Build Coastguard Worker 
436*795d594fSAndroid Build Coastguard Worker   // The same, but default reason to kInternal, and barriers to nullptr.
437*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void IncrementSuspendCount(Thread* self) REQUIRES(Locks::thread_suspend_count_lock_)
438*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_);
439*795d594fSAndroid Build Coastguard Worker 
440*795d594fSAndroid Build Coastguard Worker   // Follows one of the above calls. For_user_code indicates if SuspendReason was kForUserCode.
441*795d594fSAndroid Build Coastguard Worker   // Generally will need to be closely followed by Thread::resume_cond_->Broadcast(self);
442*795d594fSAndroid Build Coastguard Worker   // since there may be waiters. DecrementSuspendCount() itself does not do this, since we often
443*795d594fSAndroid Build Coastguard Worker   // wake more than a single thread.
444*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void DecrementSuspendCount(Thread* self, bool for_user_code = false)
445*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker  private:
448*795d594fSAndroid Build Coastguard Worker   NO_RETURN static void UnsafeLogFatalForSuspendCount(Thread* self, Thread* thread);
449*795d594fSAndroid Build Coastguard Worker 
450*795d594fSAndroid Build Coastguard Worker  public:
451*795d594fSAndroid Build Coastguard Worker   // Requests a checkpoint closure to run on another thread. The closure will be run when the
452*795d594fSAndroid Build Coastguard Worker   // thread notices the request, either in an explicit runtime CheckSuspend() call, or in a call
453*795d594fSAndroid Build Coastguard Worker   // originating from a compiler generated suspend point check. This returns true if the closure
454*795d594fSAndroid Build Coastguard Worker   // was added and will (eventually) be executed. It returns false if this was impossible
455*795d594fSAndroid Build Coastguard Worker   // because the thread was suspended, and we thus did nothing.
456*795d594fSAndroid Build Coastguard Worker   //
457*795d594fSAndroid Build Coastguard Worker   // Since multiple closures can be queued and some closures can delay other threads from running,
458*795d594fSAndroid Build Coastguard Worker   // no closure should attempt to suspend another thread while running.
459*795d594fSAndroid Build Coastguard Worker   // TODO We should add some debug option that verifies this.
460*795d594fSAndroid Build Coastguard Worker   //
461*795d594fSAndroid Build Coastguard Worker   // This guarantees that the RequestCheckpoint invocation happens-before the function invocation:
462*795d594fSAndroid Build Coastguard Worker   // RequestCheckpointFunction holds thread_suspend_count_lock_, and RunCheckpointFunction
463*795d594fSAndroid Build Coastguard Worker   // acquires it.
464*795d594fSAndroid Build Coastguard Worker   bool RequestCheckpoint(Closure* function)
465*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
466*795d594fSAndroid Build Coastguard Worker 
467*795d594fSAndroid Build Coastguard Worker   // RequestSynchronousCheckpoint releases the thread_list_lock_ as a part of its execution. This is
468*795d594fSAndroid Build Coastguard Worker   // due to the fact that Thread::Current() needs to go to sleep to allow the targeted thread to
469*795d594fSAndroid Build Coastguard Worker   // execute the checkpoint for us if it is Runnable. The wait_state is the state that the thread
470*795d594fSAndroid Build Coastguard Worker   // will go into while it is awaiting the checkpoint to be run.
471*795d594fSAndroid Build Coastguard Worker   // The closure may be run on Thread::Current() on behalf of "this" thread.
472*795d594fSAndroid Build Coastguard Worker   // Thus for lock ordering purposes, the closure should be runnable by the caller. This also
473*795d594fSAndroid Build Coastguard Worker   // sometimes makes it reasonable to pass ThreadState::kRunnable as wait_state: We may wait on
474*795d594fSAndroid Build Coastguard Worker   // a condition variable for the "this" thread to act, but for lock ordering purposes, this is
475*795d594fSAndroid Build Coastguard Worker   // exactly as though Thread::Current() had run the closure.
476*795d594fSAndroid Build Coastguard Worker   // NB Since multiple closures can be queued and some closures can delay other threads from running
477*795d594fSAndroid Build Coastguard Worker   // no closure should attempt to suspend another thread while running.
478*795d594fSAndroid Build Coastguard Worker   bool RequestSynchronousCheckpoint(Closure* function,
479*795d594fSAndroid Build Coastguard Worker                                     ThreadState wait_state = ThreadState::kWaiting)
480*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) RELEASE(Locks::thread_list_lock_)
481*795d594fSAndroid Build Coastguard Worker           REQUIRES(!Locks::thread_suspend_count_lock_);
482*795d594fSAndroid Build Coastguard Worker 
483*795d594fSAndroid Build Coastguard Worker   bool RequestEmptyCheckpoint()
484*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
485*795d594fSAndroid Build Coastguard Worker 
GetFlipFunction()486*795d594fSAndroid Build Coastguard Worker   Closure* GetFlipFunction() { return tlsPtr_.flip_function.load(std::memory_order_relaxed); }
487*795d594fSAndroid Build Coastguard Worker 
488*795d594fSAndroid Build Coastguard Worker   // Set the flip function. This is done with all threads suspended, except for the calling thread.
489*795d594fSAndroid Build Coastguard Worker   void SetFlipFunction(Closure* function) REQUIRES(Locks::thread_suspend_count_lock_)
490*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_);
491*795d594fSAndroid Build Coastguard Worker 
492*795d594fSAndroid Build Coastguard Worker   // Wait for the flip function to complete if still running on another thread. Assumes the "this"
493*795d594fSAndroid Build Coastguard Worker   // thread remains live.
494*795d594fSAndroid Build Coastguard Worker   void WaitForFlipFunction(Thread* self) const REQUIRES(!Locks::thread_suspend_count_lock_);
495*795d594fSAndroid Build Coastguard Worker 
496*795d594fSAndroid Build Coastguard Worker   // An enhanced version of the above that uses tef to safely return if the thread exited in the
497*795d594fSAndroid Build Coastguard Worker   // meantime.
498*795d594fSAndroid Build Coastguard Worker   void WaitForFlipFunctionTestingExited(Thread* self, ThreadExitFlag* tef)
499*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_, !Locks::thread_list_lock_);
500*795d594fSAndroid Build Coastguard Worker 
GetThreadLocalMarkStack()501*795d594fSAndroid Build Coastguard Worker   gc::accounting::AtomicStack<mirror::Object>* GetThreadLocalMarkStack() {
502*795d594fSAndroid Build Coastguard Worker     CHECK(gUseReadBarrier);
503*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_mark_stack;
504*795d594fSAndroid Build Coastguard Worker   }
SetThreadLocalMarkStack(gc::accounting::AtomicStack<mirror::Object> * stack)505*795d594fSAndroid Build Coastguard Worker   void SetThreadLocalMarkStack(gc::accounting::AtomicStack<mirror::Object>* stack) {
506*795d594fSAndroid Build Coastguard Worker     CHECK(gUseReadBarrier);
507*795d594fSAndroid Build Coastguard Worker     tlsPtr_.thread_local_mark_stack = stack;
508*795d594fSAndroid Build Coastguard Worker   }
509*795d594fSAndroid Build Coastguard Worker 
GetThreadLocalGcBuffer()510*795d594fSAndroid Build Coastguard Worker   uint8_t* GetThreadLocalGcBuffer() {
511*795d594fSAndroid Build Coastguard Worker     DCHECK(gUseUserfaultfd);
512*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_gc_buffer;
513*795d594fSAndroid Build Coastguard Worker   }
SetThreadLocalGcBuffer(uint8_t * buf)514*795d594fSAndroid Build Coastguard Worker   void SetThreadLocalGcBuffer(uint8_t* buf) {
515*795d594fSAndroid Build Coastguard Worker     DCHECK(gUseUserfaultfd);
516*795d594fSAndroid Build Coastguard Worker     tlsPtr_.thread_local_gc_buffer = buf;
517*795d594fSAndroid Build Coastguard Worker   }
518*795d594fSAndroid Build Coastguard Worker 
519*795d594fSAndroid Build Coastguard Worker   // Called when thread detected that the thread_suspend_count_ was non-zero. Gives up share of
520*795d594fSAndroid Build Coastguard Worker   // mutator_lock_ and waits until it is resumed and thread_suspend_count_ is zero.
521*795d594fSAndroid Build Coastguard Worker   // Should be called only when the kSuspensionImmune flag is clear. Requires this == Current();
522*795d594fSAndroid Build Coastguard Worker   void FullSuspendCheck(bool implicit = false)
523*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_)
524*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
525*795d594fSAndroid Build Coastguard Worker 
526*795d594fSAndroid Build Coastguard Worker   // Transition from non-runnable to runnable state acquiring share on mutator_lock_. Returns the
527*795d594fSAndroid Build Coastguard Worker   // old state, or kInvalidState if we failed because allow_failure and kSuspensionImmune were set.
528*795d594fSAndroid Build Coastguard Worker   // Should not be called with an argument except by the next function below.
529*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ThreadState TransitionFromSuspendedToRunnable(bool fail_on_suspend_req = false)
530*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_) SHARED_LOCK_FUNCTION(Locks::mutator_lock_);
531*795d594fSAndroid Build Coastguard Worker 
532*795d594fSAndroid Build Coastguard Worker   // A version that does not return the old ThreadState, and fails by returning false if it would
533*795d594fSAndroid Build Coastguard Worker   // have needed to handle a pending suspension request.
TryTransitionFromSuspendedToRunnable()534*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE bool TryTransitionFromSuspendedToRunnable()
535*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_)
536*795d594fSAndroid Build Coastguard Worker       SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_) NO_THREAD_SAFETY_ANALYSIS {
537*795d594fSAndroid Build Coastguard Worker     // The above function does not really acquire the lock when we pass true and it returns
538*795d594fSAndroid Build Coastguard Worker     // kInvalidState. We lie in both places, but clients see correct behavior.
539*795d594fSAndroid Build Coastguard Worker     return TransitionFromSuspendedToRunnable(true) != ThreadState::kInvalidState;
540*795d594fSAndroid Build Coastguard Worker   }
541*795d594fSAndroid Build Coastguard Worker 
542*795d594fSAndroid Build Coastguard Worker   // Transition from runnable into a state where mutator privileges are denied. Releases share of
543*795d594fSAndroid Build Coastguard Worker   // mutator lock.
544*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void TransitionFromRunnableToSuspended(ThreadState new_state)
545*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_)
546*795d594fSAndroid Build Coastguard Worker       UNLOCK_FUNCTION(Locks::mutator_lock_);
547*795d594fSAndroid Build Coastguard Worker 
548*795d594fSAndroid Build Coastguard Worker   // Once called thread suspension will cause an assertion failure.
StartAssertNoThreadSuspension(const char * cause)549*795d594fSAndroid Build Coastguard Worker   const char* StartAssertNoThreadSuspension(const char* cause) ACQUIRE(Roles::uninterruptible_) {
550*795d594fSAndroid Build Coastguard Worker     Roles::uninterruptible_.Acquire();  // No-op.
551*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
552*795d594fSAndroid Build Coastguard Worker       CHECK(cause != nullptr);
553*795d594fSAndroid Build Coastguard Worker       const char* previous_cause = tlsPtr_.last_no_thread_suspension_cause;
554*795d594fSAndroid Build Coastguard Worker       tls32_.no_thread_suspension++;
555*795d594fSAndroid Build Coastguard Worker       tlsPtr_.last_no_thread_suspension_cause = cause;
556*795d594fSAndroid Build Coastguard Worker       return previous_cause;
557*795d594fSAndroid Build Coastguard Worker     } else {
558*795d594fSAndroid Build Coastguard Worker       return nullptr;
559*795d594fSAndroid Build Coastguard Worker     }
560*795d594fSAndroid Build Coastguard Worker   }
561*795d594fSAndroid Build Coastguard Worker 
562*795d594fSAndroid Build Coastguard Worker   // End region where no thread suspension is expected.
EndAssertNoThreadSuspension(const char * old_cause)563*795d594fSAndroid Build Coastguard Worker   void EndAssertNoThreadSuspension(const char* old_cause) RELEASE(Roles::uninterruptible_) {
564*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
565*795d594fSAndroid Build Coastguard Worker       CHECK_IMPLIES(old_cause == nullptr, tls32_.no_thread_suspension == 1);
566*795d594fSAndroid Build Coastguard Worker       CHECK_GT(tls32_.no_thread_suspension, 0U);
567*795d594fSAndroid Build Coastguard Worker       tls32_.no_thread_suspension--;
568*795d594fSAndroid Build Coastguard Worker       tlsPtr_.last_no_thread_suspension_cause = old_cause;
569*795d594fSAndroid Build Coastguard Worker     }
570*795d594fSAndroid Build Coastguard Worker     Roles::uninterruptible_.Release();  // No-op.
571*795d594fSAndroid Build Coastguard Worker   }
572*795d594fSAndroid Build Coastguard Worker 
573*795d594fSAndroid Build Coastguard Worker   // End region where no thread suspension is expected. Returns the current open region in case we
574*795d594fSAndroid Build Coastguard Worker   // want to reopen it. Used for ScopedAllowThreadSuspension. Not supported if no_thread_suspension
575*795d594fSAndroid Build Coastguard Worker   // is larger than one.
EndAssertNoThreadSuspension()576*795d594fSAndroid Build Coastguard Worker   const char* EndAssertNoThreadSuspension() RELEASE(Roles::uninterruptible_) WARN_UNUSED {
577*795d594fSAndroid Build Coastguard Worker     const char* ret = nullptr;
578*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
579*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(tls32_.no_thread_suspension, 1u);
580*795d594fSAndroid Build Coastguard Worker       tls32_.no_thread_suspension--;
581*795d594fSAndroid Build Coastguard Worker       ret = tlsPtr_.last_no_thread_suspension_cause;
582*795d594fSAndroid Build Coastguard Worker       tlsPtr_.last_no_thread_suspension_cause = nullptr;
583*795d594fSAndroid Build Coastguard Worker     }
584*795d594fSAndroid Build Coastguard Worker     Roles::uninterruptible_.Release();  // No-op.
585*795d594fSAndroid Build Coastguard Worker     return ret;
586*795d594fSAndroid Build Coastguard Worker   }
587*795d594fSAndroid Build Coastguard Worker 
588*795d594fSAndroid Build Coastguard Worker   void AssertThreadSuspensionIsAllowable(bool check_locks = true) const;
589*795d594fSAndroid Build Coastguard Worker 
AssertNoTransactionCheckAllowed()590*795d594fSAndroid Build Coastguard Worker   void AssertNoTransactionCheckAllowed() const {
591*795d594fSAndroid Build Coastguard Worker     CHECK(tlsPtr_.last_no_transaction_checks_cause == nullptr)
592*795d594fSAndroid Build Coastguard Worker         << tlsPtr_.last_no_transaction_checks_cause;
593*795d594fSAndroid Build Coastguard Worker   }
594*795d594fSAndroid Build Coastguard Worker 
595*795d594fSAndroid Build Coastguard Worker   // Return true if thread suspension is allowable.
596*795d594fSAndroid Build Coastguard Worker   bool IsThreadSuspensionAllowable() const;
597*795d594fSAndroid Build Coastguard Worker 
IsDaemon()598*795d594fSAndroid Build Coastguard Worker   bool IsDaemon() const {
599*795d594fSAndroid Build Coastguard Worker     return tls32_.daemon;
600*795d594fSAndroid Build Coastguard Worker   }
601*795d594fSAndroid Build Coastguard Worker 
602*795d594fSAndroid Build Coastguard Worker   size_t NumberOfHeldMutexes() const;
603*795d594fSAndroid Build Coastguard Worker 
604*795d594fSAndroid Build Coastguard Worker   bool HoldsLock(ObjPtr<mirror::Object> object) const REQUIRES_SHARED(Locks::mutator_lock_);
605*795d594fSAndroid Build Coastguard Worker 
606*795d594fSAndroid Build Coastguard Worker   /*
607*795d594fSAndroid Build Coastguard Worker    * Changes the priority of this thread to match that of the java.lang.Thread object.
608*795d594fSAndroid Build Coastguard Worker    *
609*795d594fSAndroid Build Coastguard Worker    * We map a priority value from 1-10 to Linux "nice" values, where lower
610*795d594fSAndroid Build Coastguard Worker    * numbers indicate higher priority.
611*795d594fSAndroid Build Coastguard Worker    */
612*795d594fSAndroid Build Coastguard Worker   void SetNativePriority(int newPriority);
613*795d594fSAndroid Build Coastguard Worker 
614*795d594fSAndroid Build Coastguard Worker   /*
615*795d594fSAndroid Build Coastguard Worker    * Returns the priority of this thread by querying the system.
616*795d594fSAndroid Build Coastguard Worker    * This is useful when attaching a thread through JNI.
617*795d594fSAndroid Build Coastguard Worker    *
618*795d594fSAndroid Build Coastguard Worker    * Returns a value from 1 to 10 (compatible with java.lang.Thread values).
619*795d594fSAndroid Build Coastguard Worker    */
620*795d594fSAndroid Build Coastguard Worker   int GetNativePriority() const;
621*795d594fSAndroid Build Coastguard Worker 
622*795d594fSAndroid Build Coastguard Worker   // Guaranteed to be non-zero.
GetThreadId()623*795d594fSAndroid Build Coastguard Worker   uint32_t GetThreadId() const {
624*795d594fSAndroid Build Coastguard Worker     return tls32_.thin_lock_thread_id;
625*795d594fSAndroid Build Coastguard Worker   }
626*795d594fSAndroid Build Coastguard Worker 
GetTid()627*795d594fSAndroid Build Coastguard Worker   pid_t GetTid() const {
628*795d594fSAndroid Build Coastguard Worker     return tls32_.tid;
629*795d594fSAndroid Build Coastguard Worker   }
630*795d594fSAndroid Build Coastguard Worker 
631*795d594fSAndroid Build Coastguard Worker   // Returns the java.lang.Thread's name, or null if this Thread* doesn't have a peer.
632*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> GetThreadName() const REQUIRES_SHARED(Locks::mutator_lock_);
633*795d594fSAndroid Build Coastguard Worker 
634*795d594fSAndroid Build Coastguard Worker   // Sets 'name' to the java.lang.Thread's name. This requires no transition to managed code,
635*795d594fSAndroid Build Coastguard Worker   // allocation, or locking.
636*795d594fSAndroid Build Coastguard Worker   void GetThreadName(std::string& name) const;
637*795d594fSAndroid Build Coastguard Worker 
638*795d594fSAndroid Build Coastguard Worker   // Sets the thread's name.
639*795d594fSAndroid Build Coastguard Worker   void SetThreadName(const char* name) REQUIRES_SHARED(Locks::mutator_lock_);
640*795d594fSAndroid Build Coastguard Worker 
641*795d594fSAndroid Build Coastguard Worker   // Returns the thread-specific CPU-time clock in microseconds or -1 if unavailable.
642*795d594fSAndroid Build Coastguard Worker   uint64_t GetCpuMicroTime() const;
643*795d594fSAndroid Build Coastguard Worker 
GetPeer()644*795d594fSAndroid Build Coastguard Worker   mirror::Object* GetPeer() const REQUIRES_SHARED(Locks::mutator_lock_) {
645*795d594fSAndroid Build Coastguard Worker     DCHECK(Thread::Current() == this) << "Use GetPeerFromOtherThread instead";
646*795d594fSAndroid Build Coastguard Worker     CHECK(tlsPtr_.jpeer == nullptr);
647*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.opeer;
648*795d594fSAndroid Build Coastguard Worker   }
649*795d594fSAndroid Build Coastguard Worker   // GetPeer is not safe if called on another thread in the middle of the thread flip and
650*795d594fSAndroid Build Coastguard Worker   // the thread's stack may have not been flipped yet and peer may be a from-space (stale) ref.
651*795d594fSAndroid Build Coastguard Worker   // This function will force a flip for the other thread if necessary.
652*795d594fSAndroid Build Coastguard Worker   // Since we hold a shared mutator lock, a new flip function cannot be concurrently installed.
653*795d594fSAndroid Build Coastguard Worker   // The target thread must be suspended, so that it cannot disappear during the call.
654*795d594fSAndroid Build Coastguard Worker   // We should ideally not hold thread_list_lock_ . GetReferenceKind in ti_heap.cc, currently does
655*795d594fSAndroid Build Coastguard Worker   // hold it, but in a context in which we do not invoke EnsureFlipFunctionStarted().
656*795d594fSAndroid Build Coastguard Worker   mirror::Object* GetPeerFromOtherThread() REQUIRES_SHARED(Locks::mutator_lock_);
657*795d594fSAndroid Build Coastguard Worker 
658*795d594fSAndroid Build Coastguard Worker   // A version of the above that requires thread_list_lock_, but does not require the thread to
659*795d594fSAndroid Build Coastguard Worker   // be suspended. This may temporarily release thread_list_lock_. It thus needs a ThreadExitFlag
660*795d594fSAndroid Build Coastguard Worker   // describing the thread's status, so we can tell if it exited in the interim. Returns null if
661*795d594fSAndroid Build Coastguard Worker   // the thread exited.
662*795d594fSAndroid Build Coastguard Worker   mirror::Object* LockedGetPeerFromOtherThread(ThreadExitFlag* tef)
663*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(Locks::thread_list_lock_);
664*795d594fSAndroid Build Coastguard Worker 
665*795d594fSAndroid Build Coastguard Worker   // A convenience version of the above that creates the ThreadExitFlag locally. This is often
666*795d594fSAndroid Build Coastguard Worker   // unsafe if more than one thread is being processed. A prior call may have released
667*795d594fSAndroid Build Coastguard Worker   // thread_list_lock_, and thus the NotifyOnThreadExit() call here could see a deallocated
668*795d594fSAndroid Build Coastguard Worker   // Thread. We must hold the thread_list_lock continuously between obtaining the Thread*
669*795d594fSAndroid Build Coastguard Worker   // and calling NotifyOnThreadExit().
LockedGetPeerFromOtherThread()670*795d594fSAndroid Build Coastguard Worker   mirror::Object* LockedGetPeerFromOtherThread() REQUIRES_SHARED(Locks::mutator_lock_)
671*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_list_lock_) {
672*795d594fSAndroid Build Coastguard Worker     ThreadExitFlag tef;
673*795d594fSAndroid Build Coastguard Worker     NotifyOnThreadExit(&tef);
674*795d594fSAndroid Build Coastguard Worker     mirror::Object* result = LockedGetPeerFromOtherThread(&tef);
675*795d594fSAndroid Build Coastguard Worker     UnregisterThreadExitFlag(&tef);
676*795d594fSAndroid Build Coastguard Worker     return result;
677*795d594fSAndroid Build Coastguard Worker   }
678*795d594fSAndroid Build Coastguard Worker 
HasPeer()679*795d594fSAndroid Build Coastguard Worker   bool HasPeer() const {
680*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.jpeer != nullptr || tlsPtr_.opeer != nullptr;
681*795d594fSAndroid Build Coastguard Worker   }
682*795d594fSAndroid Build Coastguard Worker 
GetStats()683*795d594fSAndroid Build Coastguard Worker   RuntimeStats* GetStats() {
684*795d594fSAndroid Build Coastguard Worker     return &tls64_.stats;
685*795d594fSAndroid Build Coastguard Worker   }
686*795d594fSAndroid Build Coastguard Worker 
687*795d594fSAndroid Build Coastguard Worker   bool IsStillStarting() const;
688*795d594fSAndroid Build Coastguard Worker 
IsExceptionPending()689*795d594fSAndroid Build Coastguard Worker   bool IsExceptionPending() const {
690*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.exception != nullptr;
691*795d594fSAndroid Build Coastguard Worker   }
692*795d594fSAndroid Build Coastguard Worker 
IsAsyncExceptionPending()693*795d594fSAndroid Build Coastguard Worker   bool IsAsyncExceptionPending() const {
694*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.async_exception != nullptr;
695*795d594fSAndroid Build Coastguard Worker   }
696*795d594fSAndroid Build Coastguard Worker 
GetException()697*795d594fSAndroid Build Coastguard Worker   mirror::Throwable* GetException() const REQUIRES_SHARED(Locks::mutator_lock_) {
698*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.exception;
699*795d594fSAndroid Build Coastguard Worker   }
700*795d594fSAndroid Build Coastguard Worker 
701*795d594fSAndroid Build Coastguard Worker   void AssertPendingException() const;
702*795d594fSAndroid Build Coastguard Worker   void AssertPendingOOMException() const REQUIRES_SHARED(Locks::mutator_lock_);
703*795d594fSAndroid Build Coastguard Worker   void AssertNoPendingException() const;
704*795d594fSAndroid Build Coastguard Worker   void AssertNoPendingExceptionForNewException(const char* msg) const;
705*795d594fSAndroid Build Coastguard Worker 
706*795d594fSAndroid Build Coastguard Worker   void SetException(ObjPtr<mirror::Throwable> new_exception) REQUIRES_SHARED(Locks::mutator_lock_);
707*795d594fSAndroid Build Coastguard Worker 
708*795d594fSAndroid Build Coastguard Worker   // Set an exception that is asynchronously thrown from a different thread. This will be checked
709*795d594fSAndroid Build Coastguard Worker   // periodically and might overwrite the current 'Exception'. This can only be called from a
710*795d594fSAndroid Build Coastguard Worker   // checkpoint.
711*795d594fSAndroid Build Coastguard Worker   //
712*795d594fSAndroid Build Coastguard Worker   // The caller should also make sure that the thread has been deoptimized so that the exception
713*795d594fSAndroid Build Coastguard Worker   // could be detected on back-edges.
714*795d594fSAndroid Build Coastguard Worker   void SetAsyncException(ObjPtr<mirror::Throwable> new_exception)
715*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
716*795d594fSAndroid Build Coastguard Worker 
ClearException()717*795d594fSAndroid Build Coastguard Worker   void ClearException() REQUIRES_SHARED(Locks::mutator_lock_) {
718*795d594fSAndroid Build Coastguard Worker     tlsPtr_.exception = nullptr;
719*795d594fSAndroid Build Coastguard Worker   }
720*795d594fSAndroid Build Coastguard Worker 
721*795d594fSAndroid Build Coastguard Worker   // Move the current async-exception to the main exception. This should be called when the current
722*795d594fSAndroid Build Coastguard Worker   // thread is ready to deal with any async exceptions. Returns true if there is an async exception
723*795d594fSAndroid Build Coastguard Worker   // that needs to be dealt with, false otherwise.
724*795d594fSAndroid Build Coastguard Worker   bool ObserveAsyncException() REQUIRES_SHARED(Locks::mutator_lock_);
725*795d594fSAndroid Build Coastguard Worker 
726*795d594fSAndroid Build Coastguard Worker   // Find catch block then prepare and return the long jump context to the appropriate exception
727*795d594fSAndroid Build Coastguard Worker   // handler. When is_method_exit_exception is true, the exception was thrown by the method exit
728*795d594fSAndroid Build Coastguard Worker   // callback and we should not send method unwind for the method on top of the stack since method
729*795d594fSAndroid Build Coastguard Worker   // exit callback was already called.
730*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<Context> QuickDeliverException(bool is_method_exit_exception = false)
731*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
732*795d594fSAndroid Build Coastguard Worker 
733*795d594fSAndroid Build Coastguard Worker   // Perform deoptimization. Return a `Context` prepared for a long jump.
734*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<Context> Deoptimize(DeoptimizationKind kind,
735*795d594fSAndroid Build Coastguard Worker                                       bool single_frame,
736*795d594fSAndroid Build Coastguard Worker                                       bool skip_method_exit_callbacks)
737*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
738*795d594fSAndroid Build Coastguard Worker 
739*795d594fSAndroid Build Coastguard Worker   // Get the current method and dex pc. If there are errors in retrieving the dex pc, this will
740*795d594fSAndroid Build Coastguard Worker   // abort the runtime iff abort_on_error is true.
741*795d594fSAndroid Build Coastguard Worker   ArtMethod* GetCurrentMethod(uint32_t* dex_pc,
742*795d594fSAndroid Build Coastguard Worker                               bool check_suspended = true,
743*795d594fSAndroid Build Coastguard Worker                               bool abort_on_error = true) const
744*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
745*795d594fSAndroid Build Coastguard Worker 
746*795d594fSAndroid Build Coastguard Worker   // Returns whether the given exception was thrown by the current Java method being executed
747*795d594fSAndroid Build Coastguard Worker   // (Note that this includes native Java methods).
748*795d594fSAndroid Build Coastguard Worker   bool IsExceptionThrownByCurrentMethod(ObjPtr<mirror::Throwable> exception) const
749*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
750*795d594fSAndroid Build Coastguard Worker 
SetTopOfStack(ArtMethod ** top_method)751*795d594fSAndroid Build Coastguard Worker   void SetTopOfStack(ArtMethod** top_method) {
752*795d594fSAndroid Build Coastguard Worker     tlsPtr_.managed_stack.SetTopQuickFrame(top_method);
753*795d594fSAndroid Build Coastguard Worker   }
754*795d594fSAndroid Build Coastguard Worker 
SetTopOfStackGenericJniTagged(ArtMethod ** top_method)755*795d594fSAndroid Build Coastguard Worker   void SetTopOfStackGenericJniTagged(ArtMethod** top_method) {
756*795d594fSAndroid Build Coastguard Worker     tlsPtr_.managed_stack.SetTopQuickFrameGenericJniTagged(top_method);
757*795d594fSAndroid Build Coastguard Worker   }
758*795d594fSAndroid Build Coastguard Worker 
SetTopOfShadowStack(ShadowFrame * top)759*795d594fSAndroid Build Coastguard Worker   void SetTopOfShadowStack(ShadowFrame* top) {
760*795d594fSAndroid Build Coastguard Worker     tlsPtr_.managed_stack.SetTopShadowFrame(top);
761*795d594fSAndroid Build Coastguard Worker   }
762*795d594fSAndroid Build Coastguard Worker 
HasManagedStack()763*795d594fSAndroid Build Coastguard Worker   bool HasManagedStack() const {
764*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.managed_stack.HasTopQuickFrame() || tlsPtr_.managed_stack.HasTopShadowFrame();
765*795d594fSAndroid Build Coastguard Worker   }
766*795d594fSAndroid Build Coastguard Worker 
767*795d594fSAndroid Build Coastguard Worker   // If 'msg' is null, no detail message is set.
768*795d594fSAndroid Build Coastguard Worker   void ThrowNewException(const char* exception_class_descriptor, const char* msg)
769*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
770*795d594fSAndroid Build Coastguard Worker 
771*795d594fSAndroid Build Coastguard Worker   // If 'msg' is null, no detail message is set. An exception must be pending, and will be
772*795d594fSAndroid Build Coastguard Worker   // used as the new exception's cause.
773*795d594fSAndroid Build Coastguard Worker   void ThrowNewWrappedException(const char* exception_class_descriptor, const char* msg)
774*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
775*795d594fSAndroid Build Coastguard Worker 
776*795d594fSAndroid Build Coastguard Worker   void ThrowNewExceptionF(const char* exception_class_descriptor, const char* fmt, ...)
777*795d594fSAndroid Build Coastguard Worker       __attribute__((format(printf, 3, 4)))
778*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
779*795d594fSAndroid Build Coastguard Worker 
780*795d594fSAndroid Build Coastguard Worker   void ThrowNewExceptionV(const char* exception_class_descriptor, const char* fmt, va_list ap)
781*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
782*795d594fSAndroid Build Coastguard Worker 
783*795d594fSAndroid Build Coastguard Worker   // OutOfMemoryError is special, because we need to pre-allocate an instance.
784*795d594fSAndroid Build Coastguard Worker   // Only the GC should call this.
785*795d594fSAndroid Build Coastguard Worker   void ThrowOutOfMemoryError(const char* msg) REQUIRES_SHARED(Locks::mutator_lock_)
786*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
787*795d594fSAndroid Build Coastguard Worker 
788*795d594fSAndroid Build Coastguard Worker   static void Startup();
789*795d594fSAndroid Build Coastguard Worker   static void FinishStartup();
790*795d594fSAndroid Build Coastguard Worker   static void Shutdown();
791*795d594fSAndroid Build Coastguard Worker 
792*795d594fSAndroid Build Coastguard Worker   // Notify this thread's thread-group that this thread has started.
793*795d594fSAndroid Build Coastguard Worker   // Note: the given thread-group is used as a fast path and verified in debug build. If the value
794*795d594fSAndroid Build Coastguard Worker   //       is null, the thread's thread-group is loaded from the peer.
795*795d594fSAndroid Build Coastguard Worker   void NotifyThreadGroup(ScopedObjectAccessAlreadyRunnable& soa, jobject thread_group = nullptr)
796*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
797*795d594fSAndroid Build Coastguard Worker 
798*795d594fSAndroid Build Coastguard Worker   // Request notification when this thread is unregistered, typically because it has exited.
799*795d594fSAndroid Build Coastguard Worker   //
800*795d594fSAndroid Build Coastguard Worker   // The ThreadExitFlag status is only changed when we remove the thread from the thread list,
801*795d594fSAndroid Build Coastguard Worker   // which we only do once no suspend requests are outstanding, and no flip-functions are still
802*795d594fSAndroid Build Coastguard Worker   // running.
803*795d594fSAndroid Build Coastguard Worker   //
804*795d594fSAndroid Build Coastguard Worker   // The caller must allocate a fresh ThreadExitFlag, and pass it in. The caller is responsible
805*795d594fSAndroid Build Coastguard Worker   // for either waiting until the thread has exited, or unregistering the ThreadExitFlag, and
806*795d594fSAndroid Build Coastguard Worker   // then, and only then, deallocating the ThreadExitFlag.  (This scheme avoids an allocation and
807*795d594fSAndroid Build Coastguard Worker   // questions about what to do if the allocation fails. Allows detection of thread exit after
808*795d594fSAndroid Build Coastguard Worker   // temporary release of thread_list_lock_)
809*795d594fSAndroid Build Coastguard Worker   void NotifyOnThreadExit(ThreadExitFlag* tef) REQUIRES(Locks::thread_list_lock_);
810*795d594fSAndroid Build Coastguard Worker   void UnregisterThreadExitFlag(ThreadExitFlag* tef) REQUIRES(Locks::thread_list_lock_);
811*795d594fSAndroid Build Coastguard Worker 
812*795d594fSAndroid Build Coastguard Worker   // Is the ThreadExitFlag currently registered in this thread, which has not yet terminated?
813*795d594fSAndroid Build Coastguard Worker   // Intended only for testing.
814*795d594fSAndroid Build Coastguard Worker   bool IsRegistered(ThreadExitFlag* query_tef) REQUIRES(Locks::thread_list_lock_);
815*795d594fSAndroid Build Coastguard Worker 
816*795d594fSAndroid Build Coastguard Worker   // For debuggable builds, CHECK that neither first nor last, nor any ThreadExitFlag with an
817*795d594fSAndroid Build Coastguard Worker   // address in-between, is currently registered with any thread.
818*795d594fSAndroid Build Coastguard Worker   static void DCheckUnregisteredEverywhere(ThreadExitFlag* first, ThreadExitFlag* last)
819*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_list_lock_);
820*795d594fSAndroid Build Coastguard Worker 
821*795d594fSAndroid Build Coastguard Worker   // Called when thread is unregistered. May be called repeatedly, in which case only newly
822*795d594fSAndroid Build Coastguard Worker   // registered clients are processed.
823*795d594fSAndroid Build Coastguard Worker   void SignalExitFlags() REQUIRES(Locks::thread_list_lock_);
824*795d594fSAndroid Build Coastguard Worker 
825*795d594fSAndroid Build Coastguard Worker   // JNI methods
GetJniEnv()826*795d594fSAndroid Build Coastguard Worker   JNIEnvExt* GetJniEnv() const {
827*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.jni_env;
828*795d594fSAndroid Build Coastguard Worker   }
829*795d594fSAndroid Build Coastguard Worker 
830*795d594fSAndroid Build Coastguard Worker   // Convert a jobject into a Object*
831*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> DecodeJObject(jobject obj) const REQUIRES_SHARED(Locks::mutator_lock_);
832*795d594fSAndroid Build Coastguard Worker   // Checks if the weak global ref has been cleared by the GC without decoding it.
833*795d594fSAndroid Build Coastguard Worker   bool IsJWeakCleared(jweak obj) const REQUIRES_SHARED(Locks::mutator_lock_);
834*795d594fSAndroid Build Coastguard Worker 
GetMonitorEnterObject()835*795d594fSAndroid Build Coastguard Worker   mirror::Object* GetMonitorEnterObject() const REQUIRES_SHARED(Locks::mutator_lock_) {
836*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.monitor_enter_object;
837*795d594fSAndroid Build Coastguard Worker   }
838*795d594fSAndroid Build Coastguard Worker 
SetMonitorEnterObject(mirror::Object * obj)839*795d594fSAndroid Build Coastguard Worker   void SetMonitorEnterObject(mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_) {
840*795d594fSAndroid Build Coastguard Worker     tlsPtr_.monitor_enter_object = obj;
841*795d594fSAndroid Build Coastguard Worker   }
842*795d594fSAndroid Build Coastguard Worker 
843*795d594fSAndroid Build Coastguard Worker   // Implements java.lang.Thread.interrupted.
844*795d594fSAndroid Build Coastguard Worker   bool Interrupted();
845*795d594fSAndroid Build Coastguard Worker   // Implements java.lang.Thread.isInterrupted.
846*795d594fSAndroid Build Coastguard Worker   bool IsInterrupted();
847*795d594fSAndroid Build Coastguard Worker   void Interrupt(Thread* self) REQUIRES(!wait_mutex_);
SetInterrupted(bool i)848*795d594fSAndroid Build Coastguard Worker   void SetInterrupted(bool i) {
849*795d594fSAndroid Build Coastguard Worker     tls32_.interrupted.store(i, std::memory_order_seq_cst);
850*795d594fSAndroid Build Coastguard Worker   }
851*795d594fSAndroid Build Coastguard Worker   void Notify() REQUIRES(!wait_mutex_);
852*795d594fSAndroid Build Coastguard Worker 
PoisonObjectPointers()853*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void PoisonObjectPointers() {
854*795d594fSAndroid Build Coastguard Worker     ++poison_object_cookie_;
855*795d594fSAndroid Build Coastguard Worker   }
856*795d594fSAndroid Build Coastguard Worker 
857*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE static void PoisonObjectPointersIfDebug();
858*795d594fSAndroid Build Coastguard Worker 
GetPoisonObjectCookie()859*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE uintptr_t GetPoisonObjectCookie() const {
860*795d594fSAndroid Build Coastguard Worker     return poison_object_cookie_;
861*795d594fSAndroid Build Coastguard Worker   }
862*795d594fSAndroid Build Coastguard Worker 
863*795d594fSAndroid Build Coastguard Worker   // Parking for 0ns of relative time means an untimed park, negative (though
864*795d594fSAndroid Build Coastguard Worker   // should be handled in java code) returns immediately
865*795d594fSAndroid Build Coastguard Worker   void Park(bool is_absolute, int64_t time) REQUIRES_SHARED(Locks::mutator_lock_);
866*795d594fSAndroid Build Coastguard Worker   void Unpark();
867*795d594fSAndroid Build Coastguard Worker 
868*795d594fSAndroid Build Coastguard Worker  private:
869*795d594fSAndroid Build Coastguard Worker   void NotifyLocked(Thread* self) REQUIRES(wait_mutex_);
870*795d594fSAndroid Build Coastguard Worker 
871*795d594fSAndroid Build Coastguard Worker  public:
GetWaitMutex()872*795d594fSAndroid Build Coastguard Worker   Mutex* GetWaitMutex() const LOCK_RETURNED(wait_mutex_) {
873*795d594fSAndroid Build Coastguard Worker     return wait_mutex_;
874*795d594fSAndroid Build Coastguard Worker   }
875*795d594fSAndroid Build Coastguard Worker 
GetWaitConditionVariable()876*795d594fSAndroid Build Coastguard Worker   ConditionVariable* GetWaitConditionVariable() const REQUIRES(wait_mutex_) {
877*795d594fSAndroid Build Coastguard Worker     return wait_cond_;
878*795d594fSAndroid Build Coastguard Worker   }
879*795d594fSAndroid Build Coastguard Worker 
GetWaitMonitor()880*795d594fSAndroid Build Coastguard Worker   Monitor* GetWaitMonitor() const REQUIRES(wait_mutex_) {
881*795d594fSAndroid Build Coastguard Worker     return wait_monitor_;
882*795d594fSAndroid Build Coastguard Worker   }
883*795d594fSAndroid Build Coastguard Worker 
SetWaitMonitor(Monitor * mon)884*795d594fSAndroid Build Coastguard Worker   void SetWaitMonitor(Monitor* mon) REQUIRES(wait_mutex_) {
885*795d594fSAndroid Build Coastguard Worker     wait_monitor_ = mon;
886*795d594fSAndroid Build Coastguard Worker   }
887*795d594fSAndroid Build Coastguard Worker 
888*795d594fSAndroid Build Coastguard Worker   // Waiter link-list support.
GetWaitNext()889*795d594fSAndroid Build Coastguard Worker   Thread* GetWaitNext() const {
890*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.wait_next;
891*795d594fSAndroid Build Coastguard Worker   }
892*795d594fSAndroid Build Coastguard Worker 
SetWaitNext(Thread * next)893*795d594fSAndroid Build Coastguard Worker   void SetWaitNext(Thread* next) {
894*795d594fSAndroid Build Coastguard Worker     tlsPtr_.wait_next = next;
895*795d594fSAndroid Build Coastguard Worker   }
896*795d594fSAndroid Build Coastguard Worker 
GetClassLoaderOverride()897*795d594fSAndroid Build Coastguard Worker   jobject GetClassLoaderOverride() {
898*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.class_loader_override;
899*795d594fSAndroid Build Coastguard Worker   }
900*795d594fSAndroid Build Coastguard Worker 
901*795d594fSAndroid Build Coastguard Worker   void SetClassLoaderOverride(jobject class_loader_override);
902*795d594fSAndroid Build Coastguard Worker 
903*795d594fSAndroid Build Coastguard Worker   // Create the internal representation of a stack trace, that is more time
904*795d594fSAndroid Build Coastguard Worker   // and space efficient to compute than the StackTraceElement[].
905*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::Object>> CreateInternalStackTrace(
906*795d594fSAndroid Build Coastguard Worker       const ScopedObjectAccessAlreadyRunnable& soa) const
907*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
908*795d594fSAndroid Build Coastguard Worker 
909*795d594fSAndroid Build Coastguard Worker   // Convert an internal stack trace representation (returned by CreateInternalStackTrace) to a
910*795d594fSAndroid Build Coastguard Worker   // StackTraceElement[]. If output_array is null, a new array is created, otherwise as many
911*795d594fSAndroid Build Coastguard Worker   // frames as will fit are written into the given array. If stack_depth is non-null, it's updated
912*795d594fSAndroid Build Coastguard Worker   // with the number of valid frames in the returned array.
913*795d594fSAndroid Build Coastguard Worker   static jobjectArray InternalStackTraceToStackTraceElementArray(
914*795d594fSAndroid Build Coastguard Worker       const ScopedObjectAccessAlreadyRunnable& soa, jobject internal,
915*795d594fSAndroid Build Coastguard Worker       jobjectArray output_array = nullptr, int* stack_depth = nullptr)
916*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
917*795d594fSAndroid Build Coastguard Worker 
918*795d594fSAndroid Build Coastguard Worker   static jint InternalStackTraceToStackFrameInfoArray(
919*795d594fSAndroid Build Coastguard Worker       const ScopedObjectAccessAlreadyRunnable& soa,
920*795d594fSAndroid Build Coastguard Worker       jlong mode,  // See java.lang.StackStreamFactory for the mode flags
921*795d594fSAndroid Build Coastguard Worker       jobject internal,
922*795d594fSAndroid Build Coastguard Worker       jint startLevel,
923*795d594fSAndroid Build Coastguard Worker       jint batchSize,
924*795d594fSAndroid Build Coastguard Worker       jint startIndex,
925*795d594fSAndroid Build Coastguard Worker       jobjectArray output_array)  // java.lang.StackFrameInfo[]
926*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
927*795d594fSAndroid Build Coastguard Worker 
928*795d594fSAndroid Build Coastguard Worker   jobjectArray CreateAnnotatedStackTrace(const ScopedObjectAccessAlreadyRunnable& soa) const
929*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
930*795d594fSAndroid Build Coastguard Worker 
HasDebuggerShadowFrames()931*795d594fSAndroid Build Coastguard Worker   bool HasDebuggerShadowFrames() const {
932*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.frame_id_to_shadow_frame != nullptr;
933*795d594fSAndroid Build Coastguard Worker   }
934*795d594fSAndroid Build Coastguard Worker 
935*795d594fSAndroid Build Coastguard Worker   // This is done by GC using a checkpoint (or in a stop-the-world pause).
936*795d594fSAndroid Build Coastguard Worker   void SweepInterpreterCache(IsMarkedVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
937*795d594fSAndroid Build Coastguard Worker 
938*795d594fSAndroid Build Coastguard Worker   void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
939*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
940*795d594fSAndroid Build Coastguard Worker 
941*795d594fSAndroid Build Coastguard Worker   void VisitReflectiveTargets(ReflectiveValueVisitor* visitor)
942*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::mutator_lock_);
943*795d594fSAndroid Build Coastguard Worker 
944*795d594fSAndroid Build Coastguard Worker   // Check that the thread state is valid. Try to fail if the thread has erroneously terminated.
945*795d594fSAndroid Build Coastguard Worker   // Note that once the thread has been terminated, it can also be deallocated.  But even if the
946*795d594fSAndroid Build Coastguard Worker   // thread state has been overwritten, the value is unlikely to be in the correct range.
VerifyState()947*795d594fSAndroid Build Coastguard Worker   void VerifyState() {
948*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
949*795d594fSAndroid Build Coastguard Worker       ThreadState state = GetState();
950*795d594fSAndroid Build Coastguard Worker       StateAndFlags::ValidateThreadState(state);
951*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(state, ThreadState::kTerminated);
952*795d594fSAndroid Build Coastguard Worker     }
953*795d594fSAndroid Build Coastguard Worker   }
954*795d594fSAndroid Build Coastguard Worker 
VerifyStack()955*795d594fSAndroid Build Coastguard Worker   void VerifyStack() REQUIRES_SHARED(Locks::mutator_lock_) {
956*795d594fSAndroid Build Coastguard Worker     if (kVerifyStack) {
957*795d594fSAndroid Build Coastguard Worker       VerifyStackImpl();
958*795d594fSAndroid Build Coastguard Worker     }
959*795d594fSAndroid Build Coastguard Worker   }
960*795d594fSAndroid Build Coastguard Worker 
961*795d594fSAndroid Build Coastguard Worker   //
962*795d594fSAndroid Build Coastguard Worker   // Offsets of various members of native Thread class, used by compiled code.
963*795d594fSAndroid Build Coastguard Worker   //
964*795d594fSAndroid Build Coastguard Worker 
965*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThinLockIdOffset()966*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThinLockIdOffset() {
967*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
968*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
969*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, thin_lock_thread_id));
970*795d594fSAndroid Build Coastguard Worker   }
971*795d594fSAndroid Build Coastguard Worker 
972*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
TidOffset()973*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TidOffset() {
974*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
975*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
976*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, tid));
977*795d594fSAndroid Build Coastguard Worker   }
978*795d594fSAndroid Build Coastguard Worker 
979*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
InterruptedOffset()980*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> InterruptedOffset() {
981*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
982*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
983*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, interrupted));
984*795d594fSAndroid Build Coastguard Worker   }
985*795d594fSAndroid Build Coastguard Worker 
986*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
WeakRefAccessEnabledOffset()987*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> WeakRefAccessEnabledOffset() {
988*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
989*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
990*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, weak_ref_access_enabled));
991*795d594fSAndroid Build Coastguard Worker   }
992*795d594fSAndroid Build Coastguard Worker 
993*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadFlagsOffset()994*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadFlagsOffset() {
995*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
996*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
997*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, state_and_flags));
998*795d594fSAndroid Build Coastguard Worker   }
999*795d594fSAndroid Build Coastguard Worker 
1000*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
IsGcMarkingOffset()1001*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> IsGcMarkingOffset() {
1002*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
1003*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
1004*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, is_gc_marking));
1005*795d594fSAndroid Build Coastguard Worker   }
1006*795d594fSAndroid Build Coastguard Worker 
1007*795d594fSAndroid Build Coastguard Worker   template <PointerSize pointer_size>
DeoptCheckRequiredOffset()1008*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> DeoptCheckRequiredOffset() {
1009*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
1010*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
1011*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, is_deopt_check_required));
1012*795d594fSAndroid Build Coastguard Worker   }
1013*795d594fSAndroid Build Coastguard Worker 
IsGcMarkingSize()1014*795d594fSAndroid Build Coastguard Worker   static constexpr size_t IsGcMarkingSize() {
1015*795d594fSAndroid Build Coastguard Worker     return sizeof(tls32_.is_gc_marking);
1016*795d594fSAndroid Build Coastguard Worker   }
1017*795d594fSAndroid Build Coastguard Worker 
1018*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
SharedMethodHotnessOffset()1019*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> SharedMethodHotnessOffset() {
1020*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(
1021*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(Thread, tls32_) +
1022*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_32bit_sized_values, shared_method_hotness));
1023*795d594fSAndroid Build Coastguard Worker   }
1024*795d594fSAndroid Build Coastguard Worker 
1025*795d594fSAndroid Build Coastguard Worker   // Deoptimize the Java stack.
1026*795d594fSAndroid Build Coastguard Worker   void DeoptimizeWithDeoptimizationException(JValue* result) REQUIRES_SHARED(Locks::mutator_lock_);
1027*795d594fSAndroid Build Coastguard Worker 
1028*795d594fSAndroid Build Coastguard Worker  private:
1029*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadOffsetFromTlsPtr(size_t tls_ptr_offset)1030*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadOffsetFromTlsPtr(size_t tls_ptr_offset) {
1031*795d594fSAndroid Build Coastguard Worker     size_t base = OFFSETOF_MEMBER(Thread, tlsPtr_);
1032*795d594fSAndroid Build Coastguard Worker     size_t scale = (pointer_size > kRuntimePointerSize) ?
1033*795d594fSAndroid Build Coastguard Worker       static_cast<size_t>(pointer_size) / static_cast<size_t>(kRuntimePointerSize) : 1;
1034*795d594fSAndroid Build Coastguard Worker     size_t shrink = (kRuntimePointerSize > pointer_size) ?
1035*795d594fSAndroid Build Coastguard Worker       static_cast<size_t>(kRuntimePointerSize) / static_cast<size_t>(pointer_size) : 1;
1036*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(base + ((tls_ptr_offset * scale) / shrink));
1037*795d594fSAndroid Build Coastguard Worker   }
1038*795d594fSAndroid Build Coastguard Worker 
1039*795d594fSAndroid Build Coastguard Worker  public:
1040*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
QuickEntryPointOffset(size_t quick_entrypoint_offset)1041*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> QuickEntryPointOffset(
1042*795d594fSAndroid Build Coastguard Worker       size_t quick_entrypoint_offset) {
1043*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1044*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, quick_entrypoints) + quick_entrypoint_offset);
1045*795d594fSAndroid Build Coastguard Worker   }
1046*795d594fSAndroid Build Coastguard Worker 
QuickEntryPointOffsetWithSize(size_t quick_entrypoint_offset,PointerSize pointer_size)1047*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t QuickEntryPointOffsetWithSize(size_t quick_entrypoint_offset,
1048*795d594fSAndroid Build Coastguard Worker                                                           PointerSize pointer_size) {
1049*795d594fSAndroid Build Coastguard Worker     if (pointer_size == PointerSize::k32) {
1050*795d594fSAndroid Build Coastguard Worker       return QuickEntryPointOffset<PointerSize::k32>(quick_entrypoint_offset).
1051*795d594fSAndroid Build Coastguard Worker           Uint32Value();
1052*795d594fSAndroid Build Coastguard Worker     } else {
1053*795d594fSAndroid Build Coastguard Worker       return QuickEntryPointOffset<PointerSize::k64>(quick_entrypoint_offset).
1054*795d594fSAndroid Build Coastguard Worker           Uint32Value();
1055*795d594fSAndroid Build Coastguard Worker     }
1056*795d594fSAndroid Build Coastguard Worker   }
1057*795d594fSAndroid Build Coastguard Worker 
1058*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
JniEntryPointOffset(size_t jni_entrypoint_offset)1059*795d594fSAndroid Build Coastguard Worker   static ThreadOffset<pointer_size> JniEntryPointOffset(size_t jni_entrypoint_offset) {
1060*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1061*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, jni_entrypoints) + jni_entrypoint_offset);
1062*795d594fSAndroid Build Coastguard Worker   }
1063*795d594fSAndroid Build Coastguard Worker 
1064*795d594fSAndroid Build Coastguard Worker   // Return the entry point offset integer value for ReadBarrierMarkRegX, where X is `reg`.
1065*795d594fSAndroid Build Coastguard Worker   template <PointerSize pointer_size>
ReadBarrierMarkEntryPointsOffset(size_t reg)1066*795d594fSAndroid Build Coastguard Worker   static constexpr int32_t ReadBarrierMarkEntryPointsOffset(size_t reg) {
1067*795d594fSAndroid Build Coastguard Worker     // The entry point list defines 30 ReadBarrierMarkRegX entry points.
1068*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, 30u);
1069*795d594fSAndroid Build Coastguard Worker     // The ReadBarrierMarkRegX entry points are ordered by increasing
1070*795d594fSAndroid Build Coastguard Worker     // register number in Thread::tls_Ptr_.quick_entrypoints.
1071*795d594fSAndroid Build Coastguard Worker     return QUICK_ENTRYPOINT_OFFSET(pointer_size, pReadBarrierMarkReg00).Int32Value()
1072*795d594fSAndroid Build Coastguard Worker         + static_cast<size_t>(pointer_size) * reg;
1073*795d594fSAndroid Build Coastguard Worker   }
1074*795d594fSAndroid Build Coastguard Worker 
1075*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
SelfOffset()1076*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> SelfOffset() {
1077*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, self));
1078*795d594fSAndroid Build Coastguard Worker   }
1079*795d594fSAndroid Build Coastguard Worker 
1080*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ExceptionOffset()1081*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ExceptionOffset() {
1082*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, exception));
1083*795d594fSAndroid Build Coastguard Worker   }
1084*795d594fSAndroid Build Coastguard Worker 
1085*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
PeerOffset()1086*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> PeerOffset() {
1087*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, opeer));
1088*795d594fSAndroid Build Coastguard Worker   }
1089*795d594fSAndroid Build Coastguard Worker 
1090*795d594fSAndroid Build Coastguard Worker 
1091*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
CardTableOffset()1092*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> CardTableOffset() {
1093*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values, card_table));
1094*795d594fSAndroid Build Coastguard Worker   }
1095*795d594fSAndroid Build Coastguard Worker 
1096*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadSuspendTriggerOffset()1097*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadSuspendTriggerOffset() {
1098*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1099*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, suspend_trigger));
1100*795d594fSAndroid Build Coastguard Worker   }
1101*795d594fSAndroid Build Coastguard Worker 
1102*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadLocalPosOffset()1103*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadLocalPosOffset() {
1104*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1105*795d594fSAndroid Build Coastguard Worker                                                                 thread_local_pos));
1106*795d594fSAndroid Build Coastguard Worker   }
1107*795d594fSAndroid Build Coastguard Worker 
1108*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadLocalEndOffset()1109*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadLocalEndOffset() {
1110*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1111*795d594fSAndroid Build Coastguard Worker                                                                 thread_local_end));
1112*795d594fSAndroid Build Coastguard Worker   }
1113*795d594fSAndroid Build Coastguard Worker 
1114*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadLocalObjectsOffset()1115*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadLocalObjectsOffset() {
1116*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1117*795d594fSAndroid Build Coastguard Worker                                                                 thread_local_objects));
1118*795d594fSAndroid Build Coastguard Worker   }
1119*795d594fSAndroid Build Coastguard Worker 
1120*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
RosAllocRunsOffset()1121*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> RosAllocRunsOffset() {
1122*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1123*795d594fSAndroid Build Coastguard Worker                                                                 rosalloc_runs));
1124*795d594fSAndroid Build Coastguard Worker   }
1125*795d594fSAndroid Build Coastguard Worker 
1126*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadLocalAllocStackTopOffset()1127*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadLocalAllocStackTopOffset() {
1128*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1129*795d594fSAndroid Build Coastguard Worker                                                                 thread_local_alloc_stack_top));
1130*795d594fSAndroid Build Coastguard Worker   }
1131*795d594fSAndroid Build Coastguard Worker 
1132*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
ThreadLocalAllocStackEndOffset()1133*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> ThreadLocalAllocStackEndOffset() {
1134*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1135*795d594fSAndroid Build Coastguard Worker                                                                 thread_local_alloc_stack_end));
1136*795d594fSAndroid Build Coastguard Worker   }
1137*795d594fSAndroid Build Coastguard Worker 
1138*795d594fSAndroid Build Coastguard Worker   template <PointerSize pointer_size>
TraceBufferCurrPtrOffset()1139*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TraceBufferCurrPtrOffset() {
1140*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1141*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, method_trace_buffer_curr_entry));
1142*795d594fSAndroid Build Coastguard Worker   }
1143*795d594fSAndroid Build Coastguard Worker 
1144*795d594fSAndroid Build Coastguard Worker   template <PointerSize pointer_size>
TraceBufferPtrOffset()1145*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TraceBufferPtrOffset() {
1146*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1147*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, method_trace_buffer));
1148*795d594fSAndroid Build Coastguard Worker   }
1149*795d594fSAndroid Build Coastguard Worker 
1150*795d594fSAndroid Build Coastguard Worker   // Size of stack less any space reserved for stack overflow
1151*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
GetUsableStackSize()1152*795d594fSAndroid Build Coastguard Worker   size_t GetUsableStackSize() const {
1153*795d594fSAndroid Build Coastguard Worker     return GetStackSize<stack_type>() - static_cast<size_t>(
1154*795d594fSAndroid Build Coastguard Worker         GetStackEnd<stack_type>() - GetStackBegin<stack_type>());
1155*795d594fSAndroid Build Coastguard Worker   }
1156*795d594fSAndroid Build Coastguard Worker 
1157*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1158*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE uint8_t* GetStackEnd() const;
1159*795d594fSAndroid Build Coastguard Worker 
1160*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE uint8_t* GetStackEndForInterpreter(bool implicit_overflow_check) const;
1161*795d594fSAndroid Build Coastguard Worker 
1162*795d594fSAndroid Build Coastguard Worker   // Set the stack end to that to be used during a stack overflow
1163*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1164*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void SetStackEndForStackOverflow()
1165*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1166*795d594fSAndroid Build Coastguard Worker 
1167*795d594fSAndroid Build Coastguard Worker   // Set the stack end to that to be used during regular execution
1168*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1169*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void ResetDefaultStackEnd();
1170*795d594fSAndroid Build Coastguard Worker 
1171*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
IsHandlingStackOverflow()1172*795d594fSAndroid Build Coastguard Worker   bool IsHandlingStackOverflow() const {
1173*795d594fSAndroid Build Coastguard Worker     return GetStackEnd<stack_type>() == GetStackBegin<stack_type>();
1174*795d594fSAndroid Build Coastguard Worker   }
1175*795d594fSAndroid Build Coastguard Worker 
1176*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
StackEndOffset()1177*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> StackEndOffset() {
1178*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1179*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, stack_end));
1180*795d594fSAndroid Build Coastguard Worker   }
1181*795d594fSAndroid Build Coastguard Worker 
1182*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
JniEnvOffset()1183*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> JniEnvOffset() {
1184*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1185*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, jni_env));
1186*795d594fSAndroid Build Coastguard Worker   }
1187*795d594fSAndroid Build Coastguard Worker 
1188*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
TopOfManagedStackOffset()1189*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TopOfManagedStackOffset() {
1190*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1191*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, managed_stack) +
1192*795d594fSAndroid Build Coastguard Worker         ManagedStack::TaggedTopQuickFrameOffset());
1193*795d594fSAndroid Build Coastguard Worker   }
1194*795d594fSAndroid Build Coastguard Worker 
GetManagedStack()1195*795d594fSAndroid Build Coastguard Worker   const ManagedStack* GetManagedStack() const {
1196*795d594fSAndroid Build Coastguard Worker     return &tlsPtr_.managed_stack;
1197*795d594fSAndroid Build Coastguard Worker   }
1198*795d594fSAndroid Build Coastguard Worker 
1199*795d594fSAndroid Build Coastguard Worker   // Linked list recording fragments of managed stack.
PushManagedStackFragment(ManagedStack * fragment)1200*795d594fSAndroid Build Coastguard Worker   void PushManagedStackFragment(ManagedStack* fragment) {
1201*795d594fSAndroid Build Coastguard Worker     tlsPtr_.managed_stack.PushManagedStackFragment(fragment);
1202*795d594fSAndroid Build Coastguard Worker   }
PopManagedStackFragment(const ManagedStack & fragment)1203*795d594fSAndroid Build Coastguard Worker   void PopManagedStackFragment(const ManagedStack& fragment) {
1204*795d594fSAndroid Build Coastguard Worker     tlsPtr_.managed_stack.PopManagedStackFragment(fragment);
1205*795d594fSAndroid Build Coastguard Worker   }
1206*795d594fSAndroid Build Coastguard Worker 
1207*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ShadowFrame* PushShadowFrame(ShadowFrame* new_top_frame);
1208*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ShadowFrame* PopShadowFrame();
1209*795d594fSAndroid Build Coastguard Worker 
1210*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
TopShadowFrameOffset()1211*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TopShadowFrameOffset() {
1212*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(
1213*795d594fSAndroid Build Coastguard Worker         OFFSETOF_MEMBER(tls_ptr_sized_values, managed_stack) +
1214*795d594fSAndroid Build Coastguard Worker         ManagedStack::TopShadowFrameOffset());
1215*795d594fSAndroid Build Coastguard Worker   }
1216*795d594fSAndroid Build Coastguard Worker 
1217*795d594fSAndroid Build Coastguard Worker   // Is the given object on the quick stack?
1218*795d594fSAndroid Build Coastguard Worker   bool IsRawObjOnQuickStack(uint8_t* raw_obj) const;
1219*795d594fSAndroid Build Coastguard Worker 
1220*795d594fSAndroid Build Coastguard Worker   // Is the given obj in one of this thread's JNI transition frames?
1221*795d594fSAndroid Build Coastguard Worker   bool IsJniTransitionReference(jobject obj) const REQUIRES_SHARED(Locks::mutator_lock_);
1222*795d594fSAndroid Build Coastguard Worker 
1223*795d594fSAndroid Build Coastguard Worker   // Convert a global (or weak global) jobject into a Object*
1224*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> DecodeGlobalJObject(jobject obj) const
1225*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1226*795d594fSAndroid Build Coastguard Worker 
1227*795d594fSAndroid Build Coastguard Worker   void HandleScopeVisitRoots(RootVisitor* visitor, uint32_t thread_id)
1228*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1229*795d594fSAndroid Build Coastguard Worker 
GetTopHandleScope()1230*795d594fSAndroid Build Coastguard Worker   BaseHandleScope* GetTopHandleScope() REQUIRES_SHARED(Locks::mutator_lock_) {
1231*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.top_handle_scope;
1232*795d594fSAndroid Build Coastguard Worker   }
1233*795d594fSAndroid Build Coastguard Worker 
PushHandleScope(BaseHandleScope * handle_scope)1234*795d594fSAndroid Build Coastguard Worker   void PushHandleScope(BaseHandleScope* handle_scope) REQUIRES_SHARED(Locks::mutator_lock_) {
1235*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(handle_scope->GetLink(), tlsPtr_.top_handle_scope);
1236*795d594fSAndroid Build Coastguard Worker     tlsPtr_.top_handle_scope = handle_scope;
1237*795d594fSAndroid Build Coastguard Worker   }
1238*795d594fSAndroid Build Coastguard Worker 
PopHandleScope()1239*795d594fSAndroid Build Coastguard Worker   BaseHandleScope* PopHandleScope() REQUIRES_SHARED(Locks::mutator_lock_) {
1240*795d594fSAndroid Build Coastguard Worker     BaseHandleScope* handle_scope = tlsPtr_.top_handle_scope;
1241*795d594fSAndroid Build Coastguard Worker     DCHECK(handle_scope != nullptr);
1242*795d594fSAndroid Build Coastguard Worker     tlsPtr_.top_handle_scope = tlsPtr_.top_handle_scope->GetLink();
1243*795d594fSAndroid Build Coastguard Worker     return handle_scope;
1244*795d594fSAndroid Build Coastguard Worker   }
1245*795d594fSAndroid Build Coastguard Worker 
1246*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
TopHandleScopeOffset()1247*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> TopHandleScopeOffset() {
1248*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1249*795d594fSAndroid Build Coastguard Worker                                                                 top_handle_scope));
1250*795d594fSAndroid Build Coastguard Worker   }
1251*795d594fSAndroid Build Coastguard Worker 
1252*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
MutatorLockOffset()1253*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> MutatorLockOffset() {
1254*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1255*795d594fSAndroid Build Coastguard Worker                                                                 mutator_lock));
1256*795d594fSAndroid Build Coastguard Worker   }
1257*795d594fSAndroid Build Coastguard Worker 
1258*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
HeldMutexOffset(LockLevel level)1259*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> HeldMutexOffset(LockLevel level) {
1260*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(enum_cast<size_t>(level), arraysize(tlsPtr_.held_mutexes));
1261*795d594fSAndroid Build Coastguard Worker     return ThreadOffsetFromTlsPtr<pointer_size>(OFFSETOF_MEMBER(tls_ptr_sized_values,
1262*795d594fSAndroid Build Coastguard Worker                                                                 held_mutexes[level]));
1263*795d594fSAndroid Build Coastguard Worker   }
1264*795d594fSAndroid Build Coastguard Worker 
GetTopReflectiveHandleScope()1265*795d594fSAndroid Build Coastguard Worker   BaseReflectiveHandleScope* GetTopReflectiveHandleScope() {
1266*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.top_reflective_handle_scope;
1267*795d594fSAndroid Build Coastguard Worker   }
1268*795d594fSAndroid Build Coastguard Worker 
PushReflectiveHandleScope(BaseReflectiveHandleScope * scope)1269*795d594fSAndroid Build Coastguard Worker   void PushReflectiveHandleScope(BaseReflectiveHandleScope* scope) {
1270*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(scope->GetLink(), tlsPtr_.top_reflective_handle_scope);
1271*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(scope->GetThread(), this);
1272*795d594fSAndroid Build Coastguard Worker     tlsPtr_.top_reflective_handle_scope = scope;
1273*795d594fSAndroid Build Coastguard Worker   }
1274*795d594fSAndroid Build Coastguard Worker 
PopReflectiveHandleScope()1275*795d594fSAndroid Build Coastguard Worker   BaseReflectiveHandleScope* PopReflectiveHandleScope() {
1276*795d594fSAndroid Build Coastguard Worker     BaseReflectiveHandleScope* handle_scope = tlsPtr_.top_reflective_handle_scope;
1277*795d594fSAndroid Build Coastguard Worker     DCHECK(handle_scope != nullptr);
1278*795d594fSAndroid Build Coastguard Worker     tlsPtr_.top_reflective_handle_scope = tlsPtr_.top_reflective_handle_scope->GetLink();
1279*795d594fSAndroid Build Coastguard Worker     return handle_scope;
1280*795d594fSAndroid Build Coastguard Worker   }
1281*795d594fSAndroid Build Coastguard Worker 
GetIsGcMarking()1282*795d594fSAndroid Build Coastguard Worker   bool GetIsGcMarking() const {
1283*795d594fSAndroid Build Coastguard Worker     DCHECK(gUseReadBarrier);
1284*795d594fSAndroid Build Coastguard Worker     return tls32_.is_gc_marking;
1285*795d594fSAndroid Build Coastguard Worker   }
1286*795d594fSAndroid Build Coastguard Worker 
1287*795d594fSAndroid Build Coastguard Worker   void SetIsGcMarkingAndUpdateEntrypoints(bool is_marking);
1288*795d594fSAndroid Build Coastguard Worker 
IsDeoptCheckRequired()1289*795d594fSAndroid Build Coastguard Worker   bool IsDeoptCheckRequired() const { return tls32_.is_deopt_check_required; }
1290*795d594fSAndroid Build Coastguard Worker 
SetDeoptCheckRequired(bool flag)1291*795d594fSAndroid Build Coastguard Worker   void SetDeoptCheckRequired(bool flag) { tls32_.is_deopt_check_required = flag; }
1292*795d594fSAndroid Build Coastguard Worker 
1293*795d594fSAndroid Build Coastguard Worker   bool GetWeakRefAccessEnabled() const;  // Only safe for current thread.
1294*795d594fSAndroid Build Coastguard Worker 
SetWeakRefAccessEnabled(bool enabled)1295*795d594fSAndroid Build Coastguard Worker   void SetWeakRefAccessEnabled(bool enabled) {
1296*795d594fSAndroid Build Coastguard Worker     DCHECK(gUseReadBarrier);
1297*795d594fSAndroid Build Coastguard Worker     WeakRefAccessState new_state = enabled ?
1298*795d594fSAndroid Build Coastguard Worker         WeakRefAccessState::kEnabled : WeakRefAccessState::kDisabled;
1299*795d594fSAndroid Build Coastguard Worker     tls32_.weak_ref_access_enabled.store(new_state, std::memory_order_release);
1300*795d594fSAndroid Build Coastguard Worker   }
1301*795d594fSAndroid Build Coastguard Worker 
GetDisableThreadFlipCount()1302*795d594fSAndroid Build Coastguard Worker   uint32_t GetDisableThreadFlipCount() const {
1303*795d594fSAndroid Build Coastguard Worker     return tls32_.disable_thread_flip_count;
1304*795d594fSAndroid Build Coastguard Worker   }
1305*795d594fSAndroid Build Coastguard Worker 
IncrementDisableThreadFlipCount()1306*795d594fSAndroid Build Coastguard Worker   void IncrementDisableThreadFlipCount() {
1307*795d594fSAndroid Build Coastguard Worker     ++tls32_.disable_thread_flip_count;
1308*795d594fSAndroid Build Coastguard Worker   }
1309*795d594fSAndroid Build Coastguard Worker 
DecrementDisableThreadFlipCount()1310*795d594fSAndroid Build Coastguard Worker   void DecrementDisableThreadFlipCount() {
1311*795d594fSAndroid Build Coastguard Worker     DCHECK_GT(tls32_.disable_thread_flip_count, 0U);
1312*795d594fSAndroid Build Coastguard Worker     --tls32_.disable_thread_flip_count;
1313*795d594fSAndroid Build Coastguard Worker   }
1314*795d594fSAndroid Build Coastguard Worker 
1315*795d594fSAndroid Build Coastguard Worker   // Returns true if the thread is a runtime thread (eg from a ThreadPool).
IsRuntimeThread()1316*795d594fSAndroid Build Coastguard Worker   bool IsRuntimeThread() const {
1317*795d594fSAndroid Build Coastguard Worker     return is_runtime_thread_;
1318*795d594fSAndroid Build Coastguard Worker   }
1319*795d594fSAndroid Build Coastguard Worker 
SetIsRuntimeThread(bool is_runtime_thread)1320*795d594fSAndroid Build Coastguard Worker   void SetIsRuntimeThread(bool is_runtime_thread) {
1321*795d594fSAndroid Build Coastguard Worker     is_runtime_thread_ = is_runtime_thread;
1322*795d594fSAndroid Build Coastguard Worker   }
1323*795d594fSAndroid Build Coastguard Worker 
CorePlatformApiCookie()1324*795d594fSAndroid Build Coastguard Worker   uint32_t CorePlatformApiCookie() {
1325*795d594fSAndroid Build Coastguard Worker     return core_platform_api_cookie_;
1326*795d594fSAndroid Build Coastguard Worker   }
1327*795d594fSAndroid Build Coastguard Worker 
SetCorePlatformApiCookie(uint32_t cookie)1328*795d594fSAndroid Build Coastguard Worker   void SetCorePlatformApiCookie(uint32_t cookie) {
1329*795d594fSAndroid Build Coastguard Worker     core_platform_api_cookie_ = cookie;
1330*795d594fSAndroid Build Coastguard Worker   }
1331*795d594fSAndroid Build Coastguard Worker 
1332*795d594fSAndroid Build Coastguard Worker   // Returns true if the thread is allowed to load java classes.
1333*795d594fSAndroid Build Coastguard Worker   bool CanLoadClasses() const;
1334*795d594fSAndroid Build Coastguard Worker 
1335*795d594fSAndroid Build Coastguard Worker   // Returns the fake exception used to activate deoptimization.
GetDeoptimizationException()1336*795d594fSAndroid Build Coastguard Worker   static mirror::Throwable* GetDeoptimizationException() {
1337*795d594fSAndroid Build Coastguard Worker     // Note that the mirror::Throwable must be aligned to kObjectAlignment or else it cannot be
1338*795d594fSAndroid Build Coastguard Worker     // represented by ObjPtr.
1339*795d594fSAndroid Build Coastguard Worker     return reinterpret_cast<mirror::Throwable*>(0x100);
1340*795d594fSAndroid Build Coastguard Worker   }
1341*795d594fSAndroid Build Coastguard Worker 
1342*795d594fSAndroid Build Coastguard Worker   // Currently deoptimization invokes verifier which can trigger class loading
1343*795d594fSAndroid Build Coastguard Worker   // and execute Java code, so there might be nested deoptimizations happening.
1344*795d594fSAndroid Build Coastguard Worker   // We need to save the ongoing deoptimization shadow frames and return
1345*795d594fSAndroid Build Coastguard Worker   // values on stacks.
1346*795d594fSAndroid Build Coastguard Worker   // 'from_code' denotes whether the deoptimization was explicitly made from
1347*795d594fSAndroid Build Coastguard Worker   // compiled code.
1348*795d594fSAndroid Build Coastguard Worker   // 'method_type' contains info on whether deoptimization should advance
1349*795d594fSAndroid Build Coastguard Worker   // dex_pc.
1350*795d594fSAndroid Build Coastguard Worker   void PushDeoptimizationContext(const JValue& return_value,
1351*795d594fSAndroid Build Coastguard Worker                                  bool is_reference,
1352*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::Throwable> exception,
1353*795d594fSAndroid Build Coastguard Worker                                  bool from_code,
1354*795d594fSAndroid Build Coastguard Worker                                  DeoptimizationMethodType method_type)
1355*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1356*795d594fSAndroid Build Coastguard Worker   void PopDeoptimizationContext(JValue* result,
1357*795d594fSAndroid Build Coastguard Worker                                 ObjPtr<mirror::Throwable>* exception,
1358*795d594fSAndroid Build Coastguard Worker                                 bool* from_code,
1359*795d594fSAndroid Build Coastguard Worker                                 DeoptimizationMethodType* method_type)
1360*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1361*795d594fSAndroid Build Coastguard Worker   void AssertHasDeoptimizationContext()
1362*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1363*795d594fSAndroid Build Coastguard Worker   void PushStackedShadowFrame(ShadowFrame* sf, StackedShadowFrameType type);
1364*795d594fSAndroid Build Coastguard Worker   ShadowFrame* PopStackedShadowFrame();
1365*795d594fSAndroid Build Coastguard Worker   ShadowFrame* MaybePopDeoptimizedStackedShadowFrame();
1366*795d594fSAndroid Build Coastguard Worker 
1367*795d594fSAndroid Build Coastguard Worker   // For debugger, find the shadow frame that corresponds to a frame id.
1368*795d594fSAndroid Build Coastguard Worker   // Or return null if there is none.
1369*795d594fSAndroid Build Coastguard Worker   ShadowFrame* FindDebuggerShadowFrame(size_t frame_id)
1370*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1371*795d594fSAndroid Build Coastguard Worker   // For debugger, find the bool array that keeps track of the updated vreg set
1372*795d594fSAndroid Build Coastguard Worker   // for a frame id.
1373*795d594fSAndroid Build Coastguard Worker   bool* GetUpdatedVRegFlags(size_t frame_id) REQUIRES_SHARED(Locks::mutator_lock_);
1374*795d594fSAndroid Build Coastguard Worker   // For debugger, find the shadow frame that corresponds to a frame id. If
1375*795d594fSAndroid Build Coastguard Worker   // one doesn't exist yet, create one and track it in frame_id_to_shadow_frame.
1376*795d594fSAndroid Build Coastguard Worker   ShadowFrame* FindOrCreateDebuggerShadowFrame(size_t frame_id,
1377*795d594fSAndroid Build Coastguard Worker                                                uint32_t num_vregs,
1378*795d594fSAndroid Build Coastguard Worker                                                ArtMethod* method,
1379*795d594fSAndroid Build Coastguard Worker                                                uint32_t dex_pc)
1380*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1381*795d594fSAndroid Build Coastguard Worker 
1382*795d594fSAndroid Build Coastguard Worker   // Delete the entry that maps from frame_id to shadow_frame.
1383*795d594fSAndroid Build Coastguard Worker   void RemoveDebuggerShadowFrameMapping(size_t frame_id)
1384*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1385*795d594fSAndroid Build Coastguard Worker 
GetStackTraceSample()1386*795d594fSAndroid Build Coastguard Worker   std::vector<ArtMethod*>* GetStackTraceSample() const {
1387*795d594fSAndroid Build Coastguard Worker     DCHECK(!IsAotCompiler());
1388*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.deps_or_stack_trace_sample.stack_trace_sample;
1389*795d594fSAndroid Build Coastguard Worker   }
1390*795d594fSAndroid Build Coastguard Worker 
SetStackTraceSample(std::vector<ArtMethod * > * sample)1391*795d594fSAndroid Build Coastguard Worker   void SetStackTraceSample(std::vector<ArtMethod*>* sample) {
1392*795d594fSAndroid Build Coastguard Worker     DCHECK(!IsAotCompiler());
1393*795d594fSAndroid Build Coastguard Worker     tlsPtr_.deps_or_stack_trace_sample.stack_trace_sample = sample;
1394*795d594fSAndroid Build Coastguard Worker   }
1395*795d594fSAndroid Build Coastguard Worker 
GetVerifierDeps()1396*795d594fSAndroid Build Coastguard Worker   verifier::VerifierDeps* GetVerifierDeps() const {
1397*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAotCompiler());
1398*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.deps_or_stack_trace_sample.verifier_deps;
1399*795d594fSAndroid Build Coastguard Worker   }
1400*795d594fSAndroid Build Coastguard Worker 
1401*795d594fSAndroid Build Coastguard Worker   // It is the responsability of the caller to make sure the verifier_deps
1402*795d594fSAndroid Build Coastguard Worker   // entry in the thread is cleared before destruction of the actual VerifierDeps
1403*795d594fSAndroid Build Coastguard Worker   // object, or the thread.
SetVerifierDeps(verifier::VerifierDeps * verifier_deps)1404*795d594fSAndroid Build Coastguard Worker   void SetVerifierDeps(verifier::VerifierDeps* verifier_deps) {
1405*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAotCompiler());
1406*795d594fSAndroid Build Coastguard Worker     DCHECK(verifier_deps == nullptr || tlsPtr_.deps_or_stack_trace_sample.verifier_deps == nullptr);
1407*795d594fSAndroid Build Coastguard Worker     tlsPtr_.deps_or_stack_trace_sample.verifier_deps = verifier_deps;
1408*795d594fSAndroid Build Coastguard Worker   }
1409*795d594fSAndroid Build Coastguard Worker 
GetMethodTraceBuffer()1410*795d594fSAndroid Build Coastguard Worker   uintptr_t* GetMethodTraceBuffer() { return tlsPtr_.method_trace_buffer; }
1411*795d594fSAndroid Build Coastguard Worker 
GetTraceBufferCurrEntryPtr()1412*795d594fSAndroid Build Coastguard Worker   uintptr_t** GetTraceBufferCurrEntryPtr() { return &tlsPtr_.method_trace_buffer_curr_entry; }
1413*795d594fSAndroid Build Coastguard Worker 
SetMethodTraceBuffer(uintptr_t * buffer,int init_index)1414*795d594fSAndroid Build Coastguard Worker   void SetMethodTraceBuffer(uintptr_t* buffer, int init_index) {
1415*795d594fSAndroid Build Coastguard Worker     tlsPtr_.method_trace_buffer = buffer;
1416*795d594fSAndroid Build Coastguard Worker     SetMethodTraceBufferCurrentEntry(init_index);
1417*795d594fSAndroid Build Coastguard Worker   }
1418*795d594fSAndroid Build Coastguard Worker 
SetMethodTraceBufferCurrentEntry(int index)1419*795d594fSAndroid Build Coastguard Worker   void SetMethodTraceBufferCurrentEntry(int index) {
1420*795d594fSAndroid Build Coastguard Worker     uintptr_t* buffer = tlsPtr_.method_trace_buffer;
1421*795d594fSAndroid Build Coastguard Worker     if (buffer == nullptr) {
1422*795d594fSAndroid Build Coastguard Worker       tlsPtr_.method_trace_buffer_curr_entry = nullptr;
1423*795d594fSAndroid Build Coastguard Worker     } else {
1424*795d594fSAndroid Build Coastguard Worker       DCHECK(buffer != nullptr);
1425*795d594fSAndroid Build Coastguard Worker       tlsPtr_.method_trace_buffer_curr_entry = buffer + index;
1426*795d594fSAndroid Build Coastguard Worker     }
1427*795d594fSAndroid Build Coastguard Worker   }
1428*795d594fSAndroid Build Coastguard Worker 
1429*795d594fSAndroid Build Coastguard Worker   void UpdateTlsLowOverheadTraceEntrypoints(bool enable);
1430*795d594fSAndroid Build Coastguard Worker 
GetTraceClockBase()1431*795d594fSAndroid Build Coastguard Worker   uint64_t GetTraceClockBase() const {
1432*795d594fSAndroid Build Coastguard Worker     return tls64_.trace_clock_base;
1433*795d594fSAndroid Build Coastguard Worker   }
1434*795d594fSAndroid Build Coastguard Worker 
SetTraceClockBase(uint64_t clock_base)1435*795d594fSAndroid Build Coastguard Worker   void SetTraceClockBase(uint64_t clock_base) {
1436*795d594fSAndroid Build Coastguard Worker     tls64_.trace_clock_base = clock_base;
1437*795d594fSAndroid Build Coastguard Worker   }
1438*795d594fSAndroid Build Coastguard Worker 
GetHeldMutex(LockLevel level)1439*795d594fSAndroid Build Coastguard Worker   BaseMutex* GetHeldMutex(LockLevel level) const {
1440*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.held_mutexes[level];
1441*795d594fSAndroid Build Coastguard Worker   }
1442*795d594fSAndroid Build Coastguard Worker 
SetHeldMutex(LockLevel level,BaseMutex * mutex)1443*795d594fSAndroid Build Coastguard Worker   void SetHeldMutex(LockLevel level, BaseMutex* mutex) {
1444*795d594fSAndroid Build Coastguard Worker     tlsPtr_.held_mutexes[level] = mutex;
1445*795d594fSAndroid Build Coastguard Worker   }
1446*795d594fSAndroid Build Coastguard Worker 
1447*795d594fSAndroid Build Coastguard Worker   // Possibly check that no mutexes at level kMonitorLock or above are subsequently acquired.
1448*795d594fSAndroid Build Coastguard Worker   // Only invoked by the thread itself.
1449*795d594fSAndroid Build Coastguard Worker   void DisallowPreMonitorMutexes();
1450*795d594fSAndroid Build Coastguard Worker 
1451*795d594fSAndroid Build Coastguard Worker   // Undo the effect of the previous call. Again only invoked by the thread itself.
1452*795d594fSAndroid Build Coastguard Worker   void AllowPreMonitorMutexes();
1453*795d594fSAndroid Build Coastguard Worker 
ReadFlag(ThreadFlag flag)1454*795d594fSAndroid Build Coastguard Worker   bool ReadFlag(ThreadFlag flag) const {
1455*795d594fSAndroid Build Coastguard Worker     return GetStateAndFlags(std::memory_order_relaxed).IsFlagSet(flag);
1456*795d594fSAndroid Build Coastguard Worker   }
1457*795d594fSAndroid Build Coastguard Worker 
1458*795d594fSAndroid Build Coastguard Worker   void AtomicSetFlag(ThreadFlag flag, std::memory_order order = std::memory_order_seq_cst) {
1459*795d594fSAndroid Build Coastguard Worker     // Since we discard the returned value, memory_order_release will often suffice.
1460*795d594fSAndroid Build Coastguard Worker     tls32_.state_and_flags.fetch_or(enum_cast<uint32_t>(flag), order);
1461*795d594fSAndroid Build Coastguard Worker   }
1462*795d594fSAndroid Build Coastguard Worker 
1463*795d594fSAndroid Build Coastguard Worker   void AtomicClearFlag(ThreadFlag flag, std::memory_order order = std::memory_order_seq_cst) {
1464*795d594fSAndroid Build Coastguard Worker     // Since we discard the returned value, memory_order_release will often suffice.
1465*795d594fSAndroid Build Coastguard Worker     tls32_.state_and_flags.fetch_and(~enum_cast<uint32_t>(flag), order);
1466*795d594fSAndroid Build Coastguard Worker   }
1467*795d594fSAndroid Build Coastguard Worker 
1468*795d594fSAndroid Build Coastguard Worker   void ResetQuickAllocEntryPointsForThread();
1469*795d594fSAndroid Build Coastguard Worker 
1470*795d594fSAndroid Build Coastguard Worker   // Returns the remaining space in the TLAB.
TlabSize()1471*795d594fSAndroid Build Coastguard Worker   size_t TlabSize() const {
1472*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_end - tlsPtr_.thread_local_pos;
1473*795d594fSAndroid Build Coastguard Worker   }
1474*795d594fSAndroid Build Coastguard Worker 
1475*795d594fSAndroid Build Coastguard Worker   // Returns pos offset from start.
GetTlabPosOffset()1476*795d594fSAndroid Build Coastguard Worker   size_t GetTlabPosOffset() const {
1477*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_pos - tlsPtr_.thread_local_start;
1478*795d594fSAndroid Build Coastguard Worker   }
1479*795d594fSAndroid Build Coastguard Worker 
1480*795d594fSAndroid Build Coastguard Worker   // Returns the remaining space in the TLAB if we were to expand it to maximum capacity.
TlabRemainingCapacity()1481*795d594fSAndroid Build Coastguard Worker   size_t TlabRemainingCapacity() const {
1482*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_limit - tlsPtr_.thread_local_pos;
1483*795d594fSAndroid Build Coastguard Worker   }
1484*795d594fSAndroid Build Coastguard Worker 
1485*795d594fSAndroid Build Coastguard Worker   // Expand the TLAB by a fixed number of bytes. There must be enough capacity to do so.
ExpandTlab(size_t bytes)1486*795d594fSAndroid Build Coastguard Worker   void ExpandTlab(size_t bytes) {
1487*795d594fSAndroid Build Coastguard Worker     tlsPtr_.thread_local_end += bytes;
1488*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(tlsPtr_.thread_local_end, tlsPtr_.thread_local_limit);
1489*795d594fSAndroid Build Coastguard Worker   }
1490*795d594fSAndroid Build Coastguard Worker 
1491*795d594fSAndroid Build Coastguard Worker   // Called from Concurrent mark-compact GC to slide the TLAB pointers backwards
1492*795d594fSAndroid Build Coastguard Worker   // to adjust to post-compact addresses.
1493*795d594fSAndroid Build Coastguard Worker   void AdjustTlab(size_t slide_bytes);
1494*795d594fSAndroid Build Coastguard Worker 
1495*795d594fSAndroid Build Coastguard Worker   // Doesn't check that there is room.
1496*795d594fSAndroid Build Coastguard Worker   mirror::Object* AllocTlab(size_t bytes);
1497*795d594fSAndroid Build Coastguard Worker   void SetTlab(uint8_t* start, uint8_t* end, uint8_t* limit);
1498*795d594fSAndroid Build Coastguard Worker   bool HasTlab() const;
1499*795d594fSAndroid Build Coastguard Worker   void ResetTlab();
GetTlabStart()1500*795d594fSAndroid Build Coastguard Worker   uint8_t* GetTlabStart() {
1501*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_start;
1502*795d594fSAndroid Build Coastguard Worker   }
GetTlabPos()1503*795d594fSAndroid Build Coastguard Worker   uint8_t* GetTlabPos() {
1504*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_pos;
1505*795d594fSAndroid Build Coastguard Worker   }
GetTlabEnd()1506*795d594fSAndroid Build Coastguard Worker   uint8_t* GetTlabEnd() {
1507*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_end;
1508*795d594fSAndroid Build Coastguard Worker   }
1509*795d594fSAndroid Build Coastguard Worker   // Remove the suspend trigger for this thread by making the suspend_trigger_ TLS value
1510*795d594fSAndroid Build Coastguard Worker   // equal to a valid pointer.
RemoveSuspendTrigger()1511*795d594fSAndroid Build Coastguard Worker   void RemoveSuspendTrigger() {
1512*795d594fSAndroid Build Coastguard Worker     tlsPtr_.suspend_trigger.store(reinterpret_cast<uintptr_t*>(&tlsPtr_.suspend_trigger),
1513*795d594fSAndroid Build Coastguard Worker                                   std::memory_order_relaxed);
1514*795d594fSAndroid Build Coastguard Worker   }
1515*795d594fSAndroid Build Coastguard Worker 
1516*795d594fSAndroid Build Coastguard Worker   // Trigger a suspend check by making the suspend_trigger_ TLS value an invalid pointer.
1517*795d594fSAndroid Build Coastguard Worker   // The next time a suspend check is done, it will load from the value at this address
1518*795d594fSAndroid Build Coastguard Worker   // and trigger a SIGSEGV.
1519*795d594fSAndroid Build Coastguard Worker   // Only needed if Runtime::implicit_suspend_checks_ is true. On some platforms, and in the
1520*795d594fSAndroid Build Coastguard Worker   // interpreter, client code currently just looks at the thread flags directly to determine
1521*795d594fSAndroid Build Coastguard Worker   // whether we should suspend, so this call is not always necessary.
TriggerSuspend()1522*795d594fSAndroid Build Coastguard Worker   void TriggerSuspend() { tlsPtr_.suspend_trigger.store(nullptr, std::memory_order_release); }
1523*795d594fSAndroid Build Coastguard Worker 
1524*795d594fSAndroid Build Coastguard Worker   // Push an object onto the allocation stack.
1525*795d594fSAndroid Build Coastguard Worker   bool PushOnThreadLocalAllocationStack(mirror::Object* obj)
1526*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1527*795d594fSAndroid Build Coastguard Worker 
1528*795d594fSAndroid Build Coastguard Worker   // Set the thread local allocation pointers to the given pointers.
1529*795d594fSAndroid Build Coastguard Worker   void SetThreadLocalAllocationStack(StackReference<mirror::Object>* start,
1530*795d594fSAndroid Build Coastguard Worker                                      StackReference<mirror::Object>* end);
1531*795d594fSAndroid Build Coastguard Worker 
1532*795d594fSAndroid Build Coastguard Worker   // Resets the thread local allocation pointers.
1533*795d594fSAndroid Build Coastguard Worker   void RevokeThreadLocalAllocationStack();
1534*795d594fSAndroid Build Coastguard Worker 
GetThreadLocalBytesAllocated()1535*795d594fSAndroid Build Coastguard Worker   size_t GetThreadLocalBytesAllocated() const {
1536*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_end - tlsPtr_.thread_local_start;
1537*795d594fSAndroid Build Coastguard Worker   }
1538*795d594fSAndroid Build Coastguard Worker 
GetThreadLocalObjectsAllocated()1539*795d594fSAndroid Build Coastguard Worker   size_t GetThreadLocalObjectsAllocated() const {
1540*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.thread_local_objects;
1541*795d594fSAndroid Build Coastguard Worker   }
1542*795d594fSAndroid Build Coastguard Worker 
GetRosAllocRun(size_t index)1543*795d594fSAndroid Build Coastguard Worker   void* GetRosAllocRun(size_t index) const {
1544*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.rosalloc_runs[index];
1545*795d594fSAndroid Build Coastguard Worker   }
1546*795d594fSAndroid Build Coastguard Worker 
SetRosAllocRun(size_t index,void * run)1547*795d594fSAndroid Build Coastguard Worker   void SetRosAllocRun(size_t index, void* run) {
1548*795d594fSAndroid Build Coastguard Worker     tlsPtr_.rosalloc_runs[index] = run;
1549*795d594fSAndroid Build Coastguard Worker   }
1550*795d594fSAndroid Build Coastguard Worker 
1551*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1552*795d594fSAndroid Build Coastguard Worker   bool ProtectStack(bool fatal_on_error = true);
1553*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1554*795d594fSAndroid Build Coastguard Worker   bool UnprotectStack();
1555*795d594fSAndroid Build Coastguard Worker 
DecrementForceInterpreterCount()1556*795d594fSAndroid Build Coastguard Worker   uint32_t DecrementForceInterpreterCount() REQUIRES(Locks::thread_list_lock_) {
1557*795d594fSAndroid Build Coastguard Worker     return --tls32_.force_interpreter_count;
1558*795d594fSAndroid Build Coastguard Worker   }
1559*795d594fSAndroid Build Coastguard Worker 
IncrementForceInterpreterCount()1560*795d594fSAndroid Build Coastguard Worker   uint32_t IncrementForceInterpreterCount() REQUIRES(Locks::thread_list_lock_) {
1561*795d594fSAndroid Build Coastguard Worker     return ++tls32_.force_interpreter_count;
1562*795d594fSAndroid Build Coastguard Worker   }
1563*795d594fSAndroid Build Coastguard Worker 
SetForceInterpreterCount(uint32_t value)1564*795d594fSAndroid Build Coastguard Worker   void SetForceInterpreterCount(uint32_t value) REQUIRES(Locks::thread_list_lock_) {
1565*795d594fSAndroid Build Coastguard Worker     tls32_.force_interpreter_count = value;
1566*795d594fSAndroid Build Coastguard Worker   }
1567*795d594fSAndroid Build Coastguard Worker 
ForceInterpreterCount()1568*795d594fSAndroid Build Coastguard Worker   uint32_t ForceInterpreterCount() const {
1569*795d594fSAndroid Build Coastguard Worker     return tls32_.force_interpreter_count;
1570*795d594fSAndroid Build Coastguard Worker   }
1571*795d594fSAndroid Build Coastguard Worker 
IsForceInterpreter()1572*795d594fSAndroid Build Coastguard Worker   bool IsForceInterpreter() const {
1573*795d594fSAndroid Build Coastguard Worker     return tls32_.force_interpreter_count != 0;
1574*795d594fSAndroid Build Coastguard Worker   }
1575*795d594fSAndroid Build Coastguard Worker 
IncrementMakeVisiblyInitializedCounter()1576*795d594fSAndroid Build Coastguard Worker   bool IncrementMakeVisiblyInitializedCounter() {
1577*795d594fSAndroid Build Coastguard Worker     tls32_.make_visibly_initialized_counter += 1u;
1578*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(tls32_.make_visibly_initialized_counter, kMakeVisiblyInitializedCounterTriggerCount);
1579*795d594fSAndroid Build Coastguard Worker     if (tls32_.make_visibly_initialized_counter == kMakeVisiblyInitializedCounterTriggerCount) {
1580*795d594fSAndroid Build Coastguard Worker       tls32_.make_visibly_initialized_counter = 0u;
1581*795d594fSAndroid Build Coastguard Worker       return true;
1582*795d594fSAndroid Build Coastguard Worker     }
1583*795d594fSAndroid Build Coastguard Worker     return false;
1584*795d594fSAndroid Build Coastguard Worker   }
1585*795d594fSAndroid Build Coastguard Worker 
1586*795d594fSAndroid Build Coastguard Worker   void InitStringEntryPoints();
1587*795d594fSAndroid Build Coastguard Worker 
ModifyDebugDisallowReadBarrier(int8_t delta)1588*795d594fSAndroid Build Coastguard Worker   void ModifyDebugDisallowReadBarrier(int8_t delta) {
1589*795d594fSAndroid Build Coastguard Worker     if (kCheckDebugDisallowReadBarrierCount) {
1590*795d594fSAndroid Build Coastguard Worker       debug_disallow_read_barrier_ += delta;
1591*795d594fSAndroid Build Coastguard Worker     }
1592*795d594fSAndroid Build Coastguard Worker   }
1593*795d594fSAndroid Build Coastguard Worker 
GetDebugDisallowReadBarrierCount()1594*795d594fSAndroid Build Coastguard Worker   uint8_t GetDebugDisallowReadBarrierCount() const {
1595*795d594fSAndroid Build Coastguard Worker     return kCheckDebugDisallowReadBarrierCount ? debug_disallow_read_barrier_ : 0u;
1596*795d594fSAndroid Build Coastguard Worker   }
1597*795d594fSAndroid Build Coastguard Worker 
1598*795d594fSAndroid Build Coastguard Worker   // Gets the current TLSData associated with the key or nullptr if there isn't any. Note that users
1599*795d594fSAndroid Build Coastguard Worker   // do not gain ownership of TLSData and must synchronize with SetCustomTls themselves to prevent
1600*795d594fSAndroid Build Coastguard Worker   // it from being deleted.
1601*795d594fSAndroid Build Coastguard Worker   TLSData* GetCustomTLS(const char* key) REQUIRES(!Locks::custom_tls_lock_);
1602*795d594fSAndroid Build Coastguard Worker 
1603*795d594fSAndroid Build Coastguard Worker   // Sets the tls entry at 'key' to data. The thread takes ownership of the TLSData. The destructor
1604*795d594fSAndroid Build Coastguard Worker   // will be run when the thread exits or when SetCustomTLS is called again with the same key.
1605*795d594fSAndroid Build Coastguard Worker   void SetCustomTLS(const char* key, TLSData* data) REQUIRES(!Locks::custom_tls_lock_);
1606*795d594fSAndroid Build Coastguard Worker 
1607*795d594fSAndroid Build Coastguard Worker   // Returns true if the current thread is the jit sensitive thread.
IsJitSensitiveThread()1608*795d594fSAndroid Build Coastguard Worker   bool IsJitSensitiveThread() const {
1609*795d594fSAndroid Build Coastguard Worker     return this == jit_sensitive_thread_;
1610*795d594fSAndroid Build Coastguard Worker   }
1611*795d594fSAndroid Build Coastguard Worker 
1612*795d594fSAndroid Build Coastguard Worker   bool IsSystemDaemon() const REQUIRES_SHARED(Locks::mutator_lock_);
1613*795d594fSAndroid Build Coastguard Worker 
1614*795d594fSAndroid Build Coastguard Worker   // Cause the 'this' thread to abort the process by sending SIGABRT.  Thus we should get an
1615*795d594fSAndroid Build Coastguard Worker   // asynchronous stack trace for 'this' thread, rather than waiting for it to process a
1616*795d594fSAndroid Build Coastguard Worker   // checkpoint. Useful mostly to discover why a thread isn't responding to a suspend request or
1617*795d594fSAndroid Build Coastguard Worker   // checkpoint. The caller should "suspend" (in the Java sense) 'thread' before invoking this, so
1618*795d594fSAndroid Build Coastguard Worker   // 'thread' can't get deallocated before we access it.
1619*795d594fSAndroid Build Coastguard Worker   NO_RETURN void AbortInThis(const std::string& message);
1620*795d594fSAndroid Build Coastguard Worker 
1621*795d594fSAndroid Build Coastguard Worker   // Returns true if StrictMode events are traced for the current thread.
IsSensitiveThread()1622*795d594fSAndroid Build Coastguard Worker   static bool IsSensitiveThread() {
1623*795d594fSAndroid Build Coastguard Worker     if (is_sensitive_thread_hook_ != nullptr) {
1624*795d594fSAndroid Build Coastguard Worker       return (*is_sensitive_thread_hook_)();
1625*795d594fSAndroid Build Coastguard Worker     }
1626*795d594fSAndroid Build Coastguard Worker     return false;
1627*795d594fSAndroid Build Coastguard Worker   }
1628*795d594fSAndroid Build Coastguard Worker 
1629*795d594fSAndroid Build Coastguard Worker   // Set to the read barrier marking entrypoints to be non-null.
1630*795d594fSAndroid Build Coastguard Worker   void SetReadBarrierEntrypoints();
1631*795d594fSAndroid Build Coastguard Worker 
1632*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> CreateCompileTimePeer(const char* name,
1633*795d594fSAndroid Build Coastguard Worker                                                bool as_daemon,
1634*795d594fSAndroid Build Coastguard Worker                                                jobject thread_group)
1635*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1636*795d594fSAndroid Build Coastguard Worker 
GetInterpreterCache()1637*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE InterpreterCache* GetInterpreterCache() {
1638*795d594fSAndroid Build Coastguard Worker     return &interpreter_cache_;
1639*795d594fSAndroid Build Coastguard Worker   }
1640*795d594fSAndroid Build Coastguard Worker 
1641*795d594fSAndroid Build Coastguard Worker   // Clear all thread-local interpreter caches.
1642*795d594fSAndroid Build Coastguard Worker   //
1643*795d594fSAndroid Build Coastguard Worker   // Since the caches are keyed by memory pointer to dex instructions, this must be
1644*795d594fSAndroid Build Coastguard Worker   // called when any dex code is unloaded (before different code gets loaded at the
1645*795d594fSAndroid Build Coastguard Worker   // same memory location).
1646*795d594fSAndroid Build Coastguard Worker   //
1647*795d594fSAndroid Build Coastguard Worker   // If presence of cache entry implies some pre-conditions, this must also be
1648*795d594fSAndroid Build Coastguard Worker   // called if the pre-conditions might no longer hold true.
1649*795d594fSAndroid Build Coastguard Worker   static void ClearAllInterpreterCaches();
1650*795d594fSAndroid Build Coastguard Worker 
1651*795d594fSAndroid Build Coastguard Worker   template<PointerSize pointer_size>
InterpreterCacheOffset()1652*795d594fSAndroid Build Coastguard Worker   static constexpr ThreadOffset<pointer_size> InterpreterCacheOffset() {
1653*795d594fSAndroid Build Coastguard Worker     return ThreadOffset<pointer_size>(OFFSETOF_MEMBER(Thread, interpreter_cache_));
1654*795d594fSAndroid Build Coastguard Worker   }
1655*795d594fSAndroid Build Coastguard Worker 
InterpreterCacheSizeLog2()1656*795d594fSAndroid Build Coastguard Worker   static constexpr int InterpreterCacheSizeLog2() {
1657*795d594fSAndroid Build Coastguard Worker     return WhichPowerOf2(InterpreterCache::kSize);
1658*795d594fSAndroid Build Coastguard Worker   }
1659*795d594fSAndroid Build Coastguard Worker 
AllThreadFlags()1660*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t AllThreadFlags() {
1661*795d594fSAndroid Build Coastguard Worker     return enum_cast<uint32_t>(ThreadFlag::kLastFlag) |
1662*795d594fSAndroid Build Coastguard Worker            (enum_cast<uint32_t>(ThreadFlag::kLastFlag) - 1u);
1663*795d594fSAndroid Build Coastguard Worker   }
1664*795d594fSAndroid Build Coastguard Worker 
SuspendOrCheckpointRequestFlags()1665*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t SuspendOrCheckpointRequestFlags() {
1666*795d594fSAndroid Build Coastguard Worker     return enum_cast<uint32_t>(ThreadFlag::kSuspendRequest) |
1667*795d594fSAndroid Build Coastguard Worker            enum_cast<uint32_t>(ThreadFlag::kCheckpointRequest) |
1668*795d594fSAndroid Build Coastguard Worker            enum_cast<uint32_t>(ThreadFlag::kEmptyCheckpointRequest);
1669*795d594fSAndroid Build Coastguard Worker   }
1670*795d594fSAndroid Build Coastguard Worker 
FlipFunctionFlags()1671*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t FlipFunctionFlags() {
1672*795d594fSAndroid Build Coastguard Worker     return enum_cast<uint32_t>(ThreadFlag::kPendingFlipFunction) |
1673*795d594fSAndroid Build Coastguard Worker            enum_cast<uint32_t>(ThreadFlag::kRunningFlipFunction);
1674*795d594fSAndroid Build Coastguard Worker   }
1675*795d594fSAndroid Build Coastguard Worker 
StoredThreadStateValue(ThreadState state)1676*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t StoredThreadStateValue(ThreadState state) {
1677*795d594fSAndroid Build Coastguard Worker     return StateAndFlags::EncodeState(state);
1678*795d594fSAndroid Build Coastguard Worker   }
1679*795d594fSAndroid Build Coastguard Worker 
ResetSharedMethodHotness()1680*795d594fSAndroid Build Coastguard Worker   void ResetSharedMethodHotness() {
1681*795d594fSAndroid Build Coastguard Worker     tls32_.shared_method_hotness = kSharedMethodHotnessThreshold;
1682*795d594fSAndroid Build Coastguard Worker   }
1683*795d594fSAndroid Build Coastguard Worker 
GetSharedMethodHotness()1684*795d594fSAndroid Build Coastguard Worker   uint32_t GetSharedMethodHotness() const {
1685*795d594fSAndroid Build Coastguard Worker     return tls32_.shared_method_hotness;
1686*795d594fSAndroid Build Coastguard Worker   }
1687*795d594fSAndroid Build Coastguard Worker 
DecrementSharedMethodHotness()1688*795d594fSAndroid Build Coastguard Worker   uint32_t DecrementSharedMethodHotness() {
1689*795d594fSAndroid Build Coastguard Worker     tls32_.shared_method_hotness = (tls32_.shared_method_hotness - 1) & 0xffff;
1690*795d594fSAndroid Build Coastguard Worker     return tls32_.shared_method_hotness;
1691*795d594fSAndroid Build Coastguard Worker   }
1692*795d594fSAndroid Build Coastguard Worker 
1693*795d594fSAndroid Build Coastguard Worker  private:
1694*795d594fSAndroid Build Coastguard Worker   // We pretend to acquire this while running a checkpoint to detect lock ordering issues.
1695*795d594fSAndroid Build Coastguard Worker   // Initialized lazily.
1696*795d594fSAndroid Build Coastguard Worker   static std::atomic<Mutex*> cp_placeholder_mutex_;
1697*795d594fSAndroid Build Coastguard Worker 
1698*795d594fSAndroid Build Coastguard Worker   explicit Thread(bool daemon);
1699*795d594fSAndroid Build Coastguard Worker 
1700*795d594fSAndroid Build Coastguard Worker   // A successfully started thread is only deleted by the thread itself.
1701*795d594fSAndroid Build Coastguard Worker   // Threads are deleted after they have been removed from the thread list while holding
1702*795d594fSAndroid Build Coastguard Worker   // suspend_count_lock_ and thread_list_lock_. We refuse to do this while either kSuspendRequest
1703*795d594fSAndroid Build Coastguard Worker   // or kRunningFlipFunction are set. We can prevent Thread destruction by holding either of those
1704*795d594fSAndroid Build Coastguard Worker   // locks, ensuring that either of those flags are set, or possibly by registering and checking a
1705*795d594fSAndroid Build Coastguard Worker   // ThreadExitFlag.
1706*795d594fSAndroid Build Coastguard Worker   ~Thread() REQUIRES(!Locks::mutator_lock_, !Locks::thread_suspend_count_lock_);
1707*795d594fSAndroid Build Coastguard Worker 
1708*795d594fSAndroid Build Coastguard Worker   // Thread destruction actions that do not invalidate the thread. Checkpoints and flip_functions
1709*795d594fSAndroid Build Coastguard Worker   // may still be called on this Thread object, though not by this thread, during and after the
1710*795d594fSAndroid Build Coastguard Worker   // Destroy() call.
1711*795d594fSAndroid Build Coastguard Worker   void Destroy(bool should_run_callbacks);
1712*795d594fSAndroid Build Coastguard Worker 
1713*795d594fSAndroid Build Coastguard Worker   // Deletes and clears the tlsPtr_.jpeer field. Done in a way so that both it and opeer cannot be
1714*795d594fSAndroid Build Coastguard Worker   // observed to be set at the same time by instrumentation.
1715*795d594fSAndroid Build Coastguard Worker   void DeleteJPeer(JNIEnv* env);
1716*795d594fSAndroid Build Coastguard Worker 
1717*795d594fSAndroid Build Coastguard Worker   // Attaches the calling native thread to the runtime, returning the new native peer.
1718*795d594fSAndroid Build Coastguard Worker   // Used to implement JNI AttachCurrentThread and AttachCurrentThreadAsDaemon calls.
1719*795d594fSAndroid Build Coastguard Worker   template <typename PeerAction>
1720*795d594fSAndroid Build Coastguard Worker   static Thread* Attach(const char* thread_name,
1721*795d594fSAndroid Build Coastguard Worker                         bool as_daemon,
1722*795d594fSAndroid Build Coastguard Worker                         PeerAction p,
1723*795d594fSAndroid Build Coastguard Worker                         bool should_run_callbacks);
1724*795d594fSAndroid Build Coastguard Worker 
1725*795d594fSAndroid Build Coastguard Worker   void CreatePeer(const char* name, bool as_daemon, jobject thread_group);
1726*795d594fSAndroid Build Coastguard Worker 
1727*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
1728*795d594fSAndroid Build Coastguard Worker   static void InitPeer(ObjPtr<mirror::Object> peer,
1729*795d594fSAndroid Build Coastguard Worker                        bool as_daemon,
1730*795d594fSAndroid Build Coastguard Worker                        ObjPtr<mirror::Object> thread_group,
1731*795d594fSAndroid Build Coastguard Worker                        ObjPtr<mirror::String> thread_name,
1732*795d594fSAndroid Build Coastguard Worker                        jint thread_priority)
1733*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1734*795d594fSAndroid Build Coastguard Worker 
1735*795d594fSAndroid Build Coastguard Worker   // Avoid use, callers should use SetState.
1736*795d594fSAndroid Build Coastguard Worker   // Used only by `Thread` destructor and stack trace collection in semi-space GC (currently
1737*795d594fSAndroid Build Coastguard Worker   // disabled by `kStoreStackTraces = false`). May not be called on a runnable thread other
1738*795d594fSAndroid Build Coastguard Worker   // than Thread::Current().
1739*795d594fSAndroid Build Coastguard Worker   // NO_THREAD_SAFETY_ANALYSIS: This function is "Unsafe" and can be called in
1740*795d594fSAndroid Build Coastguard Worker   // different states, so clang cannot perform the thread safety analysis.
SetStateUnsafe(ThreadState new_state)1741*795d594fSAndroid Build Coastguard Worker   ThreadState SetStateUnsafe(ThreadState new_state) NO_THREAD_SAFETY_ANALYSIS {
1742*795d594fSAndroid Build Coastguard Worker     StateAndFlags old_state_and_flags = GetStateAndFlags(std::memory_order_relaxed);
1743*795d594fSAndroid Build Coastguard Worker     ThreadState old_state = old_state_and_flags.GetState();
1744*795d594fSAndroid Build Coastguard Worker     if (old_state == new_state) {
1745*795d594fSAndroid Build Coastguard Worker       // Nothing to do.
1746*795d594fSAndroid Build Coastguard Worker     } else if (old_state == ThreadState::kRunnable) {
1747*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(this, Thread::Current());
1748*795d594fSAndroid Build Coastguard Worker       // Need to run pending checkpoint and suspend barriers. Run checkpoints in runnable state in
1749*795d594fSAndroid Build Coastguard Worker       // case they need to use a ScopedObjectAccess. If we are holding the mutator lock and a SOA
1750*795d594fSAndroid Build Coastguard Worker       // attempts to TransitionFromSuspendedToRunnable, it results in a deadlock.
1751*795d594fSAndroid Build Coastguard Worker       TransitionToSuspendedAndRunCheckpoints(new_state);
1752*795d594fSAndroid Build Coastguard Worker       // Since we transitioned to a suspended state, check the pass barrier requests.
1753*795d594fSAndroid Build Coastguard Worker       CheckActiveSuspendBarriers();
1754*795d594fSAndroid Build Coastguard Worker     } else {
1755*795d594fSAndroid Build Coastguard Worker       while (true) {
1756*795d594fSAndroid Build Coastguard Worker         StateAndFlags new_state_and_flags = old_state_and_flags;
1757*795d594fSAndroid Build Coastguard Worker         new_state_and_flags.SetState(new_state);
1758*795d594fSAndroid Build Coastguard Worker         if (LIKELY(tls32_.state_and_flags.CompareAndSetWeakAcquire(
1759*795d594fSAndroid Build Coastguard Worker                 old_state_and_flags.GetValue(), new_state_and_flags.GetValue()))) {
1760*795d594fSAndroid Build Coastguard Worker           break;
1761*795d594fSAndroid Build Coastguard Worker         }
1762*795d594fSAndroid Build Coastguard Worker         // Reload state and flags.
1763*795d594fSAndroid Build Coastguard Worker         old_state_and_flags = GetStateAndFlags(std::memory_order_relaxed);
1764*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(old_state, old_state_and_flags.GetState());
1765*795d594fSAndroid Build Coastguard Worker       }
1766*795d594fSAndroid Build Coastguard Worker     }
1767*795d594fSAndroid Build Coastguard Worker     return old_state;
1768*795d594fSAndroid Build Coastguard Worker   }
1769*795d594fSAndroid Build Coastguard Worker 
GetMutatorLock()1770*795d594fSAndroid Build Coastguard Worker   MutatorMutex* GetMutatorLock() RETURN_CAPABILITY(Locks::mutator_lock_) {
1771*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(tlsPtr_.mutator_lock, Locks::mutator_lock_);
1772*795d594fSAndroid Build Coastguard Worker     return tlsPtr_.mutator_lock;
1773*795d594fSAndroid Build Coastguard Worker   }
1774*795d594fSAndroid Build Coastguard Worker 
1775*795d594fSAndroid Build Coastguard Worker   void VerifyStackImpl() REQUIRES_SHARED(Locks::mutator_lock_);
1776*795d594fSAndroid Build Coastguard Worker 
1777*795d594fSAndroid Build Coastguard Worker   void DumpState(std::ostream& os) const REQUIRES_SHARED(Locks::mutator_lock_);
1778*795d594fSAndroid Build Coastguard Worker   DumpOrder DumpStack(std::ostream& os,
1779*795d594fSAndroid Build Coastguard Worker                       bool dump_native_stack = true,
1780*795d594fSAndroid Build Coastguard Worker                       bool force_dump_stack = false) const
1781*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1782*795d594fSAndroid Build Coastguard Worker   DumpOrder DumpStack(std::ostream& os,
1783*795d594fSAndroid Build Coastguard Worker                       unwindstack::AndroidLocalUnwinder& unwinder,
1784*795d594fSAndroid Build Coastguard Worker                       bool dump_native_stack = true,
1785*795d594fSAndroid Build Coastguard Worker                       bool force_dump_stack = false) const
1786*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1787*795d594fSAndroid Build Coastguard Worker 
1788*795d594fSAndroid Build Coastguard Worker   // Out-of-line conveniences for debugging in gdb.
1789*795d594fSAndroid Build Coastguard Worker   static Thread* CurrentFromGdb();  // Like Thread::Current.
1790*795d594fSAndroid Build Coastguard Worker   // Like Thread::Dump(std::cerr).
1791*795d594fSAndroid Build Coastguard Worker   void DumpFromGdb() const REQUIRES_SHARED(Locks::mutator_lock_);
1792*795d594fSAndroid Build Coastguard Worker 
1793*795d594fSAndroid Build Coastguard Worker   // A wrapper around CreateCallback used when userfaultfd GC is used to
1794*795d594fSAndroid Build Coastguard Worker   // identify the GC by stacktrace.
1795*795d594fSAndroid Build Coastguard Worker   static NO_INLINE void* CreateCallbackWithUffdGc(void* arg);
1796*795d594fSAndroid Build Coastguard Worker   static void* CreateCallback(void* arg);
1797*795d594fSAndroid Build Coastguard Worker 
1798*795d594fSAndroid Build Coastguard Worker   void HandleUncaughtExceptions() REQUIRES_SHARED(Locks::mutator_lock_);
1799*795d594fSAndroid Build Coastguard Worker   void RemoveFromThreadGroup() REQUIRES_SHARED(Locks::mutator_lock_);
1800*795d594fSAndroid Build Coastguard Worker 
1801*795d594fSAndroid Build Coastguard Worker   // Initialize a thread.
1802*795d594fSAndroid Build Coastguard Worker   //
1803*795d594fSAndroid Build Coastguard Worker   // The third parameter is not mandatory. If given, the thread will use this JNIEnvExt. In case
1804*795d594fSAndroid Build Coastguard Worker   // Init succeeds, this means the thread takes ownership of it. If Init fails, it is the caller's
1805*795d594fSAndroid Build Coastguard Worker   // responsibility to destroy the given JNIEnvExt. If the parameter is null, Init will try to
1806*795d594fSAndroid Build Coastguard Worker   // create a JNIEnvExt on its own (and potentially fail at that stage, indicated by a return value
1807*795d594fSAndroid Build Coastguard Worker   // of false).
1808*795d594fSAndroid Build Coastguard Worker   bool Init(ThreadList*, JavaVMExt*, JNIEnvExt* jni_env_ext = nullptr)
1809*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::runtime_shutdown_lock_);
1810*795d594fSAndroid Build Coastguard Worker   void InitCardTable();
1811*795d594fSAndroid Build Coastguard Worker   void InitCpu();
1812*795d594fSAndroid Build Coastguard Worker   void CleanupCpu();
1813*795d594fSAndroid Build Coastguard Worker   void InitTlsEntryPoints();
1814*795d594fSAndroid Build Coastguard Worker   void InitTid();
1815*795d594fSAndroid Build Coastguard Worker   void InitPthreadKeySelf();
1816*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1817*795d594fSAndroid Build Coastguard Worker   bool InitStack(uint8_t* read_stack_base, size_t read_stack_size, size_t read_guard_size);
1818*795d594fSAndroid Build Coastguard Worker 
1819*795d594fSAndroid Build Coastguard Worker   void SetUpAlternateSignalStack();
1820*795d594fSAndroid Build Coastguard Worker   void TearDownAlternateSignalStack();
1821*795d594fSAndroid Build Coastguard Worker   void MadviseAwayAlternateSignalStack();
1822*795d594fSAndroid Build Coastguard Worker 
1823*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void TransitionToSuspendedAndRunCheckpoints(ThreadState new_state)
1824*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_)
1825*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1826*795d594fSAndroid Build Coastguard Worker 
1827*795d594fSAndroid Build Coastguard Worker   // Call PassActiveSuspendBarriers() if there are active barriers. Only called on current thread.
1828*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void CheckActiveSuspendBarriers()
1829*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_, !Locks::mutator_lock_, !Roles::uninterruptible_);
1830*795d594fSAndroid Build Coastguard Worker 
1831*795d594fSAndroid Build Coastguard Worker   // Decrement all "suspend barriers" for the current thread, notifying threads that requested our
1832*795d594fSAndroid Build Coastguard Worker   // suspension. Only called on current thread, when suspended. If suspend_count_ > 0 then we
1833*795d594fSAndroid Build Coastguard Worker   // promise that we are and will remain "suspended" until the suspend count is decremented.
1834*795d594fSAndroid Build Coastguard Worker   bool PassActiveSuspendBarriers()
1835*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_, !Locks::mutator_lock_);
1836*795d594fSAndroid Build Coastguard Worker 
1837*795d594fSAndroid Build Coastguard Worker   // Add an entry to active_suspend1_barriers.
1838*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void AddSuspend1Barrier(WrappedSuspend1Barrier* suspend1_barrier)
1839*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
1840*795d594fSAndroid Build Coastguard Worker 
1841*795d594fSAndroid Build Coastguard Worker   // Remove last-added entry from active_suspend1_barriers.
1842*795d594fSAndroid Build Coastguard Worker   // Only makes sense if we're still holding thread_suspend_count_lock_ since insertion.
1843*795d594fSAndroid Build Coastguard Worker   // We redundantly pass in the barrier to be removed in order to enable a DCHECK.
1844*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void RemoveFirstSuspend1Barrier(WrappedSuspend1Barrier* suspend1_barrier)
1845*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
1846*795d594fSAndroid Build Coastguard Worker 
1847*795d594fSAndroid Build Coastguard Worker   // Remove the "barrier" from the list no matter where it appears. Called only under exceptional
1848*795d594fSAndroid Build Coastguard Worker   // circumstances. The barrier must be in the list.
1849*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void RemoveSuspend1Barrier(WrappedSuspend1Barrier* suspend1_barrier)
1850*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
1851*795d594fSAndroid Build Coastguard Worker 
1852*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE bool HasActiveSuspendBarrier() REQUIRES(Locks::thread_suspend_count_lock_);
1853*795d594fSAndroid Build Coastguard Worker 
1854*795d594fSAndroid Build Coastguard Worker   // CHECK that the given barrier is no longer on our list.
1855*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void CheckBarrierInactive(WrappedSuspend1Barrier* suspend1_barrier)
1856*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::thread_suspend_count_lock_);
1857*795d594fSAndroid Build Coastguard Worker 
1858*795d594fSAndroid Build Coastguard Worker   // Registers the current thread as the jit sensitive thread. Should be called just once.
SetJitSensitiveThread()1859*795d594fSAndroid Build Coastguard Worker   static void SetJitSensitiveThread() {
1860*795d594fSAndroid Build Coastguard Worker     if (jit_sensitive_thread_ == nullptr) {
1861*795d594fSAndroid Build Coastguard Worker       jit_sensitive_thread_ = Thread::Current();
1862*795d594fSAndroid Build Coastguard Worker     } else {
1863*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "Attempt to set the sensitive thread twice. Tid:"
1864*795d594fSAndroid Build Coastguard Worker           << Thread::Current()->GetTid();
1865*795d594fSAndroid Build Coastguard Worker     }
1866*795d594fSAndroid Build Coastguard Worker   }
1867*795d594fSAndroid Build Coastguard Worker 
SetSensitiveThreadHook(bool (* is_sensitive_thread_hook)())1868*795d594fSAndroid Build Coastguard Worker   static void SetSensitiveThreadHook(bool (*is_sensitive_thread_hook)()) {
1869*795d594fSAndroid Build Coastguard Worker     is_sensitive_thread_hook_ = is_sensitive_thread_hook;
1870*795d594fSAndroid Build Coastguard Worker   }
1871*795d594fSAndroid Build Coastguard Worker 
1872*795d594fSAndroid Build Coastguard Worker   // Runs a single checkpoint function. If there are no more pending checkpoint functions it will
1873*795d594fSAndroid Build Coastguard Worker   // clear the kCheckpointRequest flag. The caller is responsible for calling this in a loop until
1874*795d594fSAndroid Build Coastguard Worker   // the kCheckpointRequest flag is cleared.
1875*795d594fSAndroid Build Coastguard Worker   void RunCheckpointFunction()
1876*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_suspend_count_lock_)
1877*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1878*795d594fSAndroid Build Coastguard Worker   void RunEmptyCheckpoint();
1879*795d594fSAndroid Build Coastguard Worker 
1880*795d594fSAndroid Build Coastguard Worker   // Return the nearest page-aligned address below the current stack top.
1881*795d594fSAndroid Build Coastguard Worker   template <StackType>
1882*795d594fSAndroid Build Coastguard Worker   NO_INLINE uint8_t* FindStackTop();
1883*795d594fSAndroid Build Coastguard Worker 
1884*795d594fSAndroid Build Coastguard Worker   // Install the protected region for implicit stack checks.
1885*795d594fSAndroid Build Coastguard Worker   template <StackType>
1886*795d594fSAndroid Build Coastguard Worker   void InstallImplicitProtection();
1887*795d594fSAndroid Build Coastguard Worker 
1888*795d594fSAndroid Build Coastguard Worker   template <bool kPrecise>
1889*795d594fSAndroid Build Coastguard Worker   void VisitRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
1890*795d594fSAndroid Build Coastguard Worker 
1891*795d594fSAndroid Build Coastguard Worker   static bool IsAotCompiler();
1892*795d594fSAndroid Build Coastguard Worker 
1893*795d594fSAndroid Build Coastguard Worker   void SetCachedThreadName(const char* name);
1894*795d594fSAndroid Build Coastguard Worker 
1895*795d594fSAndroid Build Coastguard Worker   // Helper functions to get/set the tls stack pointer variables.
1896*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1897*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void SetStackEnd(uint8_t* new_stack_end);
1898*795d594fSAndroid Build Coastguard Worker 
1899*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1900*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE uint8_t* GetStackBegin() const;
1901*795d594fSAndroid Build Coastguard Worker 
1902*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1903*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void SetStackBegin(uint8_t* new_stack_begin);
1904*795d594fSAndroid Build Coastguard Worker 
1905*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1906*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE size_t GetStackSize() const;
1907*795d594fSAndroid Build Coastguard Worker 
1908*795d594fSAndroid Build Coastguard Worker   template <StackType stack_type>
1909*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE void SetStackSize(size_t new_stack_size);
1910*795d594fSAndroid Build Coastguard Worker 
1911*795d594fSAndroid Build Coastguard Worker   // Helper class for manipulating the 32 bits of atomically changed state and flags.
1912*795d594fSAndroid Build Coastguard Worker   class StateAndFlags {
1913*795d594fSAndroid Build Coastguard Worker    public:
StateAndFlags(uint32_t value)1914*795d594fSAndroid Build Coastguard Worker     explicit StateAndFlags(uint32_t value) :value_(value) {}
1915*795d594fSAndroid Build Coastguard Worker 
GetValue()1916*795d594fSAndroid Build Coastguard Worker     uint32_t GetValue() const {
1917*795d594fSAndroid Build Coastguard Worker       return value_;
1918*795d594fSAndroid Build Coastguard Worker     }
1919*795d594fSAndroid Build Coastguard Worker 
SetValue(uint32_t value)1920*795d594fSAndroid Build Coastguard Worker     void SetValue(uint32_t value) {
1921*795d594fSAndroid Build Coastguard Worker       value_ = value;
1922*795d594fSAndroid Build Coastguard Worker     }
1923*795d594fSAndroid Build Coastguard Worker 
IsAnyOfFlagsSet(uint32_t flags)1924*795d594fSAndroid Build Coastguard Worker     bool IsAnyOfFlagsSet(uint32_t flags) const {
1925*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(flags & ~AllThreadFlags(), 0u);
1926*795d594fSAndroid Build Coastguard Worker       return (value_ & flags) != 0u;
1927*795d594fSAndroid Build Coastguard Worker     }
1928*795d594fSAndroid Build Coastguard Worker 
IsFlagSet(ThreadFlag flag)1929*795d594fSAndroid Build Coastguard Worker     bool IsFlagSet(ThreadFlag flag) const {
1930*795d594fSAndroid Build Coastguard Worker       return (value_ & enum_cast<uint32_t>(flag)) != 0u;
1931*795d594fSAndroid Build Coastguard Worker     }
1932*795d594fSAndroid Build Coastguard Worker 
SetFlag(ThreadFlag flag)1933*795d594fSAndroid Build Coastguard Worker     void SetFlag(ThreadFlag flag) {
1934*795d594fSAndroid Build Coastguard Worker       value_ |= enum_cast<uint32_t>(flag);
1935*795d594fSAndroid Build Coastguard Worker     }
1936*795d594fSAndroid Build Coastguard Worker 
WithFlag(ThreadFlag flag)1937*795d594fSAndroid Build Coastguard Worker     StateAndFlags WithFlag(ThreadFlag flag) const {
1938*795d594fSAndroid Build Coastguard Worker       StateAndFlags result = *this;
1939*795d594fSAndroid Build Coastguard Worker       result.SetFlag(flag);
1940*795d594fSAndroid Build Coastguard Worker       return result;
1941*795d594fSAndroid Build Coastguard Worker     }
1942*795d594fSAndroid Build Coastguard Worker 
WithoutFlag(ThreadFlag flag)1943*795d594fSAndroid Build Coastguard Worker     StateAndFlags WithoutFlag(ThreadFlag flag) const {
1944*795d594fSAndroid Build Coastguard Worker       StateAndFlags result = *this;
1945*795d594fSAndroid Build Coastguard Worker       result.ClearFlag(flag);
1946*795d594fSAndroid Build Coastguard Worker       return result;
1947*795d594fSAndroid Build Coastguard Worker     }
1948*795d594fSAndroid Build Coastguard Worker 
ClearFlag(ThreadFlag flag)1949*795d594fSAndroid Build Coastguard Worker     void ClearFlag(ThreadFlag flag) {
1950*795d594fSAndroid Build Coastguard Worker       value_ &= ~enum_cast<uint32_t>(flag);
1951*795d594fSAndroid Build Coastguard Worker     }
1952*795d594fSAndroid Build Coastguard Worker 
GetState()1953*795d594fSAndroid Build Coastguard Worker     ThreadState GetState() const {
1954*795d594fSAndroid Build Coastguard Worker       ThreadState state = ThreadStateField::Decode(value_);
1955*795d594fSAndroid Build Coastguard Worker       ValidateThreadState(state);
1956*795d594fSAndroid Build Coastguard Worker       return state;
1957*795d594fSAndroid Build Coastguard Worker     }
1958*795d594fSAndroid Build Coastguard Worker 
SetState(ThreadState state)1959*795d594fSAndroid Build Coastguard Worker     void SetState(ThreadState state) {
1960*795d594fSAndroid Build Coastguard Worker       ValidateThreadState(state);
1961*795d594fSAndroid Build Coastguard Worker       value_ = ThreadStateField::Update(state, value_);
1962*795d594fSAndroid Build Coastguard Worker     }
1963*795d594fSAndroid Build Coastguard Worker 
WithState(ThreadState state)1964*795d594fSAndroid Build Coastguard Worker     StateAndFlags WithState(ThreadState state) const {
1965*795d594fSAndroid Build Coastguard Worker       StateAndFlags result = *this;
1966*795d594fSAndroid Build Coastguard Worker       result.SetState(state);
1967*795d594fSAndroid Build Coastguard Worker       return result;
1968*795d594fSAndroid Build Coastguard Worker     }
1969*795d594fSAndroid Build Coastguard Worker 
EncodeState(ThreadState state)1970*795d594fSAndroid Build Coastguard Worker     static constexpr uint32_t EncodeState(ThreadState state) {
1971*795d594fSAndroid Build Coastguard Worker       ValidateThreadState(state);
1972*795d594fSAndroid Build Coastguard Worker       return ThreadStateField::Encode(state);
1973*795d594fSAndroid Build Coastguard Worker     }
1974*795d594fSAndroid Build Coastguard Worker 
ValidateThreadState(ThreadState state)1975*795d594fSAndroid Build Coastguard Worker     static constexpr void ValidateThreadState(ThreadState state) {
1976*795d594fSAndroid Build Coastguard Worker       if (kIsDebugBuild && state != ThreadState::kRunnable) {
1977*795d594fSAndroid Build Coastguard Worker         CHECK_GE(state, ThreadState::kTerminated);
1978*795d594fSAndroid Build Coastguard Worker         CHECK_LE(state, ThreadState::kSuspended);
1979*795d594fSAndroid Build Coastguard Worker         CHECK_NE(state, ThreadState::kObsoleteRunnable);
1980*795d594fSAndroid Build Coastguard Worker       }
1981*795d594fSAndroid Build Coastguard Worker     }
1982*795d594fSAndroid Build Coastguard Worker 
1983*795d594fSAndroid Build Coastguard Worker     // The value holds thread flags and thread state.
1984*795d594fSAndroid Build Coastguard Worker     uint32_t value_;
1985*795d594fSAndroid Build Coastguard Worker 
1986*795d594fSAndroid Build Coastguard Worker     static constexpr size_t kThreadStateBitSize = BitSizeOf<std::underlying_type_t<ThreadState>>();
1987*795d594fSAndroid Build Coastguard Worker     static constexpr size_t kThreadStatePosition = BitSizeOf<uint32_t>() - kThreadStateBitSize;
1988*795d594fSAndroid Build Coastguard Worker     using ThreadStateField = BitField<ThreadState, kThreadStatePosition, kThreadStateBitSize>;
1989*795d594fSAndroid Build Coastguard Worker     static_assert(
1990*795d594fSAndroid Build Coastguard Worker         WhichPowerOf2(enum_cast<uint32_t>(ThreadFlag::kLastFlag)) < kThreadStatePosition);
1991*795d594fSAndroid Build Coastguard Worker   };
1992*795d594fSAndroid Build Coastguard Worker   static_assert(sizeof(StateAndFlags) == sizeof(uint32_t), "Unexpected StateAndFlags size");
1993*795d594fSAndroid Build Coastguard Worker 
GetStateAndFlags(std::memory_order order)1994*795d594fSAndroid Build Coastguard Worker   StateAndFlags GetStateAndFlags(std::memory_order order) const {
1995*795d594fSAndroid Build Coastguard Worker     return StateAndFlags(tls32_.state_and_flags.load(order));
1996*795d594fSAndroid Build Coastguard Worker   }
1997*795d594fSAndroid Build Coastguard Worker 
1998*795d594fSAndroid Build Coastguard Worker   // Format state and flags as a hex string. For diagnostic output.
1999*795d594fSAndroid Build Coastguard Worker   std::string StateAndFlagsAsHexString() const;
2000*795d594fSAndroid Build Coastguard Worker 
2001*795d594fSAndroid Build Coastguard Worker   // Run the flip function and notify other threads that may have tried
2002*795d594fSAndroid Build Coastguard Worker   // to do that concurrently.
2003*795d594fSAndroid Build Coastguard Worker   void RunFlipFunction(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
2004*795d594fSAndroid Build Coastguard Worker 
2005*795d594fSAndroid Build Coastguard Worker   // Ensure that thread flip function for thread target started running. If no other thread is
2006*795d594fSAndroid Build Coastguard Worker   // executing it, the calling thread shall run the flip function and then notify other threads
2007*795d594fSAndroid Build Coastguard Worker   // that have tried to do that concurrently. After this function returns, the
2008*795d594fSAndroid Build Coastguard Worker   // `ThreadFlag::kPendingFlipFunction` is cleared but another thread may still be running the
2009*795d594fSAndroid Build Coastguard Worker   // flip function as indicated by the `ThreadFlag::kRunningFlipFunction`. Optional arguments:
2010*795d594fSAndroid Build Coastguard Worker   //  - old_state_and_flags indicates the current and state and flags value for the thread, with
2011*795d594fSAndroid Build Coastguard Worker   //    at least kPendingFlipFunction set. The thread should logically acquire the
2012*795d594fSAndroid Build Coastguard Worker   //    mutator lock before running the flip function.  A special zero value indicates that the
2013*795d594fSAndroid Build Coastguard Worker   //    thread already holds the mutator lock, and the actual state_and_flags must be read.
2014*795d594fSAndroid Build Coastguard Worker   //    A non-zero value implies this == Current().
2015*795d594fSAndroid Build Coastguard Worker   //  - If tef is non-null, we check that the target thread has not yet exited, as indicated by
2016*795d594fSAndroid Build Coastguard Worker   //    tef. In that case, we acquire thread_list_lock_ as needed.
2017*795d594fSAndroid Build Coastguard Worker   //  - If finished is non-null, we assign to *finished to indicate whether the flip was known to
2018*795d594fSAndroid Build Coastguard Worker   //    be completed when we returned.
2019*795d594fSAndroid Build Coastguard Worker   //  Returns true if and only if we acquired the mutator lock (which implies that we ran the flip
2020*795d594fSAndroid Build Coastguard Worker   //  function after finding old_state_and_flags unchanged).
2021*795d594fSAndroid Build Coastguard Worker   static bool EnsureFlipFunctionStarted(Thread* self,
2022*795d594fSAndroid Build Coastguard Worker                                         Thread* target,
2023*795d594fSAndroid Build Coastguard Worker                                         StateAndFlags old_state_and_flags = StateAndFlags(0),
2024*795d594fSAndroid Build Coastguard Worker                                         ThreadExitFlag* tef = nullptr,
2025*795d594fSAndroid Build Coastguard Worker                                         /*out*/ bool* finished = nullptr)
2026*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::thread_list_lock_) TRY_ACQUIRE_SHARED(true, Locks::mutator_lock_);
2027*795d594fSAndroid Build Coastguard Worker 
2028*795d594fSAndroid Build Coastguard Worker   static void ThreadExitCallback(void* arg);
2029*795d594fSAndroid Build Coastguard Worker 
2030*795d594fSAndroid Build Coastguard Worker   // Maximum number of suspend barriers.
2031*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kMaxSuspendBarriers = 3;
2032*795d594fSAndroid Build Coastguard Worker 
2033*795d594fSAndroid Build Coastguard Worker   // Has Thread::Startup been called?
2034*795d594fSAndroid Build Coastguard Worker   static bool is_started_;
2035*795d594fSAndroid Build Coastguard Worker 
2036*795d594fSAndroid Build Coastguard Worker   // TLS key used to retrieve the Thread*.
2037*795d594fSAndroid Build Coastguard Worker   static pthread_key_t pthread_key_self_;
2038*795d594fSAndroid Build Coastguard Worker 
2039*795d594fSAndroid Build Coastguard Worker   // Used to notify threads that they should attempt to resume, they will suspend again if
2040*795d594fSAndroid Build Coastguard Worker   // their suspend count is > 0.
2041*795d594fSAndroid Build Coastguard Worker   static ConditionVariable* resume_cond_ GUARDED_BY(Locks::thread_suspend_count_lock_);
2042*795d594fSAndroid Build Coastguard Worker 
2043*795d594fSAndroid Build Coastguard Worker   // Hook passed by framework which returns true
2044*795d594fSAndroid Build Coastguard Worker   // when StrictMode events are traced for the current thread.
2045*795d594fSAndroid Build Coastguard Worker   static bool (*is_sensitive_thread_hook_)();
2046*795d594fSAndroid Build Coastguard Worker   // Stores the jit sensitive thread (which for now is the UI thread).
2047*795d594fSAndroid Build Coastguard Worker   static Thread* jit_sensitive_thread_;
2048*795d594fSAndroid Build Coastguard Worker 
2049*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kMakeVisiblyInitializedCounterTriggerCount = 128;
2050*795d594fSAndroid Build Coastguard Worker 
2051*795d594fSAndroid Build Coastguard Worker   /***********************************************************************************************/
2052*795d594fSAndroid Build Coastguard Worker   // Thread local storage. Fields are grouped by size to enable 32 <-> 64 searching to account for
2053*795d594fSAndroid Build Coastguard Worker   // pointer size differences. To encourage shorter encoding, more frequently used values appear
2054*795d594fSAndroid Build Coastguard Worker   // first if possible.
2055*795d594fSAndroid Build Coastguard Worker   /***********************************************************************************************/
2056*795d594fSAndroid Build Coastguard Worker 
2057*795d594fSAndroid Build Coastguard Worker   struct alignas(4) tls_32bit_sized_values {
2058*795d594fSAndroid Build Coastguard Worker     // We have no control over the size of 'bool', but want our boolean fields
2059*795d594fSAndroid Build Coastguard Worker     // to be 4-byte quantities.
2060*795d594fSAndroid Build Coastguard Worker     using bool32_t = uint32_t;
2061*795d594fSAndroid Build Coastguard Worker 
tls_32bit_sized_valuestls_32bit_sized_values2062*795d594fSAndroid Build Coastguard Worker     explicit tls_32bit_sized_values(bool is_daemon)
2063*795d594fSAndroid Build Coastguard Worker         : state_and_flags(0u),
2064*795d594fSAndroid Build Coastguard Worker           suspend_count(0),
2065*795d594fSAndroid Build Coastguard Worker           thin_lock_thread_id(0),
2066*795d594fSAndroid Build Coastguard Worker           tid(0),
2067*795d594fSAndroid Build Coastguard Worker           daemon(is_daemon),
2068*795d594fSAndroid Build Coastguard Worker           throwing_OutOfMemoryError(false),
2069*795d594fSAndroid Build Coastguard Worker           no_thread_suspension(0),
2070*795d594fSAndroid Build Coastguard Worker           thread_exit_check_count(0),
2071*795d594fSAndroid Build Coastguard Worker           is_gc_marking(false),
2072*795d594fSAndroid Build Coastguard Worker           is_deopt_check_required(false),
2073*795d594fSAndroid Build Coastguard Worker           weak_ref_access_enabled(WeakRefAccessState::kVisiblyEnabled),
2074*795d594fSAndroid Build Coastguard Worker           disable_thread_flip_count(0),
2075*795d594fSAndroid Build Coastguard Worker           user_code_suspend_count(0),
2076*795d594fSAndroid Build Coastguard Worker           force_interpreter_count(0),
2077*795d594fSAndroid Build Coastguard Worker           make_visibly_initialized_counter(0),
2078*795d594fSAndroid Build Coastguard Worker           define_class_counter(0),
2079*795d594fSAndroid Build Coastguard Worker           num_name_readers(0),
2080*795d594fSAndroid Build Coastguard Worker           shared_method_hotness(kSharedMethodHotnessThreshold) {}
2081*795d594fSAndroid Build Coastguard Worker 
2082*795d594fSAndroid Build Coastguard Worker     // The state and flags field must be changed atomically so that flag values aren't lost.
2083*795d594fSAndroid Build Coastguard Worker     // See `StateAndFlags` for bit assignments of `ThreadFlag` and `ThreadState` values.
2084*795d594fSAndroid Build Coastguard Worker     // Keeping the state and flags together allows an atomic CAS to change from being
2085*795d594fSAndroid Build Coastguard Worker     // Suspended to Runnable without a suspend request occurring.
2086*795d594fSAndroid Build Coastguard Worker     Atomic<uint32_t> state_and_flags;
2087*795d594fSAndroid Build Coastguard Worker     static_assert(sizeof(state_and_flags) == sizeof(uint32_t),
2088*795d594fSAndroid Build Coastguard Worker                   "Size of state_and_flags and uint32 are different");
2089*795d594fSAndroid Build Coastguard Worker 
2090*795d594fSAndroid Build Coastguard Worker     // A non-zero value is used to tell the current thread to enter a safe point
2091*795d594fSAndroid Build Coastguard Worker     // at the next poll.
2092*795d594fSAndroid Build Coastguard Worker     int suspend_count GUARDED_BY(Locks::thread_suspend_count_lock_);
2093*795d594fSAndroid Build Coastguard Worker 
2094*795d594fSAndroid Build Coastguard Worker     // Thin lock thread id. This is a small integer used by the thin lock implementation.
2095*795d594fSAndroid Build Coastguard Worker     // This is not to be confused with the native thread's tid, nor is it the value returned
2096*795d594fSAndroid Build Coastguard Worker     // by java.lang.Thread.getId --- this is a distinct value, used only for locking. One
2097*795d594fSAndroid Build Coastguard Worker     // important difference between this id and the ids visible to managed code is that these
2098*795d594fSAndroid Build Coastguard Worker     // ones get reused (to ensure that they fit in the number of bits available).
2099*795d594fSAndroid Build Coastguard Worker     uint32_t thin_lock_thread_id;
2100*795d594fSAndroid Build Coastguard Worker 
2101*795d594fSAndroid Build Coastguard Worker     // System thread id.
2102*795d594fSAndroid Build Coastguard Worker     uint32_t tid;
2103*795d594fSAndroid Build Coastguard Worker 
2104*795d594fSAndroid Build Coastguard Worker     // Is the thread a daemon?
2105*795d594fSAndroid Build Coastguard Worker     const bool32_t daemon;
2106*795d594fSAndroid Build Coastguard Worker 
2107*795d594fSAndroid Build Coastguard Worker     // A boolean telling us whether we're recursively throwing OOME.
2108*795d594fSAndroid Build Coastguard Worker     bool32_t throwing_OutOfMemoryError;
2109*795d594fSAndroid Build Coastguard Worker 
2110*795d594fSAndroid Build Coastguard Worker     // A positive value implies we're in a region where thread suspension isn't expected.
2111*795d594fSAndroid Build Coastguard Worker     uint32_t no_thread_suspension;
2112*795d594fSAndroid Build Coastguard Worker 
2113*795d594fSAndroid Build Coastguard Worker     // How many times has our pthread key's destructor been called?
2114*795d594fSAndroid Build Coastguard Worker     uint32_t thread_exit_check_count;
2115*795d594fSAndroid Build Coastguard Worker 
2116*795d594fSAndroid Build Coastguard Worker     // True if the GC is in the marking phase. This is used for the CC collector only. This is
2117*795d594fSAndroid Build Coastguard Worker     // thread local so that we can simplify the logic to check for the fast path of read barriers of
2118*795d594fSAndroid Build Coastguard Worker     // GC roots.
2119*795d594fSAndroid Build Coastguard Worker     bool32_t is_gc_marking;
2120*795d594fSAndroid Build Coastguard Worker 
2121*795d594fSAndroid Build Coastguard Worker     // True if we need to check for deoptimization when returning from the runtime functions. This
2122*795d594fSAndroid Build Coastguard Worker     // is required only when a class is redefined to prevent executing code that has field offsets
2123*795d594fSAndroid Build Coastguard Worker     // embedded. For non-debuggable apps redefinition is not allowed and this flag should always be
2124*795d594fSAndroid Build Coastguard Worker     // set to false.
2125*795d594fSAndroid Build Coastguard Worker     bool32_t is_deopt_check_required;
2126*795d594fSAndroid Build Coastguard Worker 
2127*795d594fSAndroid Build Coastguard Worker     // Thread "interrupted" status; stays raised until queried or thrown.
2128*795d594fSAndroid Build Coastguard Worker     Atomic<bool32_t> interrupted;
2129*795d594fSAndroid Build Coastguard Worker 
2130*795d594fSAndroid Build Coastguard Worker     AtomicInteger park_state_;
2131*795d594fSAndroid Build Coastguard Worker 
2132*795d594fSAndroid Build Coastguard Worker     // Determines whether the thread is allowed to directly access a weak ref
2133*795d594fSAndroid Build Coastguard Worker     // (Reference::GetReferent() and system weaks) and to potentially mark an object alive/gray.
2134*795d594fSAndroid Build Coastguard Worker     // This is used for concurrent reference processing of the CC collector only. This is thread
2135*795d594fSAndroid Build Coastguard Worker     // local so that we can enable/disable weak ref access by using a checkpoint and avoid a race
2136*795d594fSAndroid Build Coastguard Worker     // around the time weak ref access gets disabled and concurrent reference processing begins
2137*795d594fSAndroid Build Coastguard Worker     // (if weak ref access is disabled during a pause, this is not an issue.) Other collectors use
2138*795d594fSAndroid Build Coastguard Worker     // Runtime::DisallowNewSystemWeaks() and ReferenceProcessor::EnableSlowPath().  Can be
2139*795d594fSAndroid Build Coastguard Worker     // concurrently accessed by GetReferent() and set (by iterating over threads).
2140*795d594fSAndroid Build Coastguard Worker     // Can be changed from kEnabled to kVisiblyEnabled by readers. No other concurrent access is
2141*795d594fSAndroid Build Coastguard Worker     // possible when that happens.
2142*795d594fSAndroid Build Coastguard Worker     mutable std::atomic<WeakRefAccessState> weak_ref_access_enabled;
2143*795d594fSAndroid Build Coastguard Worker 
2144*795d594fSAndroid Build Coastguard Worker     // A thread local version of Heap::disable_thread_flip_count_. This keeps track of how many
2145*795d594fSAndroid Build Coastguard Worker     // levels of (nested) JNI critical sections the thread is in and is used to detect a nested JNI
2146*795d594fSAndroid Build Coastguard Worker     // critical section enter.
2147*795d594fSAndroid Build Coastguard Worker     uint32_t disable_thread_flip_count;
2148*795d594fSAndroid Build Coastguard Worker 
2149*795d594fSAndroid Build Coastguard Worker     // How much of 'suspend_count_' is by request of user code, used to distinguish threads
2150*795d594fSAndroid Build Coastguard Worker     // suspended by the runtime from those suspended by user code.
2151*795d594fSAndroid Build Coastguard Worker     // This should have GUARDED_BY(Locks::user_code_suspension_lock_) but auto analysis cannot be
2152*795d594fSAndroid Build Coastguard Worker     // told that AssertHeld should be good enough.
2153*795d594fSAndroid Build Coastguard Worker     int user_code_suspend_count GUARDED_BY(Locks::thread_suspend_count_lock_);
2154*795d594fSAndroid Build Coastguard Worker 
2155*795d594fSAndroid Build Coastguard Worker     // Count of how many times this thread has been forced to interpreter. If this is not 0 the
2156*795d594fSAndroid Build Coastguard Worker     // thread must remain in interpreted code as much as possible.
2157*795d594fSAndroid Build Coastguard Worker     uint32_t force_interpreter_count;
2158*795d594fSAndroid Build Coastguard Worker 
2159*795d594fSAndroid Build Coastguard Worker     // Counter for calls to initialize a class that's initialized but not visibly initialized.
2160*795d594fSAndroid Build Coastguard Worker     // When this reaches kMakeVisiblyInitializedCounterTriggerCount, we call the runtime to
2161*795d594fSAndroid Build Coastguard Worker     // make initialized classes visibly initialized. This is needed because we usually make
2162*795d594fSAndroid Build Coastguard Worker     // classes visibly initialized in batches but we do not want to be stuck with a class
2163*795d594fSAndroid Build Coastguard Worker     // initialized but not visibly initialized for a long time even if no more classes are
2164*795d594fSAndroid Build Coastguard Worker     // being initialized anymore.
2165*795d594fSAndroid Build Coastguard Worker     uint32_t make_visibly_initialized_counter;
2166*795d594fSAndroid Build Coastguard Worker 
2167*795d594fSAndroid Build Coastguard Worker     // Counter for how many nested define-classes are ongoing in this thread. Used to allow waiting
2168*795d594fSAndroid Build Coastguard Worker     // for threads to be done with class-definition work.
2169*795d594fSAndroid Build Coastguard Worker     uint32_t define_class_counter;
2170*795d594fSAndroid Build Coastguard Worker 
2171*795d594fSAndroid Build Coastguard Worker     // A count of the number of readers of tlsPtr_.name that may still be looking at a string they
2172*795d594fSAndroid Build Coastguard Worker     // retrieved.
2173*795d594fSAndroid Build Coastguard Worker     mutable std::atomic<uint32_t> num_name_readers;
2174*795d594fSAndroid Build Coastguard Worker     static_assert(std::atomic<uint32_t>::is_always_lock_free);
2175*795d594fSAndroid Build Coastguard Worker 
2176*795d594fSAndroid Build Coastguard Worker     // Thread-local hotness counter for shared memory methods. Initialized with
2177*795d594fSAndroid Build Coastguard Worker     // `kSharedMethodHotnessThreshold`. The interpreter decrements it and goes
2178*795d594fSAndroid Build Coastguard Worker     // into the runtime when hitting zero. Note that all previous decrements
2179*795d594fSAndroid Build Coastguard Worker     // could have been executed by another method than the one seeing zero.
2180*795d594fSAndroid Build Coastguard Worker     // There is a second level counter in `Jit::shared_method_counters_` to make
2181*795d594fSAndroid Build Coastguard Worker     // sure we at least have a few samples before compiling a method.
2182*795d594fSAndroid Build Coastguard Worker     uint32_t shared_method_hotness;
2183*795d594fSAndroid Build Coastguard Worker   } tls32_;
2184*795d594fSAndroid Build Coastguard Worker 
2185*795d594fSAndroid Build Coastguard Worker   struct alignas(8) tls_64bit_sized_values {
tls_64bit_sized_valuestls_64bit_sized_values2186*795d594fSAndroid Build Coastguard Worker     tls_64bit_sized_values() : trace_clock_base(0) {
2187*795d594fSAndroid Build Coastguard Worker     }
2188*795d594fSAndroid Build Coastguard Worker 
2189*795d594fSAndroid Build Coastguard Worker     // The clock base used for tracing.
2190*795d594fSAndroid Build Coastguard Worker     uint64_t trace_clock_base;
2191*795d594fSAndroid Build Coastguard Worker 
2192*795d594fSAndroid Build Coastguard Worker     RuntimeStats stats;
2193*795d594fSAndroid Build Coastguard Worker   } tls64_;
2194*795d594fSAndroid Build Coastguard Worker 
2195*795d594fSAndroid Build Coastguard Worker   struct alignas(sizeof(void*)) tls_ptr_sized_values {
tls_ptr_sized_valuestls_ptr_sized_values2196*795d594fSAndroid Build Coastguard Worker       tls_ptr_sized_values() : card_table(nullptr),
2197*795d594fSAndroid Build Coastguard Worker                                exception(nullptr),
2198*795d594fSAndroid Build Coastguard Worker                                stack_end(nullptr),
2199*795d594fSAndroid Build Coastguard Worker                                managed_stack(),
2200*795d594fSAndroid Build Coastguard Worker                                suspend_trigger(nullptr),
2201*795d594fSAndroid Build Coastguard Worker                                jni_env(nullptr),
2202*795d594fSAndroid Build Coastguard Worker                                tmp_jni_env(nullptr),
2203*795d594fSAndroid Build Coastguard Worker                                self(nullptr),
2204*795d594fSAndroid Build Coastguard Worker                                opeer(nullptr),
2205*795d594fSAndroid Build Coastguard Worker                                jpeer(nullptr),
2206*795d594fSAndroid Build Coastguard Worker                                stack_begin(nullptr),
2207*795d594fSAndroid Build Coastguard Worker                                stack_size(0),
2208*795d594fSAndroid Build Coastguard Worker                                deps_or_stack_trace_sample(),
2209*795d594fSAndroid Build Coastguard Worker                                wait_next(nullptr),
2210*795d594fSAndroid Build Coastguard Worker                                monitor_enter_object(nullptr),
2211*795d594fSAndroid Build Coastguard Worker                                top_handle_scope(nullptr),
2212*795d594fSAndroid Build Coastguard Worker                                class_loader_override(nullptr),
2213*795d594fSAndroid Build Coastguard Worker                                stacked_shadow_frame_record(nullptr),
2214*795d594fSAndroid Build Coastguard Worker                                deoptimization_context_stack(nullptr),
2215*795d594fSAndroid Build Coastguard Worker                                frame_id_to_shadow_frame(nullptr),
2216*795d594fSAndroid Build Coastguard Worker                                name(nullptr),
2217*795d594fSAndroid Build Coastguard Worker                                pthread_self(0),
2218*795d594fSAndroid Build Coastguard Worker                                active_suspendall_barrier(nullptr),
2219*795d594fSAndroid Build Coastguard Worker                                active_suspend1_barriers(nullptr),
2220*795d594fSAndroid Build Coastguard Worker                                thread_local_pos(nullptr),
2221*795d594fSAndroid Build Coastguard Worker                                thread_local_end(nullptr),
2222*795d594fSAndroid Build Coastguard Worker                                thread_local_start(nullptr),
2223*795d594fSAndroid Build Coastguard Worker                                thread_local_limit(nullptr),
2224*795d594fSAndroid Build Coastguard Worker                                thread_local_objects(0),
2225*795d594fSAndroid Build Coastguard Worker                                checkpoint_function(nullptr),
2226*795d594fSAndroid Build Coastguard Worker                                thread_local_alloc_stack_top(nullptr),
2227*795d594fSAndroid Build Coastguard Worker                                thread_local_alloc_stack_end(nullptr),
2228*795d594fSAndroid Build Coastguard Worker                                mutator_lock(nullptr),
2229*795d594fSAndroid Build Coastguard Worker                                flip_function(nullptr),
2230*795d594fSAndroid Build Coastguard Worker                                thread_local_mark_stack(nullptr),
2231*795d594fSAndroid Build Coastguard Worker                                async_exception(nullptr),
2232*795d594fSAndroid Build Coastguard Worker                                top_reflective_handle_scope(nullptr),
2233*795d594fSAndroid Build Coastguard Worker                                method_trace_buffer(nullptr),
2234*795d594fSAndroid Build Coastguard Worker                                method_trace_buffer_curr_entry(nullptr),
2235*795d594fSAndroid Build Coastguard Worker                                thread_exit_flags(nullptr),
2236*795d594fSAndroid Build Coastguard Worker                                last_no_thread_suspension_cause(nullptr),
2237*795d594fSAndroid Build Coastguard Worker                                last_no_transaction_checks_cause(nullptr) {
2238*795d594fSAndroid Build Coastguard Worker       std::fill(held_mutexes, held_mutexes + kLockLevelCount, nullptr);
2239*795d594fSAndroid Build Coastguard Worker     }
2240*795d594fSAndroid Build Coastguard Worker 
2241*795d594fSAndroid Build Coastguard Worker     // The biased card table, see CardTable for details.
2242*795d594fSAndroid Build Coastguard Worker     uint8_t* card_table;
2243*795d594fSAndroid Build Coastguard Worker 
2244*795d594fSAndroid Build Coastguard Worker     // The pending exception or null.
2245*795d594fSAndroid Build Coastguard Worker     mirror::Throwable* exception;
2246*795d594fSAndroid Build Coastguard Worker 
2247*795d594fSAndroid Build Coastguard Worker     // The end of this thread's stack. This is the lowest safely-addressable address on the stack.
2248*795d594fSAndroid Build Coastguard Worker     // We leave extra space so there's room for the code that throws StackOverflowError.
2249*795d594fSAndroid Build Coastguard Worker     // Note: do not use directly, instead use GetStackEnd/SetStackEnd template function instead.
2250*795d594fSAndroid Build Coastguard Worker     uint8_t* stack_end;
2251*795d594fSAndroid Build Coastguard Worker 
2252*795d594fSAndroid Build Coastguard Worker     // The top of the managed stack often manipulated directly by compiler generated code.
2253*795d594fSAndroid Build Coastguard Worker     ManagedStack managed_stack;
2254*795d594fSAndroid Build Coastguard Worker 
2255*795d594fSAndroid Build Coastguard Worker     // In certain modes, setting this to 0 will trigger a SEGV and thus a suspend check.  It is
2256*795d594fSAndroid Build Coastguard Worker     // normally set to the address of itself. It should be cleared with release semantics to ensure
2257*795d594fSAndroid Build Coastguard Worker     // that prior state changes etc. are visible to any thread that faults as a result.
2258*795d594fSAndroid Build Coastguard Worker     // We assume that the kernel ensures that such changes are then visible to the faulting
2259*795d594fSAndroid Build Coastguard Worker     // thread, even if it is not an acquire load that faults. (Indeed, it seems unlikely that the
2260*795d594fSAndroid Build Coastguard Worker     // ordering semantics associated with the faulting load has any impact.)
2261*795d594fSAndroid Build Coastguard Worker     std::atomic<uintptr_t*> suspend_trigger;
2262*795d594fSAndroid Build Coastguard Worker 
2263*795d594fSAndroid Build Coastguard Worker     // Every thread may have an associated JNI environment
2264*795d594fSAndroid Build Coastguard Worker     JNIEnvExt* jni_env;
2265*795d594fSAndroid Build Coastguard Worker 
2266*795d594fSAndroid Build Coastguard Worker     // Temporary storage to transfer a pre-allocated JNIEnvExt from the creating thread to the
2267*795d594fSAndroid Build Coastguard Worker     // created thread.
2268*795d594fSAndroid Build Coastguard Worker     JNIEnvExt* tmp_jni_env;
2269*795d594fSAndroid Build Coastguard Worker 
2270*795d594fSAndroid Build Coastguard Worker     // Initialized to "this". On certain architectures (such as x86) reading off of Thread::Current
2271*795d594fSAndroid Build Coastguard Worker     // is easy but getting the address of Thread::Current is hard. This field can be read off of
2272*795d594fSAndroid Build Coastguard Worker     // Thread::Current to give the address.
2273*795d594fSAndroid Build Coastguard Worker     Thread* self;
2274*795d594fSAndroid Build Coastguard Worker 
2275*795d594fSAndroid Build Coastguard Worker     // Our managed peer (an instance of java.lang.Thread). The jobject version is used during thread
2276*795d594fSAndroid Build Coastguard Worker     // start up, until the thread is registered and the local opeer_ is used.
2277*795d594fSAndroid Build Coastguard Worker     mirror::Object* opeer;
2278*795d594fSAndroid Build Coastguard Worker     jobject jpeer;
2279*795d594fSAndroid Build Coastguard Worker 
2280*795d594fSAndroid Build Coastguard Worker     // The "lowest addressable byte" of the stack.
2281*795d594fSAndroid Build Coastguard Worker     // Note: do not use directly, instead use GetStackBegin/SetStackBegin template function instead.
2282*795d594fSAndroid Build Coastguard Worker     uint8_t* stack_begin;
2283*795d594fSAndroid Build Coastguard Worker 
2284*795d594fSAndroid Build Coastguard Worker     // Size of the stack.
2285*795d594fSAndroid Build Coastguard Worker     // Note: do not use directly, instead use GetStackSize/SetStackSize template function instead.
2286*795d594fSAndroid Build Coastguard Worker     size_t stack_size;
2287*795d594fSAndroid Build Coastguard Worker 
2288*795d594fSAndroid Build Coastguard Worker     // Sampling profiler and AOT verification cannot happen on the same run, so we share
2289*795d594fSAndroid Build Coastguard Worker     // the same entry for the stack trace and the verifier deps.
2290*795d594fSAndroid Build Coastguard Worker     union DepsOrStackTraceSample {
DepsOrStackTraceSample()2291*795d594fSAndroid Build Coastguard Worker       DepsOrStackTraceSample() {
2292*795d594fSAndroid Build Coastguard Worker         verifier_deps = nullptr;
2293*795d594fSAndroid Build Coastguard Worker         stack_trace_sample = nullptr;
2294*795d594fSAndroid Build Coastguard Worker       }
2295*795d594fSAndroid Build Coastguard Worker       // Pointer to previous stack trace captured by sampling profiler.
2296*795d594fSAndroid Build Coastguard Worker       std::vector<ArtMethod*>* stack_trace_sample;
2297*795d594fSAndroid Build Coastguard Worker       // When doing AOT verification, per-thread VerifierDeps.
2298*795d594fSAndroid Build Coastguard Worker       verifier::VerifierDeps* verifier_deps;
2299*795d594fSAndroid Build Coastguard Worker     } deps_or_stack_trace_sample;
2300*795d594fSAndroid Build Coastguard Worker 
2301*795d594fSAndroid Build Coastguard Worker     // The next thread in the wait set this thread is part of or null if not waiting.
2302*795d594fSAndroid Build Coastguard Worker     Thread* wait_next;
2303*795d594fSAndroid Build Coastguard Worker 
2304*795d594fSAndroid Build Coastguard Worker     // If we're blocked in MonitorEnter, this is the object we're trying to lock.
2305*795d594fSAndroid Build Coastguard Worker     mirror::Object* monitor_enter_object;
2306*795d594fSAndroid Build Coastguard Worker 
2307*795d594fSAndroid Build Coastguard Worker     // Top of linked list of handle scopes or null for none.
2308*795d594fSAndroid Build Coastguard Worker     BaseHandleScope* top_handle_scope;
2309*795d594fSAndroid Build Coastguard Worker 
2310*795d594fSAndroid Build Coastguard Worker     // Needed to get the right ClassLoader in JNI_OnLoad, but also
2311*795d594fSAndroid Build Coastguard Worker     // useful for testing.
2312*795d594fSAndroid Build Coastguard Worker     jobject class_loader_override;
2313*795d594fSAndroid Build Coastguard Worker 
2314*795d594fSAndroid Build Coastguard Worker     // For gc purpose, a shadow frame record stack that keeps track of:
2315*795d594fSAndroid Build Coastguard Worker     // 1) shadow frames under construction.
2316*795d594fSAndroid Build Coastguard Worker     // 2) deoptimization shadow frames.
2317*795d594fSAndroid Build Coastguard Worker     StackedShadowFrameRecord* stacked_shadow_frame_record;
2318*795d594fSAndroid Build Coastguard Worker 
2319*795d594fSAndroid Build Coastguard Worker     // Deoptimization return value record stack.
2320*795d594fSAndroid Build Coastguard Worker     DeoptimizationContextRecord* deoptimization_context_stack;
2321*795d594fSAndroid Build Coastguard Worker 
2322*795d594fSAndroid Build Coastguard Worker     // For debugger, a linked list that keeps the mapping from frame_id to shadow frame.
2323*795d594fSAndroid Build Coastguard Worker     // Shadow frames may be created before deoptimization happens so that the debugger can
2324*795d594fSAndroid Build Coastguard Worker     // set local values there first.
2325*795d594fSAndroid Build Coastguard Worker     FrameIdToShadowFrame* frame_id_to_shadow_frame;
2326*795d594fSAndroid Build Coastguard Worker 
2327*795d594fSAndroid Build Coastguard Worker     // A cached copy of the java.lang.Thread's (modified UTF-8) name.
2328*795d594fSAndroid Build Coastguard Worker     // If this is not null or kThreadNameDuringStartup, then it owns the malloc memory holding
2329*795d594fSAndroid Build Coastguard Worker     // the string. Updated in an RCU-like manner.
2330*795d594fSAndroid Build Coastguard Worker     std::atomic<const char*> name;
2331*795d594fSAndroid Build Coastguard Worker     static_assert(std::atomic<const char*>::is_always_lock_free);
2332*795d594fSAndroid Build Coastguard Worker 
2333*795d594fSAndroid Build Coastguard Worker     // A cached pthread_t for the pthread underlying this Thread*.
2334*795d594fSAndroid Build Coastguard Worker     pthread_t pthread_self;
2335*795d594fSAndroid Build Coastguard Worker 
2336*795d594fSAndroid Build Coastguard Worker     // After a thread observes a suspend request and enters a suspended state,
2337*795d594fSAndroid Build Coastguard Worker     // it notifies the requestor by arriving at a "suspend barrier". This consists of decrementing
2338*795d594fSAndroid Build Coastguard Worker     // the atomic integer representing the barrier. (This implementation was introduced in 2015 to
2339*795d594fSAndroid Build Coastguard Worker     // minimize cost. There may be other options.) These atomic integer barriers are always
2340*795d594fSAndroid Build Coastguard Worker     // stored on the requesting thread's stack. They are referenced from the target thread's
2341*795d594fSAndroid Build Coastguard Worker     // data structure in one of two ways; in either case the data structure referring to these
2342*795d594fSAndroid Build Coastguard Worker     // barriers is guarded by suspend_count_lock:
2343*795d594fSAndroid Build Coastguard Worker     // 1. A SuspendAll barrier is directly referenced from the target thread. Only one of these
2344*795d594fSAndroid Build Coastguard Worker     // can be active at a time:
2345*795d594fSAndroid Build Coastguard Worker     AtomicInteger* active_suspendall_barrier GUARDED_BY(Locks::thread_suspend_count_lock_);
2346*795d594fSAndroid Build Coastguard Worker     // 2. For individual thread suspensions, active barriers are embedded in a struct that is used
2347*795d594fSAndroid Build Coastguard Worker     // to link together all suspend requests for this thread. Unlike the SuspendAll case, each
2348*795d594fSAndroid Build Coastguard Worker     // barrier is referenced by a single target thread, and thus can appear only on a single list.
2349*795d594fSAndroid Build Coastguard Worker     // The struct as a whole is still stored on the requesting thread's stack.
2350*795d594fSAndroid Build Coastguard Worker     WrappedSuspend1Barrier* active_suspend1_barriers GUARDED_BY(Locks::thread_suspend_count_lock_);
2351*795d594fSAndroid Build Coastguard Worker 
2352*795d594fSAndroid Build Coastguard Worker     // thread_local_pos and thread_local_end must be consecutive for ldrd and are 8 byte aligned for
2353*795d594fSAndroid Build Coastguard Worker     // potentially better performance.
2354*795d594fSAndroid Build Coastguard Worker     uint8_t* thread_local_pos;
2355*795d594fSAndroid Build Coastguard Worker     uint8_t* thread_local_end;
2356*795d594fSAndroid Build Coastguard Worker 
2357*795d594fSAndroid Build Coastguard Worker     // Thread-local allocation pointer. Can be moved above the preceding two to correct alignment.
2358*795d594fSAndroid Build Coastguard Worker     uint8_t* thread_local_start;
2359*795d594fSAndroid Build Coastguard Worker 
2360*795d594fSAndroid Build Coastguard Worker     // Thread local limit is how much we can expand the thread local buffer to, it is greater or
2361*795d594fSAndroid Build Coastguard Worker     // equal to thread_local_end.
2362*795d594fSAndroid Build Coastguard Worker     uint8_t* thread_local_limit;
2363*795d594fSAndroid Build Coastguard Worker 
2364*795d594fSAndroid Build Coastguard Worker     size_t thread_local_objects;
2365*795d594fSAndroid Build Coastguard Worker 
2366*795d594fSAndroid Build Coastguard Worker     // Pending checkpoint function or null if non-pending. If this checkpoint is set and someone
2367*795d594fSAndroid Build Coastguard Worker     // requests another checkpoint, it goes to the checkpoint overflow list.
2368*795d594fSAndroid Build Coastguard Worker     Closure* checkpoint_function GUARDED_BY(Locks::thread_suspend_count_lock_);
2369*795d594fSAndroid Build Coastguard Worker 
2370*795d594fSAndroid Build Coastguard Worker     // Entrypoint function pointers.
2371*795d594fSAndroid Build Coastguard Worker     // TODO: move this to more of a global offset table model to avoid per-thread duplication.
2372*795d594fSAndroid Build Coastguard Worker     JniEntryPoints jni_entrypoints;
2373*795d594fSAndroid Build Coastguard Worker     QuickEntryPoints quick_entrypoints;
2374*795d594fSAndroid Build Coastguard Worker 
2375*795d594fSAndroid Build Coastguard Worker     // There are RosAlloc::kNumThreadLocalSizeBrackets thread-local size brackets per thread.
2376*795d594fSAndroid Build Coastguard Worker     void* rosalloc_runs[kNumRosAllocThreadLocalSizeBracketsInThread];
2377*795d594fSAndroid Build Coastguard Worker 
2378*795d594fSAndroid Build Coastguard Worker     // Thread-local allocation stack data/routines.
2379*795d594fSAndroid Build Coastguard Worker     StackReference<mirror::Object>* thread_local_alloc_stack_top;
2380*795d594fSAndroid Build Coastguard Worker     StackReference<mirror::Object>* thread_local_alloc_stack_end;
2381*795d594fSAndroid Build Coastguard Worker 
2382*795d594fSAndroid Build Coastguard Worker     // Pointer to the mutator lock.
2383*795d594fSAndroid Build Coastguard Worker     // This is the same as `Locks::mutator_lock_` but cached for faster state transitions.
2384*795d594fSAndroid Build Coastguard Worker     MutatorMutex* mutator_lock;
2385*795d594fSAndroid Build Coastguard Worker 
2386*795d594fSAndroid Build Coastguard Worker     // Support for Mutex lock hierarchy bug detection.
2387*795d594fSAndroid Build Coastguard Worker     BaseMutex* held_mutexes[kLockLevelCount];
2388*795d594fSAndroid Build Coastguard Worker 
2389*795d594fSAndroid Build Coastguard Worker     // The function used for thread flip.  Set while holding Locks::thread_suspend_count_lock_ and
2390*795d594fSAndroid Build Coastguard Worker     // with all other threads suspended.  May be cleared while being read.
2391*795d594fSAndroid Build Coastguard Worker     std::atomic<Closure*> flip_function;
2392*795d594fSAndroid Build Coastguard Worker 
2393*795d594fSAndroid Build Coastguard Worker     union {
2394*795d594fSAndroid Build Coastguard Worker       // Thread-local mark stack for the concurrent copying collector.
2395*795d594fSAndroid Build Coastguard Worker       gc::accounting::AtomicStack<mirror::Object>* thread_local_mark_stack;
2396*795d594fSAndroid Build Coastguard Worker       // Thread-local page-sized buffer for userfaultfd GC.
2397*795d594fSAndroid Build Coastguard Worker       uint8_t* thread_local_gc_buffer;
2398*795d594fSAndroid Build Coastguard Worker     };
2399*795d594fSAndroid Build Coastguard Worker 
2400*795d594fSAndroid Build Coastguard Worker     // The pending async-exception or null.
2401*795d594fSAndroid Build Coastguard Worker     mirror::Throwable* async_exception;
2402*795d594fSAndroid Build Coastguard Worker 
2403*795d594fSAndroid Build Coastguard Worker     // Top of the linked-list for reflective-handle scopes or null if none.
2404*795d594fSAndroid Build Coastguard Worker     BaseReflectiveHandleScope* top_reflective_handle_scope;
2405*795d594fSAndroid Build Coastguard Worker 
2406*795d594fSAndroid Build Coastguard Worker     // Pointer to a thread-local buffer for method tracing.
2407*795d594fSAndroid Build Coastguard Worker     uintptr_t* method_trace_buffer;
2408*795d594fSAndroid Build Coastguard Worker 
2409*795d594fSAndroid Build Coastguard Worker     // Pointer to the current entry in the buffer.
2410*795d594fSAndroid Build Coastguard Worker     uintptr_t* method_trace_buffer_curr_entry;
2411*795d594fSAndroid Build Coastguard Worker 
2412*795d594fSAndroid Build Coastguard Worker     // Pointer to the first node of an intrusively doubly-linked list of ThreadExitFlags.
2413*795d594fSAndroid Build Coastguard Worker     ThreadExitFlag* thread_exit_flags GUARDED_BY(Locks::thread_list_lock_);
2414*795d594fSAndroid Build Coastguard Worker 
2415*795d594fSAndroid Build Coastguard Worker     // If no_thread_suspension_ is > 0, what is causing that assertion.
2416*795d594fSAndroid Build Coastguard Worker     const char* last_no_thread_suspension_cause;
2417*795d594fSAndroid Build Coastguard Worker 
2418*795d594fSAndroid Build Coastguard Worker     // If the thread is asserting that there should be no transaction checks,
2419*795d594fSAndroid Build Coastguard Worker     // what is causing that assertion (debug builds only).
2420*795d594fSAndroid Build Coastguard Worker     const char* last_no_transaction_checks_cause;
2421*795d594fSAndroid Build Coastguard Worker   } tlsPtr_;
2422*795d594fSAndroid Build Coastguard Worker 
2423*795d594fSAndroid Build Coastguard Worker   // Small thread-local cache to be used from the interpreter.
2424*795d594fSAndroid Build Coastguard Worker   // It is keyed by dex instruction pointer.
2425*795d594fSAndroid Build Coastguard Worker   // The value is opcode-depended (e.g. field offset).
2426*795d594fSAndroid Build Coastguard Worker   InterpreterCache interpreter_cache_;
2427*795d594fSAndroid Build Coastguard Worker 
2428*795d594fSAndroid Build Coastguard Worker   // All fields below this line should not be accessed by native code. This means these fields can
2429*795d594fSAndroid Build Coastguard Worker   // be modified, rearranged, added or removed without having to modify asm_support.h
2430*795d594fSAndroid Build Coastguard Worker 
2431*795d594fSAndroid Build Coastguard Worker   // Guards the 'wait_monitor_' members.
2432*795d594fSAndroid Build Coastguard Worker   Mutex* wait_mutex_ DEFAULT_MUTEX_ACQUIRED_AFTER;
2433*795d594fSAndroid Build Coastguard Worker 
2434*795d594fSAndroid Build Coastguard Worker   // Condition variable waited upon during a wait.
2435*795d594fSAndroid Build Coastguard Worker   ConditionVariable* wait_cond_ GUARDED_BY(wait_mutex_);
2436*795d594fSAndroid Build Coastguard Worker   // Pointer to the monitor lock we're currently waiting on or null if not waiting.
2437*795d594fSAndroid Build Coastguard Worker   Monitor* wait_monitor_ GUARDED_BY(wait_mutex_);
2438*795d594fSAndroid Build Coastguard Worker 
2439*795d594fSAndroid Build Coastguard Worker   // Debug disable read barrier count, only is checked for debug builds and only in the runtime.
2440*795d594fSAndroid Build Coastguard Worker   uint8_t debug_disallow_read_barrier_ = 0;
2441*795d594fSAndroid Build Coastguard Worker 
2442*795d594fSAndroid Build Coastguard Worker   // Counters used only for debugging and error reporting.  Likely to wrap.  Small to avoid
2443*795d594fSAndroid Build Coastguard Worker   // increasing Thread size.
2444*795d594fSAndroid Build Coastguard Worker   // We currently maintain these unconditionally, since it doesn't cost much, and we seem to have
2445*795d594fSAndroid Build Coastguard Worker   // persistent issues with suspension timeouts, which these should help to diagnose.
2446*795d594fSAndroid Build Coastguard Worker   // TODO: Reconsider this.
2447*795d594fSAndroid Build Coastguard Worker   std::atomic<uint8_t> suspended_count_ = 0;   // Number of times we entered a suspended state after
2448*795d594fSAndroid Build Coastguard Worker                                                // running checkpoints.
2449*795d594fSAndroid Build Coastguard Worker   std::atomic<uint8_t> checkpoint_count_ = 0;  // Number of checkpoints we started running.
2450*795d594fSAndroid Build Coastguard Worker 
2451*795d594fSAndroid Build Coastguard Worker   // Note that it is not in the packed struct, may not be accessed for cross compilation.
2452*795d594fSAndroid Build Coastguard Worker   uintptr_t poison_object_cookie_ = 0;
2453*795d594fSAndroid Build Coastguard Worker 
2454*795d594fSAndroid Build Coastguard Worker   // Pending extra checkpoints if checkpoint_function_ is already used.
2455*795d594fSAndroid Build Coastguard Worker   std::list<Closure*> checkpoint_overflow_ GUARDED_BY(Locks::thread_suspend_count_lock_);
2456*795d594fSAndroid Build Coastguard Worker 
2457*795d594fSAndroid Build Coastguard Worker   // Custom TLS field that can be used by plugins or the runtime. Should not be accessed directly by
2458*795d594fSAndroid Build Coastguard Worker   // compiled code or entrypoints.
2459*795d594fSAndroid Build Coastguard Worker   SafeMap<std::string, std::unique_ptr<TLSData>, std::less<>> custom_tls_
2460*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(Locks::custom_tls_lock_);
2461*795d594fSAndroid Build Coastguard Worker 
2462*795d594fSAndroid Build Coastguard Worker #if !defined(__BIONIC__)
2463*795d594fSAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
2464*795d594fSAndroid Build Coastguard Worker     __attribute__((tls_model("initial-exec")))
2465*795d594fSAndroid Build Coastguard Worker #endif
2466*795d594fSAndroid Build Coastguard Worker   static thread_local Thread* self_tls_;
2467*795d594fSAndroid Build Coastguard Worker #endif
2468*795d594fSAndroid Build Coastguard Worker 
2469*795d594fSAndroid Build Coastguard Worker   // True if the thread is some form of runtime thread (ex, GC or JIT).
2470*795d594fSAndroid Build Coastguard Worker   bool is_runtime_thread_;
2471*795d594fSAndroid Build Coastguard Worker 
2472*795d594fSAndroid Build Coastguard Worker   // Set during execution of JNI methods that get field and method id's as part of determining if
2473*795d594fSAndroid Build Coastguard Worker   // the caller is allowed to access all fields and methods in the Core Platform API.
2474*795d594fSAndroid Build Coastguard Worker   uint32_t core_platform_api_cookie_ = 0;
2475*795d594fSAndroid Build Coastguard Worker 
2476*795d594fSAndroid Build Coastguard Worker   friend class gc::collector::SemiSpace;  // For getting stack traces.
2477*795d594fSAndroid Build Coastguard Worker   friend class Runtime;  // For CreatePeer.
2478*795d594fSAndroid Build Coastguard Worker   friend class QuickExceptionHandler;  // For dumping the stack.
2479*795d594fSAndroid Build Coastguard Worker   friend class ScopedAssertNoTransactionChecks;
2480*795d594fSAndroid Build Coastguard Worker   friend class ScopedThreadStateChange;
2481*795d594fSAndroid Build Coastguard Worker   friend class StubTest;  // For accessing entrypoints.
2482*795d594fSAndroid Build Coastguard Worker   friend class ThreadList;  // For ~Thread, Destroy and EnsureFlipFunctionStarted.
2483*795d594fSAndroid Build Coastguard Worker   friend class EntrypointsOrderTest;  // To test the order of tls entries.
2484*795d594fSAndroid Build Coastguard Worker   friend class JniCompilerTest;  // For intercepting JNI entrypoint calls.
2485*795d594fSAndroid Build Coastguard Worker 
2486*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(Thread);
2487*795d594fSAndroid Build Coastguard Worker };
2488*795d594fSAndroid Build Coastguard Worker 
2489*795d594fSAndroid Build Coastguard Worker class SCOPED_CAPABILITY ScopedAssertNoThreadSuspension {
2490*795d594fSAndroid Build Coastguard Worker  public:
2491*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ScopedAssertNoThreadSuspension(const char* cause,
2492*795d594fSAndroid Build Coastguard Worker                                                bool enabled = true)
ACQUIRE(Roles::uninterruptible_)2493*795d594fSAndroid Build Coastguard Worker       ACQUIRE(Roles::uninterruptible_)
2494*795d594fSAndroid Build Coastguard Worker       : enabled_(enabled) {
2495*795d594fSAndroid Build Coastguard Worker     if (!enabled_) {
2496*795d594fSAndroid Build Coastguard Worker       return;
2497*795d594fSAndroid Build Coastguard Worker     }
2498*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
2499*795d594fSAndroid Build Coastguard Worker       self_ = Thread::Current();
2500*795d594fSAndroid Build Coastguard Worker       old_cause_ = self_->StartAssertNoThreadSuspension(cause);
2501*795d594fSAndroid Build Coastguard Worker     } else {
2502*795d594fSAndroid Build Coastguard Worker       Roles::uninterruptible_.Acquire();  // No-op.
2503*795d594fSAndroid Build Coastguard Worker     }
2504*795d594fSAndroid Build Coastguard Worker   }
~ScopedAssertNoThreadSuspension()2505*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ~ScopedAssertNoThreadSuspension() RELEASE(Roles::uninterruptible_) {
2506*795d594fSAndroid Build Coastguard Worker     if (!enabled_) {
2507*795d594fSAndroid Build Coastguard Worker       return;
2508*795d594fSAndroid Build Coastguard Worker     }
2509*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
2510*795d594fSAndroid Build Coastguard Worker       self_->EndAssertNoThreadSuspension(old_cause_);
2511*795d594fSAndroid Build Coastguard Worker     } else {
2512*795d594fSAndroid Build Coastguard Worker       Roles::uninterruptible_.Release();  // No-op.
2513*795d594fSAndroid Build Coastguard Worker     }
2514*795d594fSAndroid Build Coastguard Worker   }
2515*795d594fSAndroid Build Coastguard Worker 
2516*795d594fSAndroid Build Coastguard Worker  private:
2517*795d594fSAndroid Build Coastguard Worker   Thread* self_;
2518*795d594fSAndroid Build Coastguard Worker   const bool enabled_;
2519*795d594fSAndroid Build Coastguard Worker   const char* old_cause_;
2520*795d594fSAndroid Build Coastguard Worker };
2521*795d594fSAndroid Build Coastguard Worker 
2522*795d594fSAndroid Build Coastguard Worker class ScopedAllowThreadSuspension {
2523*795d594fSAndroid Build Coastguard Worker  public:
ScopedAllowThreadSuspension()2524*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ScopedAllowThreadSuspension() RELEASE(Roles::uninterruptible_) {
2525*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
2526*795d594fSAndroid Build Coastguard Worker       self_ = Thread::Current();
2527*795d594fSAndroid Build Coastguard Worker       old_cause_ = self_->EndAssertNoThreadSuspension();
2528*795d594fSAndroid Build Coastguard Worker     } else {
2529*795d594fSAndroid Build Coastguard Worker       Roles::uninterruptible_.Release();  // No-op.
2530*795d594fSAndroid Build Coastguard Worker     }
2531*795d594fSAndroid Build Coastguard Worker   }
~ScopedAllowThreadSuspension()2532*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE ~ScopedAllowThreadSuspension() ACQUIRE(Roles::uninterruptible_) {
2533*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
2534*795d594fSAndroid Build Coastguard Worker       CHECK(self_->StartAssertNoThreadSuspension(old_cause_) == nullptr);
2535*795d594fSAndroid Build Coastguard Worker     } else {
2536*795d594fSAndroid Build Coastguard Worker       Roles::uninterruptible_.Acquire();  // No-op.
2537*795d594fSAndroid Build Coastguard Worker     }
2538*795d594fSAndroid Build Coastguard Worker   }
2539*795d594fSAndroid Build Coastguard Worker 
2540*795d594fSAndroid Build Coastguard Worker  private:
2541*795d594fSAndroid Build Coastguard Worker   Thread* self_;
2542*795d594fSAndroid Build Coastguard Worker   const char* old_cause_;
2543*795d594fSAndroid Build Coastguard Worker };
2544*795d594fSAndroid Build Coastguard Worker 
2545*795d594fSAndroid Build Coastguard Worker 
2546*795d594fSAndroid Build Coastguard Worker class ScopedStackedShadowFramePusher {
2547*795d594fSAndroid Build Coastguard Worker  public:
ScopedStackedShadowFramePusher(Thread * self,ShadowFrame * sf)2548*795d594fSAndroid Build Coastguard Worker   ScopedStackedShadowFramePusher(Thread* self, ShadowFrame* sf) : self_(self), sf_(sf) {
2549*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(sf->GetLink(), nullptr);
2550*795d594fSAndroid Build Coastguard Worker     self_->PushStackedShadowFrame(sf, StackedShadowFrameType::kShadowFrameUnderConstruction);
2551*795d594fSAndroid Build Coastguard Worker   }
~ScopedStackedShadowFramePusher()2552*795d594fSAndroid Build Coastguard Worker   ~ScopedStackedShadowFramePusher() {
2553*795d594fSAndroid Build Coastguard Worker     ShadowFrame* sf = self_->PopStackedShadowFrame();
2554*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(sf, sf_);
2555*795d594fSAndroid Build Coastguard Worker   }
2556*795d594fSAndroid Build Coastguard Worker 
2557*795d594fSAndroid Build Coastguard Worker  private:
2558*795d594fSAndroid Build Coastguard Worker   Thread* const self_;
2559*795d594fSAndroid Build Coastguard Worker   ShadowFrame* const sf_;
2560*795d594fSAndroid Build Coastguard Worker 
2561*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedStackedShadowFramePusher);
2562*795d594fSAndroid Build Coastguard Worker };
2563*795d594fSAndroid Build Coastguard Worker 
2564*795d594fSAndroid Build Coastguard Worker // Only works for debug builds.
2565*795d594fSAndroid Build Coastguard Worker class ScopedDebugDisallowReadBarriers {
2566*795d594fSAndroid Build Coastguard Worker  public:
ScopedDebugDisallowReadBarriers(Thread * self)2567*795d594fSAndroid Build Coastguard Worker   explicit ScopedDebugDisallowReadBarriers(Thread* self) : self_(self) {
2568*795d594fSAndroid Build Coastguard Worker     self_->ModifyDebugDisallowReadBarrier(1);
2569*795d594fSAndroid Build Coastguard Worker   }
~ScopedDebugDisallowReadBarriers()2570*795d594fSAndroid Build Coastguard Worker   ~ScopedDebugDisallowReadBarriers() {
2571*795d594fSAndroid Build Coastguard Worker     self_->ModifyDebugDisallowReadBarrier(-1);
2572*795d594fSAndroid Build Coastguard Worker   }
2573*795d594fSAndroid Build Coastguard Worker 
2574*795d594fSAndroid Build Coastguard Worker  private:
2575*795d594fSAndroid Build Coastguard Worker   Thread* const self_;
2576*795d594fSAndroid Build Coastguard Worker };
2577*795d594fSAndroid Build Coastguard Worker 
2578*795d594fSAndroid Build Coastguard Worker class ThreadLifecycleCallback {
2579*795d594fSAndroid Build Coastguard Worker  public:
~ThreadLifecycleCallback()2580*795d594fSAndroid Build Coastguard Worker   virtual ~ThreadLifecycleCallback() {}
2581*795d594fSAndroid Build Coastguard Worker 
2582*795d594fSAndroid Build Coastguard Worker   virtual void ThreadStart(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
2583*795d594fSAndroid Build Coastguard Worker   virtual void ThreadDeath(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
2584*795d594fSAndroid Build Coastguard Worker };
2585*795d594fSAndroid Build Coastguard Worker 
2586*795d594fSAndroid Build Coastguard Worker // Store an exception from the thread and suppress it for the duration of this object.
2587*795d594fSAndroid Build Coastguard Worker class ScopedExceptionStorage {
2588*795d594fSAndroid Build Coastguard Worker  public:
2589*795d594fSAndroid Build Coastguard Worker   EXPORT explicit ScopedExceptionStorage(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
2590*795d594fSAndroid Build Coastguard Worker   void SuppressOldException(const char* message = "") REQUIRES_SHARED(Locks::mutator_lock_);
2591*795d594fSAndroid Build Coastguard Worker   EXPORT ~ScopedExceptionStorage() REQUIRES_SHARED(Locks::mutator_lock_);
2592*795d594fSAndroid Build Coastguard Worker 
2593*795d594fSAndroid Build Coastguard Worker  private:
2594*795d594fSAndroid Build Coastguard Worker   Thread* self_;
2595*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs_;
2596*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Throwable> excp_;
2597*795d594fSAndroid Build Coastguard Worker };
2598*795d594fSAndroid Build Coastguard Worker 
2599*795d594fSAndroid Build Coastguard Worker EXPORT std::ostream& operator<<(std::ostream& os, const Thread& thread);
2600*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, StackedShadowFrameType thread);
2601*795d594fSAndroid Build Coastguard Worker 
2602*795d594fSAndroid Build Coastguard Worker }  // namespace art
2603*795d594fSAndroid Build Coastguard Worker 
2604*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_THREAD_H_
2605