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