Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_THREAD_H_
     18 #define ART_RUNTIME_THREAD_H_
     19 
     20 #include <pthread.h>
     21 
     22 #include <bitset>
     23 #include <deque>
     24 #include <iosfwd>
     25 #include <list>
     26 #include <string>
     27 
     28 #include "base/macros.h"
     29 #include "entrypoints/interpreter/interpreter_entrypoints.h"
     30 #include "entrypoints/jni/jni_entrypoints.h"
     31 #include "entrypoints/portable/portable_entrypoints.h"
     32 #include "entrypoints/quick/quick_entrypoints.h"
     33 #include "globals.h"
     34 #include "jvalue.h"
     35 #include "locks.h"
     36 #include "offsets.h"
     37 #include "root_visitor.h"
     38 #include "runtime_stats.h"
     39 #include "stack.h"
     40 #include "stack_indirect_reference_table.h"
     41 #include "thread_state.h"
     42 #include "throw_location.h"
     43 #include "UniquePtr.h"
     44 
     45 namespace art {
     46 
     47 namespace mirror {
     48   class ArtMethod;
     49   class Array;
     50   class Class;
     51   class ClassLoader;
     52   class Object;
     53   template<class T> class ObjectArray;
     54   template<class T> class PrimitiveArray;
     55   typedef PrimitiveArray<int32_t> IntArray;
     56   class StackTraceElement;
     57   class StaticStorageBase;
     58   class Throwable;
     59 }  // namespace mirror
     60 class BaseMutex;
     61 class ClassLinker;
     62 class Closure;
     63 class Context;
     64 struct DebugInvokeReq;
     65 class DexFile;
     66 struct JavaVMExt;
     67 struct JNIEnvExt;
     68 class Monitor;
     69 class Runtime;
     70 class ScopedObjectAccess;
     71 class ScopedObjectAccessUnchecked;
     72 class ShadowFrame;
     73 class Thread;
     74 class ThreadList;
     75 
     76 // Thread priorities. These must match the Thread.MIN_PRIORITY,
     77 // Thread.NORM_PRIORITY, and Thread.MAX_PRIORITY constants.
     78 enum ThreadPriority {
     79   kMinThreadPriority = 1,
     80   kNormThreadPriority = 5,
     81   kMaxThreadPriority = 10,
     82 };
     83 
     84 enum ThreadFlag {
     85   kSuspendRequest   = 1,  // If set implies that suspend_count_ > 0 and the Thread should enter the
     86                           // safepoint handler.
     87   kCheckpointRequest = 2  // Request that the thread do some checkpoint work and then continue.
     88 };
     89 
     90 class PACKED(4) Thread {
     91  public:
     92   // Space to throw a StackOverflowError in.
     93   static const size_t kStackOverflowReservedBytes = 16 * KB;
     94 
     95   // Creates a new native thread corresponding to the given managed peer.
     96   // Used to implement Thread.start.
     97   static void CreateNativeThread(JNIEnv* env, jobject peer, size_t stack_size, bool daemon);
     98 
     99   // Attaches the calling native thread to the runtime, returning the new native peer.
    100   // Used to implement JNI AttachCurrentThread and AttachCurrentThreadAsDaemon calls.
    101   static Thread* Attach(const char* thread_name, bool as_daemon, jobject thread_group,
    102                         bool create_peer);
    103 
    104   // Reset internal state of child thread after fork.
    105   void InitAfterFork();
    106 
    107   static Thread* Current() {
    108     // We rely on Thread::Current returning NULL for a detached thread, so it's not obvious
    109     // that we can replace this with a direct %fs access on x86.
    110     if (!is_started_) {
    111       return NULL;
    112     } else {
    113       void* thread = pthread_getspecific(Thread::pthread_key_self_);
    114       return reinterpret_cast<Thread*>(thread);
    115     }
    116   }
    117 
    118   static Thread* FromManagedThread(const ScopedObjectAccessUnchecked& ts,
    119                                    mirror::Object* thread_peer)
    120       EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_list_lock_)
    121       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    122       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    123   static Thread* FromManagedThread(const ScopedObjectAccessUnchecked& ts, jobject thread)
    124       EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_list_lock_)
    125       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    126       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    127 
    128   // Translates 172 to pAllocArrayFromCode and so on.
    129   static void DumpThreadOffset(std::ostream& os, uint32_t offset, size_t size_of_pointers);
    130 
    131   // Dumps a one-line summary of thread state (used for operator<<).
    132   void ShortDump(std::ostream& os) const;
    133 
    134   // Dumps the detailed thread state and the thread stack (used for SIGQUIT).
    135   void Dump(std::ostream& os) const
    136       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    137       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    138 
    139   // Dumps the SIGQUIT per-thread header. 'thread' can be NULL for a non-attached thread, in which
    140   // case we use 'tid' to identify the thread, and we'll include as much information as we can.
    141   static void DumpState(std::ostream& os, const Thread* thread, pid_t tid)
    142       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    143       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    144 
    145   ThreadState GetState() const {
    146     return static_cast<ThreadState>(state_and_flags_.as_struct.state);
    147   }
    148 
    149   ThreadState SetState(ThreadState new_state);
    150 
    151   int GetSuspendCount() const EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_) {
    152     return suspend_count_;
    153   }
    154 
    155   int GetDebugSuspendCount() const EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_) {
    156     return debug_suspend_count_;
    157   }
    158 
    159   bool IsSuspended() const {
    160     union StateAndFlags state_and_flags = state_and_flags_;
    161     return state_and_flags.as_struct.state != kRunnable &&
    162         (state_and_flags.as_struct.flags & kSuspendRequest) != 0;
    163   }
    164 
    165   void ModifySuspendCount(Thread* self, int delta, bool for_debugger)
    166       EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_);
    167 
    168   bool RequestCheckpoint(Closure* function);
    169 
    170   // Called when thread detected that the thread_suspend_count_ was non-zero. Gives up share of
    171   // mutator_lock_ and waits until it is resumed and thread_suspend_count_ is zero.
    172   void FullSuspendCheck()
    173       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    174       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    175 
    176   // Transition from non-runnable to runnable state acquiring share on mutator_lock_.
    177   ThreadState TransitionFromSuspendedToRunnable()
    178       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    179       SHARED_LOCK_FUNCTION(Locks::mutator_lock_)
    180       ALWAYS_INLINE;
    181 
    182   // Transition from runnable into a state where mutator privileges are denied. Releases share of
    183   // mutator lock.
    184   void TransitionFromRunnableToSuspended(ThreadState new_state)
    185       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    186       UNLOCK_FUNCTION(Locks::mutator_lock_)
    187       ALWAYS_INLINE;
    188 
    189   // Wait for a debugger suspension on the thread associated with the given peer. Returns the
    190   // thread on success, else NULL. If the thread should be suspended then request_suspension should
    191   // be true on entry. If the suspension times out then *timeout is set to true.
    192   static Thread* SuspendForDebugger(jobject peer,  bool request_suspension, bool* timed_out)
    193       LOCKS_EXCLUDED(Locks::mutator_lock_,
    194                      Locks::thread_list_lock_,
    195                      Locks::thread_suspend_count_lock_);
    196 
    197   // Once called thread suspension will cause an assertion failure.
    198 #ifndef NDEBUG
    199   const char* StartAssertNoThreadSuspension(const char* cause) {
    200     CHECK(cause != NULL);
    201     const char* previous_cause = last_no_thread_suspension_cause_;
    202     no_thread_suspension_++;
    203     last_no_thread_suspension_cause_ = cause;
    204     return previous_cause;
    205   }
    206 #else
    207   const char* StartAssertNoThreadSuspension(const char* cause) {
    208     CHECK(cause != NULL);
    209     return NULL;
    210   }
    211 #endif
    212 
    213   // End region where no thread suspension is expected.
    214 #ifndef NDEBUG
    215   void EndAssertNoThreadSuspension(const char* old_cause) {
    216     CHECK(old_cause != NULL || no_thread_suspension_ == 1);
    217     CHECK_GT(no_thread_suspension_, 0U);
    218     no_thread_suspension_--;
    219     last_no_thread_suspension_cause_ = old_cause;
    220   }
    221 #else
    222   void EndAssertNoThreadSuspension(const char*) {
    223   }
    224 #endif
    225 
    226 
    227   void AssertThreadSuspensionIsAllowable(bool check_locks = true) const;
    228 
    229   bool IsDaemon() const {
    230     return daemon_;
    231   }
    232 
    233   bool HoldsLock(mirror::Object*);
    234 
    235   /*
    236    * Changes the priority of this thread to match that of the java.lang.Thread object.
    237    *
    238    * We map a priority value from 1-10 to Linux "nice" values, where lower
    239    * numbers indicate higher priority.
    240    */
    241   void SetNativePriority(int newPriority);
    242 
    243   /*
    244    * Returns the thread priority for the current thread by querying the system.
    245    * This is useful when attaching a thread through JNI.
    246    *
    247    * Returns a value from 1 to 10 (compatible with java.lang.Thread values).
    248    */
    249   static int GetNativePriority();
    250 
    251   uint32_t GetThinLockId() const {
    252     return thin_lock_id_;
    253   }
    254 
    255   pid_t GetTid() const {
    256     return tid_;
    257   }
    258 
    259   // Returns the java.lang.Thread's name, or NULL if this Thread* doesn't have a peer.
    260   mirror::String* GetThreadName(const ScopedObjectAccessUnchecked& ts) const
    261       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    262 
    263   // Sets 'name' to the java.lang.Thread's name. This requires no transition to managed code,
    264   // allocation, or locking.
    265   void GetThreadName(std::string& name) const;
    266 
    267   // Sets the thread's name.
    268   void SetThreadName(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    269 
    270   // Returns the thread-specific CPU-time clock in microseconds or -1 if unavailable.
    271   uint64_t GetCpuMicroTime() const;
    272 
    273   mirror::Object* GetPeer() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    274     CHECK(jpeer_ == NULL);
    275     return opeer_;
    276   }
    277 
    278   bool HasPeer() const {
    279     return jpeer_ != NULL || opeer_ != NULL;
    280   }
    281 
    282   RuntimeStats* GetStats() {
    283     return &stats_;
    284   }
    285 
    286   bool IsStillStarting() const;
    287 
    288   bool IsExceptionPending() const {
    289     return exception_ != NULL;
    290   }
    291 
    292   mirror::Throwable* GetException(ThrowLocation* throw_location) const
    293       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    294     if (throw_location != NULL) {
    295       *throw_location = throw_location_;
    296     }
    297     return exception_;
    298   }
    299 
    300   void AssertNoPendingException() const;
    301 
    302   void SetException(const ThrowLocation& throw_location, mirror::Throwable* new_exception)
    303       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    304     CHECK(new_exception != NULL);
    305     // TODO: DCHECK(!IsExceptionPending());
    306     exception_ = new_exception;
    307     throw_location_ = throw_location;
    308   }
    309 
    310   void ClearException() {
    311     exception_ = NULL;
    312     throw_location_.Clear();
    313   }
    314 
    315   // Find catch block and perform long jump to appropriate exception handle
    316   void QuickDeliverException() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    317 
    318   Context* GetLongJumpContext();
    319   void ReleaseLongJumpContext(Context* context) {
    320     DCHECK(long_jump_context_ == NULL);
    321     long_jump_context_ = context;
    322   }
    323 
    324   mirror::ArtMethod* GetCurrentMethod(uint32_t* dex_pc) const
    325       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    326 
    327   ThrowLocation GetCurrentLocationForThrow() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    328 
    329   void SetTopOfStack(void* stack, uintptr_t pc) {
    330     mirror::ArtMethod** top_method = reinterpret_cast<mirror::ArtMethod**>(stack);
    331     managed_stack_.SetTopQuickFrame(top_method);
    332     managed_stack_.SetTopQuickFramePc(pc);
    333   }
    334 
    335   void SetTopOfShadowStack(ShadowFrame* top) {
    336     managed_stack_.SetTopShadowFrame(top);
    337   }
    338 
    339   bool HasManagedStack() const {
    340     return managed_stack_.GetTopQuickFrame() != NULL || managed_stack_.GetTopShadowFrame() != NULL;
    341   }
    342 
    343   // If 'msg' is NULL, no detail message is set.
    344   void ThrowNewException(const ThrowLocation& throw_location,
    345                          const char* exception_class_descriptor, const char* msg)
    346       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    347 
    348   // If 'msg' is NULL, no detail message is set. An exception must be pending, and will be
    349   // used as the new exception's cause.
    350   void ThrowNewWrappedException(const ThrowLocation& throw_location,
    351                                 const char* exception_class_descriptor,
    352                                 const char* msg)
    353       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    354 
    355   void ThrowNewExceptionF(const ThrowLocation& throw_location,
    356                           const char* exception_class_descriptor, const char* fmt, ...)
    357       __attribute__((format(printf, 4, 5)))
    358       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    359 
    360   void ThrowNewExceptionV(const ThrowLocation& throw_location,
    361                           const char* exception_class_descriptor, const char* fmt, va_list ap)
    362       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    363 
    364   // OutOfMemoryError is special, because we need to pre-allocate an instance.
    365   // Only the GC should call this.
    366   void ThrowOutOfMemoryError(const char* msg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    367 
    368   static void Startup();
    369   static void FinishStartup();
    370   static void Shutdown();
    371 
    372   // JNI methods
    373   JNIEnvExt* GetJniEnv() const {
    374     return jni_env_;
    375   }
    376 
    377   // Convert a jobject into a Object*
    378   mirror::Object* DecodeJObject(jobject obj) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    379 
    380   // Implements java.lang.Thread.interrupted.
    381   bool Interrupted();
    382   // Implements java.lang.Thread.isInterrupted.
    383   bool IsInterrupted();
    384   void Interrupt();
    385   void Notify();
    386 
    387   mirror::ClassLoader* GetClassLoaderOverride() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    388     return class_loader_override_;
    389   }
    390 
    391   void SetClassLoaderOverride(mirror::ClassLoader* class_loader_override) {
    392     class_loader_override_ = class_loader_override;
    393   }
    394 
    395   // Create the internal representation of a stack trace, that is more time
    396   // and space efficient to compute than the StackTraceElement[]
    397   jobject CreateInternalStackTrace(const ScopedObjectAccessUnchecked& soa) const
    398       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    399 
    400   // Convert an internal stack trace representation (returned by CreateInternalStackTrace) to a
    401   // StackTraceElement[]. If output_array is NULL, a new array is created, otherwise as many
    402   // frames as will fit are written into the given array. If stack_depth is non-NULL, it's updated
    403   // with the number of valid frames in the returned array.
    404   static jobjectArray InternalStackTraceToStackTraceElementArray(JNIEnv* env, jobject internal,
    405       jobjectArray output_array = NULL, int* stack_depth = NULL);
    406 
    407   void VisitRoots(RootVisitor* visitor, void* arg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    408 
    409   void VerifyRoots(VerifyRootVisitor* visitor, void* arg)
    410       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    411 
    412   void VerifyStack() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    413 
    414   //
    415   // Offsets of various members of native Thread class, used by compiled code.
    416   //
    417 
    418   static ThreadOffset SelfOffset() {
    419     return ThreadOffset(OFFSETOF_MEMBER(Thread, self_));
    420   }
    421 
    422   static ThreadOffset ExceptionOffset() {
    423     return ThreadOffset(OFFSETOF_MEMBER(Thread, exception_));
    424   }
    425 
    426   static ThreadOffset PeerOffset() {
    427     return ThreadOffset(OFFSETOF_MEMBER(Thread, opeer_));
    428   }
    429 
    430   static ThreadOffset ThinLockIdOffset() {
    431     return ThreadOffset(OFFSETOF_MEMBER(Thread, thin_lock_id_));
    432   }
    433 
    434   static ThreadOffset CardTableOffset() {
    435     return ThreadOffset(OFFSETOF_MEMBER(Thread, card_table_));
    436   }
    437 
    438   static ThreadOffset ThreadFlagsOffset() {
    439     return ThreadOffset(OFFSETOF_MEMBER(Thread, state_and_flags_));
    440   }
    441 
    442   // Size of stack less any space reserved for stack overflow
    443   size_t GetStackSize() const {
    444     return stack_size_ - (stack_end_ - stack_begin_);
    445   }
    446 
    447   byte* GetStackEnd() const {
    448     return stack_end_;
    449   }
    450 
    451   // Set the stack end to that to be used during a stack overflow
    452   void SetStackEndForStackOverflow() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    453 
    454   // Set the stack end to that to be used during regular execution
    455   void ResetDefaultStackEnd() {
    456     // Our stacks grow down, so we want stack_end_ to be near there, but reserving enough room
    457     // to throw a StackOverflowError.
    458     stack_end_ = stack_begin_ + kStackOverflowReservedBytes;
    459   }
    460 
    461   bool IsHandlingStackOverflow() const {
    462     return stack_end_ == stack_begin_;
    463   }
    464 
    465   static ThreadOffset StackEndOffset() {
    466     return ThreadOffset(OFFSETOF_MEMBER(Thread, stack_end_));
    467   }
    468 
    469   static ThreadOffset JniEnvOffset() {
    470     return ThreadOffset(OFFSETOF_MEMBER(Thread, jni_env_));
    471   }
    472 
    473   static ThreadOffset TopOfManagedStackOffset() {
    474     return ThreadOffset(OFFSETOF_MEMBER(Thread, managed_stack_) +
    475                         ManagedStack::TopQuickFrameOffset());
    476   }
    477 
    478   static ThreadOffset TopOfManagedStackPcOffset() {
    479     return ThreadOffset(OFFSETOF_MEMBER(Thread, managed_stack_) +
    480                         ManagedStack::TopQuickFramePcOffset());
    481   }
    482 
    483   const ManagedStack* GetManagedStack() const {
    484     return &managed_stack_;
    485   }
    486 
    487   // Linked list recording fragments of managed stack.
    488   void PushManagedStackFragment(ManagedStack* fragment) {
    489     managed_stack_.PushManagedStackFragment(fragment);
    490   }
    491   void PopManagedStackFragment(const ManagedStack& fragment) {
    492     managed_stack_.PopManagedStackFragment(fragment);
    493   }
    494 
    495   ShadowFrame* PushShadowFrame(ShadowFrame* new_top_frame) {
    496     return managed_stack_.PushShadowFrame(new_top_frame);
    497   }
    498 
    499   ShadowFrame* PopShadowFrame() {
    500     return managed_stack_.PopShadowFrame();
    501   }
    502 
    503   static ThreadOffset TopShadowFrameOffset() {
    504     return ThreadOffset(OFFSETOF_MEMBER(Thread, managed_stack_) +
    505                         ManagedStack::TopShadowFrameOffset());
    506   }
    507 
    508   // Number of references allocated in JNI ShadowFrames on this thread
    509   size_t NumJniShadowFrameReferences() const {
    510     return managed_stack_.NumJniShadowFrameReferences();
    511   }
    512 
    513   // Number of references in SIRTs on this thread
    514   size_t NumSirtReferences();
    515 
    516   // Number of references allocated in SIRTs & JNI shadow frames on this thread
    517   size_t NumStackReferences() {
    518     return NumSirtReferences() + NumJniShadowFrameReferences();
    519   };
    520 
    521   // Is the given obj in this thread's stack indirect reference table?
    522   bool SirtContains(jobject obj) const;
    523 
    524   void SirtVisitRoots(RootVisitor* visitor, void* arg);
    525 
    526   void PushSirt(StackIndirectReferenceTable* sirt) {
    527     sirt->SetLink(top_sirt_);
    528     top_sirt_ = sirt;
    529   }
    530 
    531   StackIndirectReferenceTable* PopSirt() {
    532     StackIndirectReferenceTable* sirt = top_sirt_;
    533     DCHECK(sirt != NULL);
    534     top_sirt_ = top_sirt_->GetLink();
    535     return sirt;
    536   }
    537 
    538   static ThreadOffset TopSirtOffset() {
    539     return ThreadOffset(OFFSETOF_MEMBER(Thread, top_sirt_));
    540   }
    541 
    542   DebugInvokeReq* GetInvokeReq() {
    543     return debug_invoke_req_;
    544   }
    545 
    546   void SetDeoptimizationShadowFrame(ShadowFrame* sf);
    547   void SetDeoptimizationReturnValue(const JValue& ret_val);
    548 
    549   ShadowFrame* GetAndClearDeoptimizationShadowFrame(JValue* ret_val);
    550 
    551   std::deque<instrumentation::InstrumentationStackFrame>* GetInstrumentationStack() {
    552     return instrumentation_stack_;
    553   }
    554 
    555   std::vector<mirror::ArtMethod*>* GetStackTraceSample() const {
    556     return stack_trace_sample_;
    557   }
    558 
    559   void SetStackTraceSample(std::vector<mirror::ArtMethod*>* sample) {
    560     stack_trace_sample_ = sample;
    561   }
    562 
    563   uint64_t GetTraceClockBase() const {
    564     return trace_clock_base_;
    565   }
    566 
    567   void SetTraceClockBase(uint64_t clock_base) {
    568     trace_clock_base_ = clock_base;
    569   }
    570 
    571   BaseMutex* GetHeldMutex(LockLevel level) const {
    572     return held_mutexes_[level];
    573   }
    574 
    575   void SetHeldMutex(LockLevel level, BaseMutex* mutex) {
    576     held_mutexes_[level] = mutex;
    577   }
    578 
    579   void RunCheckpointFunction();
    580 
    581   bool ReadFlag(ThreadFlag flag) const {
    582     return (state_and_flags_.as_struct.flags & flag) != 0;
    583   }
    584 
    585   bool TestAllFlags() const {
    586     return (state_and_flags_.as_struct.flags != 0);
    587   }
    588 
    589   void AtomicSetFlag(ThreadFlag flag);
    590 
    591   void AtomicClearFlag(ThreadFlag flag);
    592 
    593  private:
    594   // We have no control over the size of 'bool', but want our boolean fields
    595   // to be 4-byte quantities.
    596   typedef uint32_t bool32_t;
    597 
    598   explicit Thread(bool daemon);
    599   ~Thread() LOCKS_EXCLUDED(Locks::mutator_lock_,
    600                            Locks::thread_suspend_count_lock_);
    601   void Destroy();
    602   friend class ThreadList;  // For ~Thread and Destroy.
    603 
    604   void CreatePeer(const char* name, bool as_daemon, jobject thread_group);
    605   friend class Runtime;  // For CreatePeer.
    606 
    607   // Avoid use, callers should use SetState. Used only by SignalCatcher::HandleSigQuit, ~Thread and
    608   // Dbg::Disconnected.
    609   ThreadState SetStateUnsafe(ThreadState new_state) {
    610     ThreadState old_state = GetState();
    611     state_and_flags_.as_struct.state = new_state;
    612     return old_state;
    613   }
    614   friend class SignalCatcher;  // For SetStateUnsafe.
    615   friend class Dbg;  // F or SetStateUnsafe.
    616 
    617   void VerifyStackImpl() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    618 
    619   void DumpState(std::ostream& os) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    620   void DumpStack(std::ostream& os) const
    621       LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_)
    622       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    623 
    624   // Out-of-line conveniences for debugging in gdb.
    625   static Thread* CurrentFromGdb();  // Like Thread::Current.
    626   // Like Thread::Dump(std::cerr).
    627   void DumpFromGdb() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    628 
    629   static void* CreateCallback(void* arg);
    630 
    631   void HandleUncaughtExceptions(ScopedObjectAccess& soa)
    632       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    633   void RemoveFromThreadGroup(ScopedObjectAccess& soa) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    634 
    635   void Init(ThreadList*, JavaVMExt*) EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_);
    636   void InitCardTable();
    637   void InitCpu();
    638   void InitTlsEntryPoints();
    639   void InitTid();
    640   void InitPthreadKeySelf();
    641   void InitStackHwm();
    642 
    643   void SetUpAlternateSignalStack();
    644   void TearDownAlternateSignalStack();
    645 
    646   void NotifyLocked(Thread* self) EXCLUSIVE_LOCKS_REQUIRED(wait_mutex_);
    647 
    648   static void ThreadExitCallback(void* arg);
    649 
    650   // Has Thread::Startup been called?
    651   static bool is_started_;
    652 
    653   // TLS key used to retrieve the Thread*.
    654   static pthread_key_t pthread_key_self_;
    655 
    656   // Used to notify threads that they should attempt to resume, they will suspend again if
    657   // their suspend count is > 0.
    658   static ConditionVariable* resume_cond_ GUARDED_BY(Locks::thread_suspend_count_lock_);
    659 
    660   // --- Frequently accessed fields first for short offsets ---
    661 
    662   // 32 bits of atomically changed state and flags. Keeping as 32 bits allows and atomic CAS to
    663   // change from being Suspended to Runnable without a suspend request occurring.
    664   union StateAndFlags {
    665     struct PACKED(4) {
    666       // Bitfield of flag values. Must be changed atomically so that flag values aren't lost. See
    667       // ThreadFlags for bit field meanings.
    668       volatile uint16_t flags;
    669       // Holds the ThreadState. May be changed non-atomically between Suspended (ie not Runnable)
    670       // transitions. Changing to Runnable requires that the suspend_request be part of the atomic
    671       // operation. If a thread is suspended and a suspend_request is present, a thread may not
    672       // change to Runnable as a GC or other operation is in progress.
    673       volatile uint16_t state;
    674     } as_struct;
    675     volatile int32_t as_int;
    676   };
    677   union StateAndFlags state_and_flags_;
    678   COMPILE_ASSERT(sizeof(union StateAndFlags) == sizeof(int32_t),
    679                  sizeof_state_and_flags_and_int32_are_different);
    680 
    681   // A non-zero value is used to tell the current thread to enter a safe point
    682   // at the next poll.
    683   int suspend_count_ GUARDED_BY(Locks::thread_suspend_count_lock_);
    684 
    685   // The biased card table, see CardTable for details
    686   byte* card_table_;
    687 
    688   // The pending exception or NULL.
    689   mirror::Throwable* exception_;
    690 
    691   // The end of this thread's stack. This is the lowest safely-addressable address on the stack.
    692   // We leave extra space so there's room for the code that throws StackOverflowError.
    693   byte* stack_end_;
    694 
    695   // The top of the managed stack often manipulated directly by compiler generated code.
    696   ManagedStack managed_stack_;
    697 
    698   // Every thread may have an associated JNI environment
    699   JNIEnvExt* jni_env_;
    700 
    701   // Initialized to "this". On certain architectures (such as x86) reading
    702   // off of Thread::Current is easy but getting the address of Thread::Current
    703   // is hard. This field can be read off of Thread::Current to give the address.
    704   Thread* self_;
    705 
    706   // Our managed peer (an instance of java.lang.Thread). The jobject version is used during thread
    707   // start up, until the thread is registered and the local opeer_ is used.
    708   mirror::Object* opeer_;
    709   jobject jpeer_;
    710 
    711   // The "lowest addressable byte" of the stack
    712   byte* stack_begin_;
    713 
    714   // Size of the stack
    715   size_t stack_size_;
    716 
    717   // Pointer to previous stack trace captured by sampling profiler.
    718   std::vector<mirror::ArtMethod*>* stack_trace_sample_;
    719 
    720   // The clock base used for tracing.
    721   uint64_t trace_clock_base_;
    722 
    723   // Thin lock thread id. This is a small integer used by the thin lock implementation.
    724   // This is not to be confused with the native thread's tid, nor is it the value returned
    725   // by java.lang.Thread.getId --- this is a distinct value, used only for locking. One
    726   // important difference between this id and the ids visible to managed code is that these
    727   // ones get reused (to ensure that they fit in the number of bits available).
    728   uint32_t thin_lock_id_;
    729 
    730   // System thread id.
    731   pid_t tid_;
    732 
    733   ThrowLocation throw_location_;
    734 
    735   // Guards the 'interrupted_' and 'wait_monitor_' members.
    736   mutable Mutex* wait_mutex_ DEFAULT_MUTEX_ACQUIRED_AFTER;
    737   ConditionVariable* wait_cond_ GUARDED_BY(wait_mutex_);
    738   // Pointer to the monitor lock we're currently waiting on (or NULL).
    739   Monitor* wait_monitor_ GUARDED_BY(wait_mutex_);
    740   // Thread "interrupted" status; stays raised until queried or thrown.
    741   bool32_t interrupted_ GUARDED_BY(wait_mutex_);
    742   // The next thread in the wait set this thread is part of.
    743   Thread* wait_next_;
    744   // If we're blocked in MonitorEnter, this is the object we're trying to lock.
    745   mirror::Object* monitor_enter_object_;
    746 
    747   friend class Monitor;
    748   friend class MonitorInfo;
    749 
    750   // Top of linked list of stack indirect reference tables or NULL for none
    751   StackIndirectReferenceTable* top_sirt_;
    752 
    753   Runtime* runtime_;
    754 
    755   RuntimeStats stats_;
    756 
    757   // Needed to get the right ClassLoader in JNI_OnLoad, but also
    758   // useful for testing.
    759   mirror::ClassLoader* class_loader_override_;
    760 
    761   // Thread local, lazily allocated, long jump context. Used to deliver exceptions.
    762   Context* long_jump_context_;
    763 
    764   // A boolean telling us whether we're recursively throwing OOME.
    765   bool32_t throwing_OutOfMemoryError_;
    766 
    767   // How much of 'suspend_count_' is by request of the debugger, used to set things right
    768   // when the debugger detaches. Must be <= suspend_count_.
    769   int debug_suspend_count_ GUARDED_BY(Locks::thread_suspend_count_lock_);
    770 
    771   // JDWP invoke-during-breakpoint support.
    772   DebugInvokeReq* debug_invoke_req_;
    773 
    774   // Shadow frame that is used temporarily during the deoptimization of a method.
    775   ShadowFrame* deoptimization_shadow_frame_;
    776   JValue deoptimization_return_value_;
    777 
    778   // Additional stack used by method instrumentation to store method and return pc values.
    779   // Stored as a pointer since std::deque is not PACKED.
    780   std::deque<instrumentation::InstrumentationStackFrame>* instrumentation_stack_;
    781 
    782   // A cached copy of the java.lang.Thread's name.
    783   std::string* name_;
    784 
    785   // Is the thread a daemon?
    786   const bool32_t daemon_;
    787 
    788   // A cached pthread_t for the pthread underlying this Thread*.
    789   pthread_t pthread_self_;
    790 
    791   // Support for Mutex lock hierarchy bug detection.
    792   BaseMutex* held_mutexes_[kLockLevelCount];
    793 
    794   // A positive value implies we're in a region where thread suspension isn't expected.
    795   uint32_t no_thread_suspension_;
    796 
    797   // Cause for last suspension.
    798   const char* last_no_thread_suspension_cause_;
    799 
    800   // Pending checkpoint functions.
    801   Closure* checkpoint_function_;
    802 
    803  public:
    804   // Entrypoint function pointers
    805   // TODO: move this near the top, since changing its offset requires all oats to be recompiled!
    806   InterpreterEntryPoints interpreter_entrypoints_;
    807   JniEntryPoints jni_entrypoints_;
    808   PortableEntryPoints portable_entrypoints_;
    809   QuickEntryPoints quick_entrypoints_;
    810 
    811  private:
    812   // How many times has our pthread key's destructor been called?
    813   uint32_t thread_exit_check_count_;
    814 
    815   friend class ScopedThreadStateChange;
    816 
    817   DISALLOW_COPY_AND_ASSIGN(Thread);
    818 };
    819 
    820 std::ostream& operator<<(std::ostream& os, const Thread& thread);
    821 std::ostream& operator<<(std::ostream& os, const ThreadState& state);
    822 
    823 }  // namespace art
    824 
    825 #endif  // ART_RUNTIME_THREAD_H_
    826