thread.cc revision 93ba893c20532990a430741e0a97212900094e8c
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#define ATRACE_TAG ATRACE_TAG_DALVIK
18
19#include "thread.h"
20
21#include <cutils/trace.h>
22#include <pthread.h>
23#include <signal.h>
24#include <sys/resource.h>
25#include <sys/time.h>
26
27#include <algorithm>
28#include <bitset>
29#include <cerrno>
30#include <iostream>
31#include <list>
32
33#include "base/mutex.h"
34#include "class_linker.h"
35#include "class_linker-inl.h"
36#include "cutils/atomic.h"
37#include "cutils/atomic-inline.h"
38#include "debugger.h"
39#include "dex_file-inl.h"
40#include "gc_map.h"
41#include "gc/accounting/card_table-inl.h"
42#include "gc/heap.h"
43#include "gc/space/space.h"
44#include "invoke_arg_array_builder.h"
45#include "jni_internal.h"
46#include "mirror/abstract_method-inl.h"
47#include "mirror/class-inl.h"
48#include "mirror/class_loader.h"
49#include "mirror/field-inl.h"
50#include "mirror/object_array-inl.h"
51#include "mirror/stack_trace_element.h"
52#include "monitor.h"
53#include "oat/runtime/context.h"
54#include "object_utils.h"
55#include "reflection.h"
56#include "runtime.h"
57#include "runtime_support.h"
58#include "scoped_thread_state_change.h"
59#include "ScopedLocalRef.h"
60#include "ScopedUtfChars.h"
61#include "sirt_ref.h"
62#include "stack.h"
63#include "stack_indirect_reference_table.h"
64#include "thread-inl.h"
65#include "thread_list.h"
66#include "utils.h"
67#include "verifier/dex_gc_map.h"
68#include "verifier/method_verifier.h"
69#include "well_known_classes.h"
70
71namespace art {
72
73bool Thread::is_started_ = false;
74pthread_key_t Thread::pthread_key_self_;
75ConditionVariable* Thread::resume_cond_ = NULL;
76
77static const char* kThreadNameDuringStartup = "<native thread without managed peer>";
78
79void Thread::InitCardTable() {
80  card_table_ = Runtime::Current()->GetHeap()->GetCardTable()->GetBiasedBegin();
81}
82
83#if !defined(__APPLE__)
84static void UnimplementedEntryPoint() {
85  UNIMPLEMENTED(FATAL);
86}
87#endif
88
89void Thread::InitFunctionPointers() {
90#if !defined(__APPLE__) // The Mac GCC is too old to accept this code.
91  // Insert a placeholder so we can easily tell if we call an unimplemented entry point.
92  uintptr_t* begin = reinterpret_cast<uintptr_t*>(&entrypoints_);
93  uintptr_t* end = reinterpret_cast<uintptr_t*>(reinterpret_cast<uint8_t*>(begin) + sizeof(entrypoints_));
94  for (uintptr_t* it = begin; it != end; ++it) {
95    *it = reinterpret_cast<uintptr_t>(UnimplementedEntryPoint);
96  }
97#endif
98  InitEntryPoints(&entrypoints_);
99}
100
101void Thread::SetDeoptimizationShadowFrame(ShadowFrame* sf) {
102  deoptimization_shadow_frame_ = sf;
103}
104
105void Thread::SetDeoptimizationReturnValue(const JValue& ret_val) {
106  deoptimization_return_value_.SetJ(ret_val.GetJ());
107}
108
109ShadowFrame* Thread::GetAndClearDeoptimizationShadowFrame(JValue* ret_val) {
110  ShadowFrame* sf = deoptimization_shadow_frame_;
111  deoptimization_shadow_frame_ = NULL;
112  ret_val->SetJ(deoptimization_return_value_.GetJ());
113  return sf;
114}
115
116void Thread::InitTid() {
117  tid_ = ::art::GetTid();
118}
119
120void Thread::InitAfterFork() {
121  // One thread (us) survived the fork, but we have a new tid so we need to
122  // update the value stashed in this Thread*.
123  InitTid();
124}
125
126void* Thread::CreateCallback(void* arg) {
127  Thread* self = reinterpret_cast<Thread*>(arg);
128  Runtime* runtime = Runtime::Current();
129  if (runtime == NULL) {
130    LOG(ERROR) << "Thread attaching to non-existent runtime: " << *self;
131    return NULL;
132  }
133  {
134    // TODO: pass self to MutexLock - requires self to equal Thread::Current(), which is only true
135    //       after self->Init().
136    MutexLock mu(NULL, *Locks::runtime_shutdown_lock_);
137    // Check that if we got here we cannot be shutting down (as shutdown should never have started
138    // while threads are being born).
139    CHECK(!runtime->IsShuttingDown());
140    self->Init(runtime->GetThreadList(), runtime->GetJavaVM());
141    Runtime::Current()->EndThreadBirth();
142  }
143  {
144    ScopedObjectAccess soa(self);
145
146    // Copy peer into self, deleting global reference when done.
147    CHECK(self->jpeer_ != NULL);
148    self->opeer_ = soa.Decode<mirror::Object*>(self->jpeer_);
149    self->GetJniEnv()->DeleteGlobalRef(self->jpeer_);
150    self->jpeer_ = NULL;
151
152    {
153      SirtRef<mirror::String> thread_name(self, self->GetThreadName(soa));
154      self->SetThreadName(thread_name->ToModifiedUtf8().c_str());
155    }
156    Dbg::PostThreadStart(self);
157
158    // Invoke the 'run' method of our java.lang.Thread.
159    mirror::Object* receiver = self->opeer_;
160    jmethodID mid = WellKnownClasses::java_lang_Thread_run;
161    mirror::AbstractMethod* m =
162        receiver->GetClass()->FindVirtualMethodForVirtualOrInterface(soa.DecodeMethod(mid));
163    JValue result;
164    ArgArray arg_array(NULL, 0);
165    arg_array.Append(reinterpret_cast<uint32_t>(receiver));
166    m->Invoke(self, arg_array.GetArray(), arg_array.GetNumBytes(), &result, 'V');
167  }
168  // Detach and delete self.
169  Runtime::Current()->GetThreadList()->Unregister(self);
170
171  return NULL;
172}
173
174Thread* Thread::FromManagedThread(const ScopedObjectAccessUnchecked& soa,
175                                  mirror::Object* thread_peer) {
176  mirror::Field* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_nativePeer);
177  Thread* result = reinterpret_cast<Thread*>(static_cast<uintptr_t>(f->GetInt(thread_peer)));
178  // Sanity check that if we have a result it is either suspended or we hold the thread_list_lock_
179  // to stop it from going away.
180  if (kIsDebugBuild) {
181    MutexLock mu(soa.Self(), *Locks::thread_suspend_count_lock_);
182    if (result != NULL && !result->IsSuspended()) {
183      Locks::thread_list_lock_->AssertHeld(soa.Self());
184    }
185  }
186  return result;
187}
188
189Thread* Thread::FromManagedThread(const ScopedObjectAccessUnchecked& soa, jobject java_thread) {
190  return FromManagedThread(soa, soa.Decode<mirror::Object*>(java_thread));
191}
192
193static size_t FixStackSize(size_t stack_size) {
194  // A stack size of zero means "use the default".
195  if (stack_size == 0) {
196    stack_size = Runtime::Current()->GetDefaultStackSize();
197  }
198
199  // Dalvik used the bionic pthread default stack size for native threads,
200  // so include that here to support apps that expect large native stacks.
201  stack_size += 1 * MB;
202
203  // It's not possible to request a stack smaller than the system-defined PTHREAD_STACK_MIN.
204  if (stack_size < PTHREAD_STACK_MIN) {
205    stack_size = PTHREAD_STACK_MIN;
206  }
207
208  // It's likely that callers are trying to ensure they have at least a certain amount of
209  // stack space, so we should add our reserved space on top of what they requested, rather
210  // than implicitly take it away from them.
211  stack_size += Thread::kStackOverflowReservedBytes;
212
213  // Some systems require the stack size to be a multiple of the system page size, so round up.
214  stack_size = RoundUp(stack_size, kPageSize);
215
216  return stack_size;
217}
218
219static void SigAltStack(stack_t* new_stack, stack_t* old_stack) {
220  if (sigaltstack(new_stack, old_stack) == -1) {
221    PLOG(FATAL) << "sigaltstack failed";
222  }
223}
224
225static void SetUpAlternateSignalStack() {
226  // Create and set an alternate signal stack.
227  stack_t ss;
228  ss.ss_sp = new uint8_t[SIGSTKSZ];
229  ss.ss_size = SIGSTKSZ;
230  ss.ss_flags = 0;
231  CHECK(ss.ss_sp != NULL);
232  SigAltStack(&ss, NULL);
233
234  // Double-check that it worked.
235  ss.ss_sp = NULL;
236  SigAltStack(NULL, &ss);
237  VLOG(threads) << "Alternate signal stack is " << PrettySize(ss.ss_size) << " at " << ss.ss_sp;
238}
239
240static void TearDownAlternateSignalStack() {
241  // Get the pointer so we can free the memory.
242  stack_t ss;
243  SigAltStack(NULL, &ss);
244  uint8_t* allocated_signal_stack = reinterpret_cast<uint8_t*>(ss.ss_sp);
245
246  // Tell the kernel to stop using it.
247  ss.ss_sp = NULL;
248  ss.ss_flags = SS_DISABLE;
249  ss.ss_size = SIGSTKSZ; // Avoid ENOMEM failure with Mac OS' buggy libc.
250  SigAltStack(&ss, NULL);
251
252  // Free it.
253  delete[] allocated_signal_stack;
254}
255
256void Thread::CreateNativeThread(JNIEnv* env, jobject java_peer, size_t stack_size, bool is_daemon) {
257  CHECK(java_peer != NULL);
258  Thread* self = static_cast<JNIEnvExt*>(env)->self;
259  Runtime* runtime = Runtime::Current();
260
261  // Atomically start the birth of the thread ensuring the runtime isn't shutting down.
262  bool thread_start_during_shutdown = false;
263  {
264    MutexLock mu(self, *Locks::runtime_shutdown_lock_);
265    if (runtime->IsShuttingDown()) {
266      thread_start_during_shutdown = true;
267    } else {
268      runtime->StartThreadBirth();
269    }
270  }
271  if (thread_start_during_shutdown) {
272    ScopedLocalRef<jclass> error_class(env, env->FindClass("java/lang/InternalError"));
273    env->ThrowNew(error_class.get(), "Thread starting during runtime shutdown");
274    return;
275  }
276
277  Thread* child_thread = new Thread(is_daemon);
278  // Use global JNI ref to hold peer live while child thread starts.
279  child_thread->jpeer_ = env->NewGlobalRef(java_peer);
280  stack_size = FixStackSize(stack_size);
281
282  // Thread.start is synchronized, so we know that nativePeer is 0, and know that we're not racing to
283  // assign it.
284  env->SetIntField(java_peer, WellKnownClasses::java_lang_Thread_nativePeer,
285                   reinterpret_cast<jint>(child_thread));
286
287  pthread_t new_pthread;
288  pthread_attr_t attr;
289  CHECK_PTHREAD_CALL(pthread_attr_init, (&attr), "new thread");
290  CHECK_PTHREAD_CALL(pthread_attr_setdetachstate, (&attr, PTHREAD_CREATE_DETACHED), "PTHREAD_CREATE_DETACHED");
291  CHECK_PTHREAD_CALL(pthread_attr_setstacksize, (&attr, stack_size), stack_size);
292  int pthread_create_result = pthread_create(&new_pthread, &attr, Thread::CreateCallback, child_thread);
293  CHECK_PTHREAD_CALL(pthread_attr_destroy, (&attr), "new thread");
294
295  if (pthread_create_result != 0) {
296    // pthread_create(3) failed, so clean up.
297    {
298      MutexLock mu(self, *Locks::runtime_shutdown_lock_);
299      runtime->EndThreadBirth();
300    }
301    // Manually delete the global reference since Thread::Init will not have been run.
302    env->DeleteGlobalRef(child_thread->jpeer_);
303    child_thread->jpeer_ = NULL;
304    delete child_thread;
305    child_thread = NULL;
306    // TODO: remove from thread group?
307    env->SetIntField(java_peer, WellKnownClasses::java_lang_Thread_nativePeer, 0);
308    {
309      std::string msg(StringPrintf("pthread_create (%s stack) failed: %s",
310                                   PrettySize(stack_size).c_str(), strerror(pthread_create_result)));
311      ScopedObjectAccess soa(env);
312      soa.Self()->ThrowOutOfMemoryError(msg.c_str());
313    }
314  }
315}
316
317void Thread::Init(ThreadList* thread_list, JavaVMExt* java_vm) {
318  // This function does all the initialization that must be run by the native thread it applies to.
319  // (When we create a new thread from managed code, we allocate the Thread* in Thread::Create so
320  // we can handshake with the corresponding native thread when it's ready.) Check this native
321  // thread hasn't been through here already...
322  CHECK(Thread::Current() == NULL);
323  SetUpAlternateSignalStack();
324  InitCpu();
325  InitFunctionPointers();
326  InitCardTable();
327  InitTid();
328  // Set pthread_self_ ahead of pthread_setspecific, that makes Thread::Current function, this
329  // avoids pthread_self_ ever being invalid when discovered from Thread::Current().
330  pthread_self_ = pthread_self();
331  CHECK(is_started_);
332  CHECK_PTHREAD_CALL(pthread_setspecific, (Thread::pthread_key_self_, this), "attach self");
333  DCHECK_EQ(Thread::Current(), this);
334
335  thin_lock_id_ = thread_list->AllocThreadId(this);
336  InitStackHwm();
337
338  jni_env_ = new JNIEnvExt(this, java_vm);
339  thread_list->Register(this);
340}
341
342Thread* Thread::Attach(const char* thread_name, bool as_daemon, jobject thread_group,
343                       bool create_peer) {
344  Thread* self;
345  Runtime* runtime = Runtime::Current();
346  if (runtime == NULL) {
347    LOG(ERROR) << "Thread attaching to non-existent runtime: " << thread_name;
348    return NULL;
349  }
350  {
351    MutexLock mu(NULL, *Locks::runtime_shutdown_lock_);
352    if (runtime->IsShuttingDown()) {
353      LOG(ERROR) << "Thread attaching while runtime is shutting down: " << thread_name;
354      return NULL;
355    } else {
356      Runtime::Current()->StartThreadBirth();
357      self = new Thread(as_daemon);
358      self->Init(runtime->GetThreadList(), runtime->GetJavaVM());
359      Runtime::Current()->EndThreadBirth();
360    }
361  }
362
363  CHECK_NE(self->GetState(), kRunnable);
364  self->SetState(kNative);
365
366  // If we're the main thread, ClassLinker won't be created until after we're attached,
367  // so that thread needs a two-stage attach. Regular threads don't need this hack.
368  // In the compiler, all threads need this hack, because no-one's going to be getting
369  // a native peer!
370  if (create_peer) {
371    self->CreatePeer(thread_name, as_daemon, thread_group);
372  } else {
373    // These aren't necessary, but they improve diagnostics for unit tests & command-line tools.
374    if (thread_name != NULL) {
375      self->name_->assign(thread_name);
376      ::art::SetThreadName(thread_name);
377    }
378  }
379
380  return self;
381}
382
383void Thread::CreatePeer(const char* name, bool as_daemon, jobject thread_group) {
384  Runtime* runtime = Runtime::Current();
385  CHECK(runtime->IsStarted());
386  JNIEnv* env = jni_env_;
387
388  if (thread_group == NULL) {
389    thread_group = runtime->GetMainThreadGroup();
390  }
391  ScopedLocalRef<jobject> thread_name(env, env->NewStringUTF(name));
392  jint thread_priority = GetNativePriority();
393  jboolean thread_is_daemon = as_daemon;
394
395  ScopedLocalRef<jobject> peer(env, env->AllocObject(WellKnownClasses::java_lang_Thread));
396  if (peer.get() == NULL) {
397    CHECK(IsExceptionPending());
398    return;
399  }
400  {
401    ScopedObjectAccess soa(this);
402    opeer_ = soa.Decode<mirror::Object*>(peer.get());
403  }
404  env->CallNonvirtualVoidMethod(peer.get(),
405                                WellKnownClasses::java_lang_Thread,
406                                WellKnownClasses::java_lang_Thread_init,
407                                thread_group, thread_name.get(), thread_priority, thread_is_daemon);
408  AssertNoPendingException();
409
410  Thread* self = this;
411  DCHECK_EQ(self, Thread::Current());
412  jni_env_->SetIntField(peer.get(), WellKnownClasses::java_lang_Thread_nativePeer,
413                        reinterpret_cast<jint>(self));
414
415  ScopedObjectAccess soa(self);
416  SirtRef<mirror::String> peer_thread_name(soa.Self(), GetThreadName(soa));
417  if (peer_thread_name.get() == NULL) {
418    // The Thread constructor should have set the Thread.name to a
419    // non-null value. However, because we can run without code
420    // available (in the compiler, in tests), we manually assign the
421    // fields the constructor should have set.
422    soa.DecodeField(WellKnownClasses::java_lang_Thread_daemon)->
423        SetBoolean(opeer_, thread_is_daemon);
424    soa.DecodeField(WellKnownClasses::java_lang_Thread_group)->
425        SetObject(opeer_, soa.Decode<mirror::Object*>(thread_group));
426    soa.DecodeField(WellKnownClasses::java_lang_Thread_name)->
427        SetObject(opeer_, soa.Decode<mirror::Object*>(thread_name.get()));
428    soa.DecodeField(WellKnownClasses::java_lang_Thread_priority)->
429        SetInt(opeer_, thread_priority);
430    peer_thread_name.reset(GetThreadName(soa));
431  }
432  // 'thread_name' may have been null, so don't trust 'peer_thread_name' to be non-null.
433  if (peer_thread_name.get() != NULL) {
434    SetThreadName(peer_thread_name->ToModifiedUtf8().c_str());
435  }
436}
437
438void Thread::SetThreadName(const char* name) {
439  name_->assign(name);
440  ::art::SetThreadName(name);
441  Dbg::DdmSendThreadNotification(this, CHUNK_TYPE("THNM"));
442}
443
444void Thread::InitStackHwm() {
445  void* stack_base;
446  size_t stack_size;
447  GetThreadStack(pthread_self_, stack_base, stack_size);
448
449  // TODO: include this in the thread dumps; potentially useful in SIGQUIT output?
450  VLOG(threads) << StringPrintf("Native stack is at %p (%s)", stack_base, PrettySize(stack_size).c_str());
451
452  stack_begin_ = reinterpret_cast<byte*>(stack_base);
453  stack_size_ = stack_size;
454
455  if (stack_size_ <= kStackOverflowReservedBytes) {
456    LOG(FATAL) << "Attempt to attach a thread with a too-small stack (" << stack_size_ << " bytes)";
457  }
458
459  // TODO: move this into the Linux GetThreadStack implementation.
460#if !defined(__APPLE__)
461  // If we're the main thread, check whether we were run with an unlimited stack. In that case,
462  // glibc will have reported a 2GB stack for our 32-bit process, and our stack overflow detection
463  // will be broken because we'll die long before we get close to 2GB.
464  bool is_main_thread = (::art::GetTid() == getpid());
465  if (is_main_thread) {
466    rlimit stack_limit;
467    if (getrlimit(RLIMIT_STACK, &stack_limit) == -1) {
468      PLOG(FATAL) << "getrlimit(RLIMIT_STACK) failed";
469    }
470    if (stack_limit.rlim_cur == RLIM_INFINITY) {
471      // Find the default stack size for new threads...
472      pthread_attr_t default_attributes;
473      size_t default_stack_size;
474      CHECK_PTHREAD_CALL(pthread_attr_init, (&default_attributes), "default stack size query");
475      CHECK_PTHREAD_CALL(pthread_attr_getstacksize, (&default_attributes, &default_stack_size),
476                         "default stack size query");
477      CHECK_PTHREAD_CALL(pthread_attr_destroy, (&default_attributes), "default stack size query");
478
479      // ...and use that as our limit.
480      size_t old_stack_size = stack_size_;
481      stack_size_ = default_stack_size;
482      stack_begin_ += (old_stack_size - stack_size_);
483      VLOG(threads) << "Limiting unlimited stack (reported as " << PrettySize(old_stack_size) << ")"
484                    << " to " << PrettySize(stack_size_)
485                    << " with base " << reinterpret_cast<void*>(stack_begin_);
486    }
487  }
488#endif
489
490  // Set stack_end_ to the bottom of the stack saving space of stack overflows
491  ResetDefaultStackEnd();
492
493  // Sanity check.
494  int stack_variable;
495  CHECK_GT(&stack_variable, reinterpret_cast<void*>(stack_end_));
496}
497
498void Thread::ShortDump(std::ostream& os) const {
499  os << "Thread[";
500  if (GetThinLockId() != 0) {
501    // If we're in kStarting, we won't have a thin lock id or tid yet.
502    os << GetThinLockId()
503             << ",tid=" << GetTid() << ',';
504  }
505  os << GetState()
506           << ",Thread*=" << this
507           << ",peer=" << opeer_
508           << ",\"" << *name_ << "\""
509           << "]";
510}
511
512void Thread::Dump(std::ostream& os) const {
513  DumpState(os);
514  DumpStack(os);
515}
516
517mirror::String* Thread::GetThreadName(const ScopedObjectAccessUnchecked& soa) const {
518  mirror::Field* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_name);
519  return (opeer_ != NULL) ? reinterpret_cast<mirror::String*>(f->GetObject(opeer_)) : NULL;
520}
521
522void Thread::GetThreadName(std::string& name) const {
523  name.assign(*name_);
524}
525
526void Thread::AtomicSetFlag(ThreadFlag flag) {
527  android_atomic_or(flag, &state_and_flags_.as_int);
528}
529
530void Thread::AtomicClearFlag(ThreadFlag flag) {
531  android_atomic_and(-1 ^ flag, &state_and_flags_.as_int);
532}
533
534// Attempt to rectify locks so that we dump thread list with required locks before exiting.
535static void UnsafeLogFatalForSuspendCount(Thread* self, Thread* thread) NO_THREAD_SAFETY_ANALYSIS {
536  LOG(ERROR) << *thread << " suspend count already zero.";
537  Locks::thread_suspend_count_lock_->Unlock(self);
538  if (!Locks::mutator_lock_->IsSharedHeld(self)) {
539    Locks::mutator_lock_->SharedTryLock(self);
540    if (!Locks::mutator_lock_->IsSharedHeld(self)) {
541      LOG(WARNING) << "Dumping thread list without holding mutator_lock_";
542    }
543  }
544  if (!Locks::thread_list_lock_->IsExclusiveHeld(self)) {
545    Locks::thread_list_lock_->TryLock(self);
546    if (!Locks::thread_list_lock_->IsExclusiveHeld(self)) {
547      LOG(WARNING) << "Dumping thread list without holding thread_list_lock_";
548    }
549  }
550  std::ostringstream ss;
551  Runtime::Current()->GetThreadList()->DumpLocked(ss);
552  LOG(FATAL) << ss.str();
553}
554
555void Thread::ModifySuspendCount(Thread* self, int delta, bool for_debugger) {
556  DCHECK(delta == -1 || delta == +1 || delta == -debug_suspend_count_)
557      << delta << " " << debug_suspend_count_ << " " << this;
558  DCHECK_GE(suspend_count_, debug_suspend_count_) << this;
559  Locks::thread_suspend_count_lock_->AssertHeld(self);
560  if (this != self && !IsSuspended()) {
561    Locks::thread_list_lock_->AssertHeld(self);
562  }
563  if (UNLIKELY(delta < 0 && suspend_count_ <= 0)) {
564    UnsafeLogFatalForSuspendCount(self, this);
565    return;
566  }
567
568  suspend_count_ += delta;
569  if (for_debugger) {
570    debug_suspend_count_ += delta;
571  }
572
573  if (suspend_count_ == 0) {
574    AtomicClearFlag(kSuspendRequest);
575  } else {
576    AtomicSetFlag(kSuspendRequest);
577  }
578}
579
580void Thread::RunCheckpointFunction() {
581  CHECK(checkpoint_function_ != NULL);
582  ATRACE_BEGIN("Checkpoint function");
583  checkpoint_function_->Run(this);
584  ATRACE_END();
585}
586
587bool Thread::RequestCheckpoint(Closure* function) {
588  CHECK(!ReadFlag(kCheckpointRequest)) << "Already have a pending checkpoint request";
589  checkpoint_function_ = function;
590  union StateAndFlags old_state_and_flags = state_and_flags_;
591  // We must be runnable to request a checkpoint.
592  old_state_and_flags.as_struct.state = kRunnable;
593  union StateAndFlags new_state_and_flags = old_state_and_flags;
594  new_state_and_flags.as_struct.flags |= kCheckpointRequest;
595  int succeeded = android_atomic_cmpxchg(old_state_and_flags.as_int, new_state_and_flags.as_int,
596                                         &state_and_flags_.as_int);
597  return succeeded == 0;
598}
599
600void Thread::FullSuspendCheck() {
601  VLOG(threads) << this << " self-suspending";
602  ATRACE_BEGIN("Full suspend check");
603  // Make thread appear suspended to other threads, release mutator_lock_.
604  TransitionFromRunnableToSuspended(kSuspended);
605  // Transition back to runnable noting requests to suspend, re-acquire share on mutator_lock_.
606  TransitionFromSuspendedToRunnable();
607  ATRACE_END();
608  VLOG(threads) << this << " self-reviving";
609}
610
611Thread* Thread::SuspendForDebugger(jobject peer, bool request_suspension, bool* timed_out) {
612  static const useconds_t kTimeoutUs = 30 * 1000000; // 30s.
613  useconds_t total_delay_us = 0;
614  useconds_t delay_us = 0;
615  bool did_suspend_request = false;
616  *timed_out = false;
617  while (true) {
618    Thread* thread;
619    {
620      ScopedObjectAccess soa(Thread::Current());
621      Thread* self = soa.Self();
622      MutexLock mu(self, *Locks::thread_list_lock_);
623      thread = Thread::FromManagedThread(soa, peer);
624      if (thread == NULL) {
625        JNIEnv* env = self->GetJniEnv();
626        ScopedLocalRef<jstring> scoped_name_string(env,
627                                                   (jstring)env->GetObjectField(peer,
628                                                              WellKnownClasses::java_lang_Thread_name));
629        ScopedUtfChars scoped_name_chars(env, scoped_name_string.get());
630        if (scoped_name_chars.c_str() == NULL) {
631            LOG(WARNING) << "No such thread for suspend: " << peer;
632            env->ExceptionClear();
633        } else {
634            LOG(WARNING) << "No such thread for suspend: " << peer << ":" << scoped_name_chars.c_str();
635        }
636
637        return NULL;
638      }
639      {
640        MutexLock mu(soa.Self(), *Locks::thread_suspend_count_lock_);
641        if (request_suspension) {
642          thread->ModifySuspendCount(soa.Self(), +1, true /* for_debugger */);
643          request_suspension = false;
644          did_suspend_request = true;
645        }
646        // IsSuspended on the current thread will fail as the current thread is changed into
647        // Runnable above. As the suspend count is now raised if this is the current thread
648        // it will self suspend on transition to Runnable, making it hard to work with. It's simpler
649        // to just explicitly handle the current thread in the callers to this code.
650        CHECK_NE(thread, soa.Self()) << "Attempt to suspend the current thread for the debugger";
651        // If thread is suspended (perhaps it was already not Runnable but didn't have a suspend
652        // count, or else we've waited and it has self suspended) or is the current thread, we're
653        // done.
654        if (thread->IsSuspended()) {
655          return thread;
656        }
657        if (total_delay_us >= kTimeoutUs) {
658          LOG(ERROR) << "Thread suspension timed out: " << peer;
659          if (did_suspend_request) {
660            thread->ModifySuspendCount(soa.Self(), -1, true /* for_debugger */);
661          }
662          *timed_out = true;
663          return NULL;
664        }
665      }
666      // Release locks and come out of runnable state.
667    }
668    for (int i = kLockLevelCount - 1; i >= 0; --i) {
669      BaseMutex* held_mutex = Thread::Current()->GetHeldMutex(static_cast<LockLevel>(i));
670      if (held_mutex != NULL) {
671        LOG(FATAL) << "Holding " << held_mutex->GetName()
672            << " while sleeping for thread suspension";
673      }
674    }
675    {
676      useconds_t new_delay_us = delay_us * 2;
677      CHECK_GE(new_delay_us, delay_us);
678      if (new_delay_us < 500000) {  // Don't allow sleeping to be more than 0.5s.
679        delay_us = new_delay_us;
680      }
681    }
682    if (delay_us == 0) {
683      sched_yield();
684      // Default to 1 milliseconds (note that this gets multiplied by 2 before the first sleep).
685      delay_us = 500;
686    } else {
687      usleep(delay_us);
688      total_delay_us += delay_us;
689    }
690  }
691}
692
693void Thread::DumpState(std::ostream& os, const Thread* thread, pid_t tid) {
694  std::string group_name;
695  int priority;
696  bool is_daemon = false;
697  Thread* self = Thread::Current();
698
699  if (self != NULL && thread != NULL && thread->opeer_ != NULL) {
700    ScopedObjectAccessUnchecked soa(self);
701    priority = soa.DecodeField(WellKnownClasses::java_lang_Thread_priority)->GetInt(thread->opeer_);
702    is_daemon = soa.DecodeField(WellKnownClasses::java_lang_Thread_daemon)->GetBoolean(thread->opeer_);
703
704    mirror::Object* thread_group =
705        soa.DecodeField(WellKnownClasses::java_lang_Thread_group)->GetObject(thread->opeer_);
706
707    if (thread_group != NULL) {
708      mirror::Field* group_name_field =
709          soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_name);
710      mirror::String* group_name_string =
711          reinterpret_cast<mirror::String*>(group_name_field->GetObject(thread_group));
712      group_name = (group_name_string != NULL) ? group_name_string->ToModifiedUtf8() : "<null>";
713    }
714  } else {
715    priority = GetNativePriority();
716  }
717
718  std::string scheduler_group_name(GetSchedulerGroupName(tid));
719  if (scheduler_group_name.empty()) {
720    scheduler_group_name = "default";
721  }
722
723  if (thread != NULL) {
724    os << '"' << *thread->name_ << '"';
725    if (is_daemon) {
726      os << " daemon";
727    }
728    os << " prio=" << priority
729       << " tid=" << thread->GetThinLockId()
730       << " " << thread->GetState();
731    if (thread->IsStillStarting()) {
732      os << " (still starting up)";
733    }
734    os << "\n";
735  } else {
736    os << '"' << ::art::GetThreadName(tid) << '"'
737       << " prio=" << priority
738       << " (not attached)\n";
739  }
740
741  if (thread != NULL) {
742    MutexLock mu(self, *Locks::thread_suspend_count_lock_);
743    os << "  | group=\"" << group_name << "\""
744       << " sCount=" << thread->suspend_count_
745       << " dsCount=" << thread->debug_suspend_count_
746       << " obj=" << reinterpret_cast<void*>(thread->opeer_)
747       << " self=" << reinterpret_cast<const void*>(thread) << "\n";
748  }
749
750  os << "  | sysTid=" << tid
751     << " nice=" << getpriority(PRIO_PROCESS, tid)
752     << " cgrp=" << scheduler_group_name;
753  if (thread != NULL) {
754    int policy;
755    sched_param sp;
756    CHECK_PTHREAD_CALL(pthread_getschedparam, (thread->pthread_self_, &policy, &sp), __FUNCTION__);
757    os << " sched=" << policy << "/" << sp.sched_priority
758       << " handle=" << reinterpret_cast<void*>(thread->pthread_self_);
759  }
760  os << "\n";
761
762  // Grab the scheduler stats for this thread.
763  std::string scheduler_stats;
764  if (ReadFileToString(StringPrintf("/proc/self/task/%d/schedstat", tid), &scheduler_stats)) {
765    scheduler_stats.resize(scheduler_stats.size() - 1); // Lose the trailing '\n'.
766  } else {
767    scheduler_stats = "0 0 0";
768  }
769
770  char native_thread_state = '?';
771  int utime = 0;
772  int stime = 0;
773  int task_cpu = 0;
774  GetTaskStats(tid, native_thread_state, utime, stime, task_cpu);
775
776  os << "  | state=" << native_thread_state
777     << " schedstat=( " << scheduler_stats << " )"
778     << " utm=" << utime
779     << " stm=" << stime
780     << " core=" << task_cpu
781     << " HZ=" << sysconf(_SC_CLK_TCK) << "\n";
782  if (thread != NULL) {
783    os << "  | stack=" << reinterpret_cast<void*>(thread->stack_begin_) << "-" << reinterpret_cast<void*>(thread->stack_end_)
784       << " stackSize=" << PrettySize(thread->stack_size_) << "\n";
785  }
786}
787
788void Thread::DumpState(std::ostream& os) const {
789  Thread::DumpState(os, this, GetTid());
790}
791
792struct StackDumpVisitor : public StackVisitor {
793  StackDumpVisitor(std::ostream& os, Thread* thread, Context* context, bool can_allocate)
794      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
795      : StackVisitor(thread, context), os(os), thread(thread), can_allocate(can_allocate),
796        last_method(NULL), last_line_number(0), repetition_count(0), frame_count(0) {
797  }
798
799  virtual ~StackDumpVisitor() {
800    if (frame_count == 0) {
801      os << "  (no managed stack frames)\n";
802    }
803  }
804
805  bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
806    mirror::AbstractMethod* m = GetMethod();
807    if (m->IsRuntimeMethod()) {
808      return true;
809    }
810    const int kMaxRepetition = 3;
811    mirror::Class* c = m->GetDeclaringClass();
812    const mirror::DexCache* dex_cache = c->GetDexCache();
813    int line_number = -1;
814    if (dex_cache != NULL) {  // be tolerant of bad input
815      const DexFile& dex_file = *dex_cache->GetDexFile();
816      line_number = dex_file.GetLineNumFromPC(m, GetDexPc());
817    }
818    if (line_number == last_line_number && last_method == m) {
819      repetition_count++;
820    } else {
821      if (repetition_count >= kMaxRepetition) {
822        os << "  ... repeated " << (repetition_count - kMaxRepetition) << " times\n";
823      }
824      repetition_count = 0;
825      last_line_number = line_number;
826      last_method = m;
827    }
828    if (repetition_count < kMaxRepetition) {
829      os << "  at " << PrettyMethod(m, false);
830      if (m->IsNative()) {
831        os << "(Native method)";
832      } else {
833        mh.ChangeMethod(m);
834        const char* source_file(mh.GetDeclaringClassSourceFile());
835        os << "(" << (source_file != NULL ? source_file : "unavailable")
836           << ":" << line_number << ")";
837      }
838      os << "\n";
839      if (frame_count == 0) {
840        Monitor::DescribeWait(os, thread);
841      }
842      if (can_allocate) {
843        Monitor::VisitLocks(this, DumpLockedObject, &os);
844      }
845    }
846
847    ++frame_count;
848    return true;
849  }
850
851  static void DumpLockedObject(mirror::Object* o, void* context)
852      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
853    std::ostream& os = *reinterpret_cast<std::ostream*>(context);
854    os << "  - locked <" << o << "> (a " << PrettyTypeOf(o) << ")\n";
855  }
856
857  std::ostream& os;
858  const Thread* thread;
859  const bool can_allocate;
860  MethodHelper mh;
861  mirror::AbstractMethod* last_method;
862  int last_line_number;
863  int repetition_count;
864  int frame_count;
865};
866
867static bool ShouldShowNativeStack(const Thread* thread)
868    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
869  ThreadState state = thread->GetState();
870
871  // In native code somewhere in the VM (one of the kWaitingFor* states)? That's interesting.
872  if (state > kWaiting && state < kStarting) {
873    return true;
874  }
875
876  // In an Object.wait variant or Thread.sleep? That's not interesting.
877  if (state == kTimedWaiting || state == kSleeping || state == kWaiting) {
878    return false;
879  }
880
881  // In some other native method? That's interesting.
882  // We don't just check kNative because native methods will be in state kSuspended if they're
883  // calling back into the VM, or kBlocked if they're blocked on a monitor, or one of the
884  // thread-startup states if it's early enough in their life cycle (http://b/7432159).
885  mirror::AbstractMethod* current_method = thread->GetCurrentMethod(NULL);
886  return current_method != NULL && current_method->IsNative();
887}
888
889void Thread::DumpStack(std::ostream& os) const {
890  // TODO: we call this code when dying but may not have suspended the thread ourself. The
891  //       IsSuspended check is therefore racy with the use for dumping (normally we inhibit
892  //       the race with the thread_suspend_count_lock_).
893  bool dump_for_abort = (gAborting > 0);
894  if (this == Thread::Current() || IsSuspended() || dump_for_abort) {
895    // If we're currently in native code, dump that stack before dumping the managed stack.
896    if (dump_for_abort || ShouldShowNativeStack(this)) {
897      DumpKernelStack(os, GetTid(), "  kernel: ", false);
898      DumpNativeStack(os, GetTid(), "  native: ", false);
899    }
900    UniquePtr<Context> context(Context::Create());
901    StackDumpVisitor dumper(os, const_cast<Thread*>(this), context.get(), !throwing_OutOfMemoryError_);
902    dumper.WalkStack();
903  } else {
904    os << "Not able to dump stack of thread that isn't suspended";
905  }
906}
907
908void Thread::ThreadExitCallback(void* arg) {
909  Thread* self = reinterpret_cast<Thread*>(arg);
910  if (self->thread_exit_check_count_ == 0) {
911    LOG(WARNING) << "Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): " << *self;
912    CHECK(is_started_);
913    CHECK_PTHREAD_CALL(pthread_setspecific, (Thread::pthread_key_self_, self), "reattach self");
914    self->thread_exit_check_count_ = 1;
915  } else {
916    LOG(FATAL) << "Native thread exited without calling DetachCurrentThread: " << *self;
917  }
918}
919
920void Thread::Startup() {
921  CHECK(!is_started_);
922  is_started_ = true;
923  {
924    // MutexLock to keep annotalysis happy.
925    //
926    // Note we use NULL for the thread because Thread::Current can
927    // return garbage since (is_started_ == true) and
928    // Thread::pthread_key_self_ is not yet initialized.
929    // This was seen on glibc.
930    MutexLock mu(NULL, *Locks::thread_suspend_count_lock_);
931    resume_cond_ = new ConditionVariable("Thread resumption condition variable",
932                                         *Locks::thread_suspend_count_lock_);
933  }
934
935  // Allocate a TLS slot.
936  CHECK_PTHREAD_CALL(pthread_key_create, (&Thread::pthread_key_self_, Thread::ThreadExitCallback), "self key");
937
938  // Double-check the TLS slot allocation.
939  if (pthread_getspecific(pthread_key_self_) != NULL) {
940    LOG(FATAL) << "Newly-created pthread TLS slot is not NULL";
941  }
942}
943
944void Thread::FinishStartup() {
945  Runtime* runtime = Runtime::Current();
946  CHECK(runtime->IsStarted());
947
948  // Finish attaching the main thread.
949  ScopedObjectAccess soa(Thread::Current());
950  Thread::Current()->CreatePeer("main", false, runtime->GetMainThreadGroup());
951
952  Runtime::Current()->GetClassLinker()->RunRootClinits();
953}
954
955void Thread::Shutdown() {
956  CHECK(is_started_);
957  is_started_ = false;
958  CHECK_PTHREAD_CALL(pthread_key_delete, (Thread::pthread_key_self_), "self key");
959  MutexLock mu(Thread::Current(), *Locks::thread_suspend_count_lock_);
960  if (resume_cond_ != NULL) {
961    delete resume_cond_;
962    resume_cond_ = NULL;
963  }
964}
965
966Thread::Thread(bool daemon)
967    : suspend_count_(0),
968      card_table_(NULL),
969      exception_(NULL),
970      stack_end_(NULL),
971      managed_stack_(),
972      jni_env_(NULL),
973      self_(NULL),
974      opeer_(NULL),
975      jpeer_(NULL),
976      stack_begin_(NULL),
977      stack_size_(0),
978      thin_lock_id_(0),
979      tid_(0),
980      wait_mutex_(new Mutex("a thread wait mutex")),
981      wait_cond_(new ConditionVariable("a thread wait condition variable", *wait_mutex_)),
982      wait_monitor_(NULL),
983      interrupted_(false),
984      wait_next_(NULL),
985      monitor_enter_object_(NULL),
986      top_sirt_(NULL),
987      runtime_(NULL),
988      class_loader_override_(NULL),
989      long_jump_context_(NULL),
990      throwing_OutOfMemoryError_(false),
991      debug_suspend_count_(0),
992      debug_invoke_req_(new DebugInvokeReq),
993      deoptimization_shadow_frame_(NULL),
994      instrumentation_stack_(new std::deque<instrumentation::InstrumentationStackFrame>),
995      name_(new std::string(kThreadNameDuringStartup)),
996      daemon_(daemon),
997      pthread_self_(0),
998      no_thread_suspension_(0),
999      last_no_thread_suspension_cause_(NULL),
1000      checkpoint_function_(0),
1001      thread_exit_check_count_(0) {
1002  CHECK_EQ((sizeof(Thread) % 4), 0U) << sizeof(Thread);
1003  state_and_flags_.as_struct.flags = 0;
1004  state_and_flags_.as_struct.state = kNative;
1005  memset(&held_mutexes_[0], 0, sizeof(held_mutexes_));
1006}
1007
1008bool Thread::IsStillStarting() const {
1009  // You might think you can check whether the state is kStarting, but for much of thread startup,
1010  // the thread is in kNative; it might also be in kVmWait.
1011  // You might think you can check whether the peer is NULL, but the peer is actually created and
1012  // assigned fairly early on, and needs to be.
1013  // It turns out that the last thing to change is the thread name; that's a good proxy for "has
1014  // this thread _ever_ entered kRunnable".
1015  return (jpeer_ == NULL && opeer_ == NULL) || (*name_ == kThreadNameDuringStartup);
1016}
1017
1018void Thread::AssertNoPendingException() const {
1019  if (UNLIKELY(IsExceptionPending())) {
1020    ScopedObjectAccess soa(Thread::Current());
1021    mirror::Throwable* exception = GetException(NULL);
1022    LOG(FATAL) << "No pending exception expected: " << exception->Dump();
1023  }
1024}
1025
1026static void MonitorExitVisitor(const mirror::Object* object, void* arg) NO_THREAD_SAFETY_ANALYSIS {
1027  Thread* self = reinterpret_cast<Thread*>(arg);
1028  mirror::Object* entered_monitor = const_cast<mirror::Object*>(object);
1029  if (self->HoldsLock(entered_monitor)) {
1030    LOG(WARNING) << "Calling MonitorExit on object "
1031                 << object << " (" << PrettyTypeOf(object) << ")"
1032                 << " left locked by native thread "
1033                 << *Thread::Current() << " which is detaching";
1034    entered_monitor->MonitorExit(self);
1035  }
1036}
1037
1038void Thread::Destroy() {
1039  Thread* self = this;
1040  DCHECK_EQ(self, Thread::Current());
1041
1042  if (opeer_ != NULL) {
1043    ScopedObjectAccess soa(self);
1044    // We may need to call user-supplied managed code, do this before final clean-up.
1045    HandleUncaughtExceptions(soa);
1046    RemoveFromThreadGroup(soa);
1047
1048    // this.nativePeer = 0;
1049    soa.DecodeField(WellKnownClasses::java_lang_Thread_nativePeer)->SetInt(opeer_, 0);
1050    Dbg::PostThreadDeath(self);
1051
1052    // Thread.join() is implemented as an Object.wait() on the Thread.lock object. Signal anyone
1053    // who is waiting.
1054    mirror::Object* lock =
1055        soa.DecodeField(WellKnownClasses::java_lang_Thread_lock)->GetObject(opeer_);
1056    // (This conditional is only needed for tests, where Thread.lock won't have been set.)
1057    if (lock != NULL) {
1058      ObjectLock locker(self, lock);
1059      locker.Notify();
1060    }
1061  }
1062
1063  // On thread detach, all monitors entered with JNI MonitorEnter are automatically exited.
1064  if (jni_env_ != NULL) {
1065    jni_env_->monitors.VisitRoots(MonitorExitVisitor, self);
1066  }
1067}
1068
1069Thread::~Thread() {
1070  if (jni_env_ != NULL && jpeer_ != NULL) {
1071    // If pthread_create fails we don't have a jni env here.
1072    jni_env_->DeleteGlobalRef(jpeer_);
1073    jpeer_ = NULL;
1074  }
1075  opeer_ = NULL;
1076
1077  delete jni_env_;
1078  jni_env_ = NULL;
1079
1080  CHECK_NE(GetState(), kRunnable);
1081  // We may be deleting a still born thread.
1082  SetStateUnsafe(kTerminated);
1083
1084  delete wait_cond_;
1085  delete wait_mutex_;
1086
1087  if (long_jump_context_ != NULL) {
1088    delete long_jump_context_;
1089  }
1090
1091  delete debug_invoke_req_;
1092  delete instrumentation_stack_;
1093  delete name_;
1094
1095  TearDownAlternateSignalStack();
1096}
1097
1098void Thread::HandleUncaughtExceptions(ScopedObjectAccess& soa) {
1099  if (!IsExceptionPending()) {
1100    return;
1101  }
1102  ScopedLocalRef<jobject> peer(jni_env_, soa.AddLocalReference<jobject>(opeer_));
1103  ScopedThreadStateChange tsc(this, kNative);
1104
1105  // Get and clear the exception.
1106  ScopedLocalRef<jthrowable> exception(jni_env_, jni_env_->ExceptionOccurred());
1107  jni_env_->ExceptionClear();
1108
1109  // If the thread has its own handler, use that.
1110  ScopedLocalRef<jobject> handler(jni_env_,
1111                                  jni_env_->GetObjectField(peer.get(),
1112                                                           WellKnownClasses::java_lang_Thread_uncaughtHandler));
1113  if (handler.get() == NULL) {
1114    // Otherwise use the thread group's default handler.
1115    handler.reset(jni_env_->GetObjectField(peer.get(), WellKnownClasses::java_lang_Thread_group));
1116  }
1117
1118  // Call the handler.
1119  jni_env_->CallVoidMethod(handler.get(),
1120                           WellKnownClasses::java_lang_Thread$UncaughtExceptionHandler_uncaughtException,
1121                           peer.get(), exception.get());
1122
1123  // If the handler threw, clear that exception too.
1124  jni_env_->ExceptionClear();
1125}
1126
1127void Thread::RemoveFromThreadGroup(ScopedObjectAccess& soa) {
1128  // this.group.removeThread(this);
1129  // group can be null if we're in the compiler or a test.
1130  mirror::Object* ogroup = soa.DecodeField(WellKnownClasses::java_lang_Thread_group)->GetObject(opeer_);
1131  if (ogroup != NULL) {
1132    ScopedLocalRef<jobject> group(soa.Env(), soa.AddLocalReference<jobject>(ogroup));
1133    ScopedLocalRef<jobject> peer(soa.Env(), soa.AddLocalReference<jobject>(opeer_));
1134    ScopedThreadStateChange tsc(soa.Self(), kNative);
1135    jni_env_->CallVoidMethod(group.get(), WellKnownClasses::java_lang_ThreadGroup_removeThread,
1136                             peer.get());
1137  }
1138}
1139
1140size_t Thread::NumSirtReferences() {
1141  size_t count = 0;
1142  for (StackIndirectReferenceTable* cur = top_sirt_; cur; cur = cur->GetLink()) {
1143    count += cur->NumberOfReferences();
1144  }
1145  return count;
1146}
1147
1148bool Thread::SirtContains(jobject obj) const {
1149  mirror::Object** sirt_entry = reinterpret_cast<mirror::Object**>(obj);
1150  for (StackIndirectReferenceTable* cur = top_sirt_; cur; cur = cur->GetLink()) {
1151    if (cur->Contains(sirt_entry)) {
1152      return true;
1153    }
1154  }
1155  // JNI code invoked from portable code uses shadow frames rather than the SIRT.
1156  return managed_stack_.ShadowFramesContain(sirt_entry);
1157}
1158
1159void Thread::SirtVisitRoots(RootVisitor* visitor, void* arg) {
1160  for (StackIndirectReferenceTable* cur = top_sirt_; cur; cur = cur->GetLink()) {
1161    size_t num_refs = cur->NumberOfReferences();
1162    for (size_t j = 0; j < num_refs; j++) {
1163      mirror::Object* object = cur->GetReference(j);
1164      if (object != NULL) {
1165        visitor(object, arg);
1166      }
1167    }
1168  }
1169}
1170
1171mirror::Object* Thread::DecodeJObject(jobject obj) const {
1172  Locks::mutator_lock_->AssertSharedHeld(this);
1173  if (obj == NULL) {
1174    return NULL;
1175  }
1176  IndirectRef ref = reinterpret_cast<IndirectRef>(obj);
1177  IndirectRefKind kind = GetIndirectRefKind(ref);
1178  mirror::Object* result;
1179  // The "kinds" below are sorted by the frequency we expect to encounter them.
1180  if (kind == kLocal) {
1181    IndirectReferenceTable& locals = jni_env_->locals;
1182    result = const_cast<mirror::Object*>(locals.Get(ref));
1183  } else if (kind == kSirtOrInvalid) {
1184    // TODO: make stack indirect reference table lookup more efficient
1185    // Check if this is a local reference in the SIRT
1186    if (LIKELY(SirtContains(obj))) {
1187      result = *reinterpret_cast<mirror::Object**>(obj);  // Read from SIRT
1188    } else if (Runtime::Current()->GetJavaVM()->work_around_app_jni_bugs) {
1189      // Assume an invalid local reference is actually a direct pointer.
1190      result = reinterpret_cast<mirror::Object*>(obj);
1191    } else {
1192      result = kInvalidIndirectRefObject;
1193    }
1194  } else if (kind == kGlobal) {
1195    JavaVMExt* vm = Runtime::Current()->GetJavaVM();
1196    IndirectReferenceTable& globals = vm->globals;
1197    MutexLock mu(const_cast<Thread*>(this), vm->globals_lock);
1198    result = const_cast<mirror::Object*>(globals.Get(ref));
1199  } else {
1200    DCHECK_EQ(kind, kWeakGlobal);
1201    JavaVMExt* vm = Runtime::Current()->GetJavaVM();
1202    IndirectReferenceTable& weak_globals = vm->weak_globals;
1203    MutexLock mu(const_cast<Thread*>(this), vm->weak_globals_lock);
1204    result = const_cast<mirror::Object*>(weak_globals.Get(ref));
1205    if (result == kClearedJniWeakGlobal) {
1206      // This is a special case where it's okay to return NULL.
1207      return NULL;
1208    }
1209  }
1210
1211  if (UNLIKELY(result == NULL)) {
1212    JniAbortF(NULL, "use of deleted %s %p", ToStr<IndirectRefKind>(kind).c_str(), obj);
1213  } else {
1214    if (kIsDebugBuild && (result != kInvalidIndirectRefObject)) {
1215      Runtime::Current()->GetHeap()->VerifyObject(result);
1216    }
1217  }
1218  return result;
1219}
1220
1221// Implements java.lang.Thread.interrupted.
1222bool Thread::Interrupted() {
1223  MutexLock mu(Thread::Current(), *wait_mutex_);
1224  bool interrupted = interrupted_;
1225  interrupted_ = false;
1226  return interrupted;
1227}
1228
1229// Implements java.lang.Thread.isInterrupted.
1230bool Thread::IsInterrupted() {
1231  MutexLock mu(Thread::Current(), *wait_mutex_);
1232  return interrupted_;
1233}
1234
1235void Thread::Interrupt() {
1236  Thread* self = Thread::Current();
1237  MutexLock mu(self, *wait_mutex_);
1238  if (interrupted_) {
1239    return;
1240  }
1241  interrupted_ = true;
1242  NotifyLocked(self);
1243}
1244
1245void Thread::Notify() {
1246  Thread* self = Thread::Current();
1247  MutexLock mu(self, *wait_mutex_);
1248  NotifyLocked(self);
1249}
1250
1251void Thread::NotifyLocked(Thread* self) {
1252  if (wait_monitor_ != NULL) {
1253    wait_cond_->Signal(self);
1254  }
1255}
1256
1257class CountStackDepthVisitor : public StackVisitor {
1258 public:
1259  explicit CountStackDepthVisitor(Thread* thread)
1260      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
1261      : StackVisitor(thread, NULL),
1262        depth_(0), skip_depth_(0), skipping_(true) {}
1263
1264  bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1265    // We want to skip frames up to and including the exception's constructor.
1266    // Note we also skip the frame if it doesn't have a method (namely the callee
1267    // save frame)
1268    mirror::AbstractMethod* m = GetMethod();
1269    if (skipping_ && !m->IsRuntimeMethod() &&
1270        !mirror::Throwable::GetJavaLangThrowable()->IsAssignableFrom(m->GetDeclaringClass())) {
1271      skipping_ = false;
1272    }
1273    if (!skipping_) {
1274      if (!m->IsRuntimeMethod()) {  // Ignore runtime frames (in particular callee save).
1275        ++depth_;
1276      }
1277    } else {
1278      ++skip_depth_;
1279    }
1280    return true;
1281  }
1282
1283  int GetDepth() const {
1284    return depth_;
1285  }
1286
1287  int GetSkipDepth() const {
1288    return skip_depth_;
1289  }
1290
1291 private:
1292  uint32_t depth_;
1293  uint32_t skip_depth_;
1294  bool skipping_;
1295};
1296
1297class BuildInternalStackTraceVisitor : public StackVisitor {
1298 public:
1299  explicit BuildInternalStackTraceVisitor(Thread* self, Thread* thread, int skip_depth)
1300      : StackVisitor(thread, NULL), self_(self),
1301        skip_depth_(skip_depth), count_(0), dex_pc_trace_(NULL), method_trace_(NULL) {}
1302
1303  bool Init(int depth)
1304      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1305    // Allocate method trace with an extra slot that will hold the PC trace
1306    SirtRef<mirror::ObjectArray<mirror::Object> >
1307        method_trace(self_,
1308                     Runtime::Current()->GetClassLinker()->AllocObjectArray<mirror::Object>(self_,
1309                                                                                            depth + 1));
1310    if (method_trace.get() == NULL) {
1311      return false;
1312    }
1313    mirror::IntArray* dex_pc_trace = mirror::IntArray::Alloc(self_, depth);
1314    if (dex_pc_trace == NULL) {
1315      return false;
1316    }
1317    // Save PC trace in last element of method trace, also places it into the
1318    // object graph.
1319    method_trace->Set(depth, dex_pc_trace);
1320    // Set the Object*s and assert that no thread suspension is now possible.
1321    const char* last_no_suspend_cause =
1322        self_->StartAssertNoThreadSuspension("Building internal stack trace");
1323    CHECK(last_no_suspend_cause == NULL) << last_no_suspend_cause;
1324    method_trace_ = method_trace.get();
1325    dex_pc_trace_ = dex_pc_trace;
1326    return true;
1327  }
1328
1329  virtual ~BuildInternalStackTraceVisitor() {
1330    if (method_trace_ != NULL) {
1331      self_->EndAssertNoThreadSuspension(NULL);
1332    }
1333  }
1334
1335  bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1336    if (method_trace_ == NULL || dex_pc_trace_ == NULL) {
1337      return true; // We're probably trying to fillInStackTrace for an OutOfMemoryError.
1338    }
1339    if (skip_depth_ > 0) {
1340      skip_depth_--;
1341      return true;
1342    }
1343    mirror::AbstractMethod* m = GetMethod();
1344    if (m->IsRuntimeMethod()) {
1345      return true;  // Ignore runtime frames (in particular callee save).
1346    }
1347    method_trace_->Set(count_, m);
1348    dex_pc_trace_->Set(count_, GetDexPc());
1349    ++count_;
1350    return true;
1351  }
1352
1353  mirror::ObjectArray<mirror::Object>* GetInternalStackTrace() const {
1354    return method_trace_;
1355  }
1356
1357 private:
1358  Thread* const self_;
1359  // How many more frames to skip.
1360  int32_t skip_depth_;
1361  // Current position down stack trace.
1362  uint32_t count_;
1363  // Array of dex PC values.
1364  mirror::IntArray* dex_pc_trace_;
1365  // An array of the methods on the stack, the last entry is a reference to the PC trace.
1366  mirror::ObjectArray<mirror::Object>* method_trace_;
1367};
1368
1369jobject Thread::CreateInternalStackTrace(const ScopedObjectAccessUnchecked& soa) const {
1370  // Compute depth of stack
1371  CountStackDepthVisitor count_visitor(const_cast<Thread*>(this));
1372  count_visitor.WalkStack();
1373  int32_t depth = count_visitor.GetDepth();
1374  int32_t skip_depth = count_visitor.GetSkipDepth();
1375
1376  // Build internal stack trace.
1377  BuildInternalStackTraceVisitor build_trace_visitor(soa.Self(), const_cast<Thread*>(this),
1378                                                     skip_depth);
1379  if (!build_trace_visitor.Init(depth)) {
1380    return NULL;  // Allocation failed.
1381  }
1382  build_trace_visitor.WalkStack();
1383  mirror::ObjectArray<mirror::Object>* trace = build_trace_visitor.GetInternalStackTrace();
1384  if (kIsDebugBuild) {
1385    for (int32_t i = 0; i < trace->GetLength(); ++i) {
1386      CHECK(trace->Get(i) != NULL);
1387    }
1388  }
1389  return soa.AddLocalReference<jobjectArray>(trace);
1390}
1391
1392jobjectArray Thread::InternalStackTraceToStackTraceElementArray(JNIEnv* env, jobject internal,
1393    jobjectArray output_array, int* stack_depth) {
1394  // Transition into runnable state to work on Object*/Array*
1395  ScopedObjectAccess soa(env);
1396  // Decode the internal stack trace into the depth, method trace and PC trace
1397  mirror::ObjectArray<mirror::Object>* method_trace =
1398      soa.Decode<mirror::ObjectArray<mirror::Object>*>(internal);
1399  int32_t depth = method_trace->GetLength() - 1;
1400  mirror::IntArray* pc_trace = down_cast<mirror::IntArray*>(method_trace->Get(depth));
1401
1402  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1403
1404  jobjectArray result;
1405  mirror::ObjectArray<mirror::StackTraceElement>* java_traces;
1406  if (output_array != NULL) {
1407    // Reuse the array we were given.
1408    result = output_array;
1409    java_traces = soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(output_array);
1410    // ...adjusting the number of frames we'll write to not exceed the array length.
1411    depth = std::min(depth, java_traces->GetLength());
1412  } else {
1413    // Create java_trace array and place in local reference table
1414    java_traces = class_linker->AllocStackTraceElementArray(soa.Self(), depth);
1415    if (java_traces == NULL) {
1416      return NULL;
1417    }
1418    result = soa.AddLocalReference<jobjectArray>(java_traces);
1419  }
1420
1421  if (stack_depth != NULL) {
1422    *stack_depth = depth;
1423  }
1424
1425  MethodHelper mh;
1426  for (int32_t i = 0; i < depth; ++i) {
1427    // Prepare parameters for StackTraceElement(String cls, String method, String file, int line)
1428    mirror::AbstractMethod* method = down_cast<mirror::AbstractMethod*>(method_trace->Get(i));
1429    mh.ChangeMethod(method);
1430    uint32_t dex_pc = pc_trace->Get(i);
1431    int32_t line_number = mh.GetLineNumFromDexPC(dex_pc);
1432    // Allocate element, potentially triggering GC
1433    // TODO: reuse class_name_object via Class::name_?
1434    const char* descriptor = mh.GetDeclaringClassDescriptor();
1435    CHECK(descriptor != NULL);
1436    std::string class_name(PrettyDescriptor(descriptor));
1437    SirtRef<mirror::String> class_name_object(soa.Self(),
1438                                              mirror::String::AllocFromModifiedUtf8(soa.Self(),
1439                                                                                    class_name.c_str()));
1440    if (class_name_object.get() == NULL) {
1441      return NULL;
1442    }
1443    const char* method_name = mh.GetName();
1444    CHECK(method_name != NULL);
1445    SirtRef<mirror::String> method_name_object(soa.Self(),
1446                                               mirror::String::AllocFromModifiedUtf8(soa.Self(),
1447                                                                                     method_name));
1448    if (method_name_object.get() == NULL) {
1449      return NULL;
1450    }
1451    const char* source_file = mh.GetDeclaringClassSourceFile();
1452    SirtRef<mirror::String> source_name_object(soa.Self(), mirror::String::AllocFromModifiedUtf8(soa.Self(),
1453                                                                                                 source_file));
1454    mirror::StackTraceElement* obj = mirror::StackTraceElement::Alloc(soa.Self(),
1455                                                                      class_name_object.get(),
1456                                                                      method_name_object.get(),
1457                                                                      source_name_object.get(),
1458                                                                      line_number);
1459    if (obj == NULL) {
1460      return NULL;
1461    }
1462#ifdef MOVING_GARBAGE_COLLECTOR
1463    // Re-read after potential GC
1464    java_traces = Decode<ObjectArray<Object>*>(soa.Env(), result);
1465    method_trace = down_cast<ObjectArray<Object>*>(Decode<Object*>(soa.Env(), internal));
1466    pc_trace = down_cast<IntArray*>(method_trace->Get(depth));
1467#endif
1468    java_traces->Set(i, obj);
1469  }
1470  return result;
1471}
1472
1473void Thread::ThrowNewExceptionF(const ThrowLocation& throw_location,
1474                                const char* exception_class_descriptor, const char* fmt, ...) {
1475  va_list args;
1476  va_start(args, fmt);
1477  ThrowNewExceptionV(throw_location, exception_class_descriptor,
1478                     fmt, args);
1479  va_end(args);
1480}
1481
1482void Thread::ThrowNewExceptionV(const ThrowLocation& throw_location,
1483                                const char* exception_class_descriptor,
1484                                const char* fmt, va_list ap) {
1485  std::string msg;
1486  StringAppendV(&msg, fmt, ap);
1487  ThrowNewException(throw_location, exception_class_descriptor, msg.c_str());
1488}
1489
1490void Thread::ThrowNewException(const ThrowLocation& throw_location, const char* exception_class_descriptor,
1491                               const char* msg) {
1492  AssertNoPendingException(); // Callers should either clear or call ThrowNewWrappedException.
1493  ThrowNewWrappedException(throw_location, exception_class_descriptor, msg);
1494}
1495
1496void Thread::ThrowNewWrappedException(const ThrowLocation& throw_location,
1497                                      const char* exception_class_descriptor,
1498                                      const char* msg) {
1499  DCHECK_EQ(this, Thread::Current());
1500  // Ensure we don't forget arguments over object allocation.
1501  SirtRef<mirror::Object> saved_throw_this(this, throw_location.GetThis());
1502  SirtRef<mirror::AbstractMethod> saved_throw_method(this, throw_location.GetMethod());
1503  // Ignore the cause throw location. TODO: should we report this as a re-throw?
1504  SirtRef<mirror::Throwable> cause(this, GetException(NULL));
1505  ClearException();
1506  Runtime* runtime = Runtime::Current();
1507
1508  mirror::ClassLoader* cl = NULL;
1509  if (throw_location.GetMethod() != NULL) {
1510    cl = throw_location.GetMethod()->GetDeclaringClass()->GetClassLoader();
1511  }
1512  SirtRef<mirror::Class>
1513      exception_class(this, runtime->GetClassLinker()->FindClass(exception_class_descriptor, cl));
1514  if (UNLIKELY(exception_class.get() == NULL)) {
1515    CHECK(IsExceptionPending());
1516    LOG(ERROR) << "No exception class " << PrettyDescriptor(exception_class_descriptor);
1517    return;
1518  }
1519
1520  if (UNLIKELY(!runtime->GetClassLinker()->EnsureInitialized(exception_class.get(), true, true))) {
1521    DCHECK(IsExceptionPending());
1522    return;
1523  }
1524  DCHECK(!runtime->IsStarted() || exception_class->IsThrowableClass());
1525  SirtRef<mirror::Throwable> exception(this,
1526                                down_cast<mirror::Throwable*>(exception_class->AllocObject(this)));
1527
1528  // Choose an appropriate constructor and set up the arguments.
1529  const char* signature;
1530  SirtRef<mirror::String> msg_string(this, NULL);
1531  if (msg != NULL) {
1532    // Ensure we remember this and the method over the String allocation.
1533    msg_string.reset(mirror::String::AllocFromModifiedUtf8(this, msg));
1534    if (UNLIKELY(msg_string.get() == NULL)) {
1535      CHECK(IsExceptionPending());  // OOME.
1536      return;
1537    }
1538    if (cause.get() == NULL) {
1539      signature = "(Ljava/lang/String;)V";
1540    } else {
1541      signature = "(Ljava/lang/String;Ljava/lang/Throwable;)V";
1542    }
1543  } else {
1544    if (cause.get() == NULL) {
1545      signature = "()V";
1546    } else {
1547      signature = "(Ljava/lang/Throwable;)V";
1548    }
1549  }
1550  mirror::AbstractMethod* exception_init_method =
1551      exception_class->FindDeclaredDirectMethod("<init>", signature);
1552
1553  CHECK(exception_init_method != NULL) << "No <init>" << signature << " in "
1554      << PrettyDescriptor(exception_class_descriptor);
1555
1556  if (UNLIKELY(!runtime->IsStarted())) {
1557    // Something is trying to throw an exception without a started runtime, which is the common
1558    // case in the compiler. We won't be able to invoke the constructor of the exception, so set
1559    // the exception fields directly.
1560    if (msg != NULL) {
1561      exception->SetDetailMessage(msg_string.get());
1562    }
1563    if (cause.get() != NULL) {
1564      exception->SetCause(cause.get());
1565    }
1566    ThrowLocation gc_safe_throw_location(saved_throw_this.get(), saved_throw_method.get(),
1567                                         throw_location.GetDexPc());
1568    SetException(gc_safe_throw_location, exception.get());
1569  } else {
1570    ArgArray args("VLL", 3);
1571    args.Append(reinterpret_cast<uint32_t>(exception.get()));
1572    if (msg != NULL) {
1573      args.Append(reinterpret_cast<uint32_t>(msg_string.get()));
1574    }
1575    if (cause.get() != NULL) {
1576      args.Append(reinterpret_cast<uint32_t>(cause.get()));
1577    }
1578    JValue result;
1579    exception_init_method->Invoke(this, args.GetArray(), args.GetNumBytes(), &result, 'V');
1580    if (LIKELY(!IsExceptionPending())) {
1581      ThrowLocation gc_safe_throw_location(saved_throw_this.get(), saved_throw_method.get(),
1582                                           throw_location.GetDexPc());
1583      SetException(gc_safe_throw_location, exception.get());
1584    }
1585  }
1586}
1587
1588void Thread::ThrowOutOfMemoryError(const char* msg) {
1589  LOG(ERROR) << StringPrintf("Throwing OutOfMemoryError \"%s\"%s",
1590      msg, (throwing_OutOfMemoryError_ ? " (recursive case)" : ""));
1591  ThrowLocation throw_location = GetCurrentLocationForThrow();
1592  if (!throwing_OutOfMemoryError_) {
1593    throwing_OutOfMemoryError_ = true;
1594    ThrowNewException(throw_location, "Ljava/lang/OutOfMemoryError;", msg);
1595    throwing_OutOfMemoryError_ = false;
1596  } else {
1597    Dump(LOG(ERROR)); // The pre-allocated OOME has no stack, so help out and log one.
1598    SetException(throw_location, Runtime::Current()->GetPreAllocatedOutOfMemoryError());
1599  }
1600}
1601
1602Thread* Thread::CurrentFromGdb() {
1603  return Thread::Current();
1604}
1605
1606void Thread::DumpFromGdb() const {
1607  std::ostringstream ss;
1608  Dump(ss);
1609  std::string str(ss.str());
1610  // log to stderr for debugging command line processes
1611  std::cerr << str;
1612#ifdef HAVE_ANDROID_OS
1613  // log to logcat for debugging frameworks processes
1614  LOG(INFO) << str;
1615#endif
1616}
1617
1618struct EntryPointInfo {
1619  uint32_t offset;
1620  const char* name;
1621};
1622#define ENTRY_POINT_INFO(x) { ENTRYPOINT_OFFSET(x), #x }
1623static const EntryPointInfo gThreadEntryPointInfo[] = {
1624  ENTRY_POINT_INFO(pAllocArrayFromCode),
1625  ENTRY_POINT_INFO(pAllocArrayFromCodeWithAccessCheck),
1626  ENTRY_POINT_INFO(pAllocObjectFromCode),
1627  ENTRY_POINT_INFO(pAllocObjectFromCodeWithAccessCheck),
1628  ENTRY_POINT_INFO(pCheckAndAllocArrayFromCode),
1629  ENTRY_POINT_INFO(pCheckAndAllocArrayFromCodeWithAccessCheck),
1630  ENTRY_POINT_INFO(pInstanceofNonTrivialFromCode),
1631  ENTRY_POINT_INFO(pCanPutArrayElementFromCode),
1632  ENTRY_POINT_INFO(pCheckCastFromCode),
1633  ENTRY_POINT_INFO(pInitializeStaticStorage),
1634  ENTRY_POINT_INFO(pInitializeTypeAndVerifyAccessFromCode),
1635  ENTRY_POINT_INFO(pInitializeTypeFromCode),
1636  ENTRY_POINT_INFO(pResolveStringFromCode),
1637  ENTRY_POINT_INFO(pSet32Instance),
1638  ENTRY_POINT_INFO(pSet32Static),
1639  ENTRY_POINT_INFO(pSet64Instance),
1640  ENTRY_POINT_INFO(pSet64Static),
1641  ENTRY_POINT_INFO(pSetObjInstance),
1642  ENTRY_POINT_INFO(pSetObjStatic),
1643  ENTRY_POINT_INFO(pGet32Instance),
1644  ENTRY_POINT_INFO(pGet32Static),
1645  ENTRY_POINT_INFO(pGet64Instance),
1646  ENTRY_POINT_INFO(pGet64Static),
1647  ENTRY_POINT_INFO(pGetObjInstance),
1648  ENTRY_POINT_INFO(pGetObjStatic),
1649  ENTRY_POINT_INFO(pHandleFillArrayDataFromCode),
1650  ENTRY_POINT_INFO(pJniMethodStart),
1651  ENTRY_POINT_INFO(pJniMethodStartSynchronized),
1652  ENTRY_POINT_INFO(pJniMethodEnd),
1653  ENTRY_POINT_INFO(pJniMethodEndSynchronized),
1654  ENTRY_POINT_INFO(pJniMethodEndWithReference),
1655  ENTRY_POINT_INFO(pJniMethodEndWithReferenceSynchronized),
1656  ENTRY_POINT_INFO(pLockObjectFromCode),
1657  ENTRY_POINT_INFO(pUnlockObjectFromCode),
1658  ENTRY_POINT_INFO(pCmpgDouble),
1659  ENTRY_POINT_INFO(pCmpgFloat),
1660  ENTRY_POINT_INFO(pCmplDouble),
1661  ENTRY_POINT_INFO(pCmplFloat),
1662  ENTRY_POINT_INFO(pFmod),
1663  ENTRY_POINT_INFO(pSqrt),
1664  ENTRY_POINT_INFO(pL2d),
1665  ENTRY_POINT_INFO(pFmodf),
1666  ENTRY_POINT_INFO(pL2f),
1667  ENTRY_POINT_INFO(pD2iz),
1668  ENTRY_POINT_INFO(pF2iz),
1669  ENTRY_POINT_INFO(pIdivmod),
1670  ENTRY_POINT_INFO(pD2l),
1671  ENTRY_POINT_INFO(pF2l),
1672  ENTRY_POINT_INFO(pLdiv),
1673  ENTRY_POINT_INFO(pLdivmod),
1674  ENTRY_POINT_INFO(pLmul),
1675  ENTRY_POINT_INFO(pShlLong),
1676  ENTRY_POINT_INFO(pShrLong),
1677  ENTRY_POINT_INFO(pUshrLong),
1678  ENTRY_POINT_INFO(pInterpreterToInterpreterEntry),
1679  ENTRY_POINT_INFO(pInterpreterToQuickEntry),
1680  ENTRY_POINT_INFO(pIndexOf),
1681  ENTRY_POINT_INFO(pMemcmp16),
1682  ENTRY_POINT_INFO(pStringCompareTo),
1683  ENTRY_POINT_INFO(pMemcpy),
1684  ENTRY_POINT_INFO(pPortableResolutionTrampolineFromCode),
1685  ENTRY_POINT_INFO(pQuickResolutionTrampolineFromCode),
1686  ENTRY_POINT_INFO(pInvokeDirectTrampolineWithAccessCheck),
1687  ENTRY_POINT_INFO(pInvokeInterfaceTrampoline),
1688  ENTRY_POINT_INFO(pInvokeInterfaceTrampolineWithAccessCheck),
1689  ENTRY_POINT_INFO(pInvokeStaticTrampolineWithAccessCheck),
1690  ENTRY_POINT_INFO(pInvokeSuperTrampolineWithAccessCheck),
1691  ENTRY_POINT_INFO(pInvokeVirtualTrampolineWithAccessCheck),
1692  ENTRY_POINT_INFO(pCheckSuspendFromCode),
1693  ENTRY_POINT_INFO(pTestSuspendFromCode),
1694  ENTRY_POINT_INFO(pDeliverException),
1695  ENTRY_POINT_INFO(pThrowArrayBoundsFromCode),
1696  ENTRY_POINT_INFO(pThrowDivZeroFromCode),
1697  ENTRY_POINT_INFO(pThrowNoSuchMethodFromCode),
1698  ENTRY_POINT_INFO(pThrowNullPointerFromCode),
1699  ENTRY_POINT_INFO(pThrowStackOverflowFromCode),
1700};
1701#undef ENTRY_POINT_INFO
1702
1703void Thread::DumpThreadOffset(std::ostream& os, uint32_t offset, size_t size_of_pointers) {
1704  CHECK_EQ(size_of_pointers, 4U); // TODO: support 64-bit targets.
1705
1706#define DO_THREAD_OFFSET(x) if (offset == static_cast<uint32_t>(OFFSETOF_VOLATILE_MEMBER(Thread, x))) { os << # x; return; }
1707  DO_THREAD_OFFSET(state_and_flags_);
1708  DO_THREAD_OFFSET(card_table_);
1709  DO_THREAD_OFFSET(exception_);
1710  DO_THREAD_OFFSET(opeer_);
1711  DO_THREAD_OFFSET(jni_env_);
1712  DO_THREAD_OFFSET(self_);
1713  DO_THREAD_OFFSET(stack_end_);
1714  DO_THREAD_OFFSET(suspend_count_);
1715  DO_THREAD_OFFSET(thin_lock_id_);
1716  //DO_THREAD_OFFSET(top_of_managed_stack_);
1717  //DO_THREAD_OFFSET(top_of_managed_stack_pc_);
1718  DO_THREAD_OFFSET(top_sirt_);
1719#undef DO_THREAD_OFFSET
1720
1721  size_t entry_point_count = arraysize(gThreadEntryPointInfo);
1722  CHECK_EQ(entry_point_count * size_of_pointers, sizeof(EntryPoints));
1723  uint32_t expected_offset = OFFSETOF_MEMBER(Thread, entrypoints_);
1724  for (size_t i = 0; i < entry_point_count; ++i) {
1725    CHECK_EQ(gThreadEntryPointInfo[i].offset, expected_offset) << gThreadEntryPointInfo[i].name;
1726    expected_offset += size_of_pointers;
1727    if (gThreadEntryPointInfo[i].offset == offset) {
1728      os << gThreadEntryPointInfo[i].name;
1729      return;
1730    }
1731  }
1732  os << offset;
1733}
1734
1735static const bool kDebugExceptionDelivery = false;
1736class CatchBlockStackVisitor : public StackVisitor {
1737 public:
1738  CatchBlockStackVisitor(Thread* self, const ThrowLocation& throw_location,
1739                         mirror::Throwable* exception, bool is_deoptimization)
1740      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
1741      : StackVisitor(self, self->GetLongJumpContext()),
1742        self_(self), exception_(exception), is_deoptimization_(is_deoptimization),
1743        to_find_(is_deoptimization ? NULL : exception->GetClass()), throw_location_(throw_location),
1744        handler_quick_frame_(NULL), handler_quick_frame_pc_(0), handler_dex_pc_(0),
1745        native_method_count_(0),
1746        method_tracing_active_(is_deoptimization ||
1747                               Runtime::Current()->GetInstrumentation()->AreExitStubsInstalled()),
1748        instrumentation_frames_to_pop_(0), top_shadow_frame_(NULL), prev_shadow_frame_(NULL) {
1749    // Exception not in root sets, can't allow GC.
1750    last_no_assert_suspension_cause_ = self->StartAssertNoThreadSuspension("Finding catch block");
1751  }
1752
1753  ~CatchBlockStackVisitor() {
1754    LOG(FATAL) << "UNREACHABLE";  // Expected to take long jump.
1755  }
1756
1757  bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1758    mirror::AbstractMethod* method = GetMethod();
1759    if (method == NULL) {
1760      // This is the upcall, we remember the frame and last pc so that we may long jump to them.
1761      handler_quick_frame_pc_ = GetCurrentQuickFramePc();
1762      handler_quick_frame_ = GetCurrentQuickFrame();
1763      return false;  // End stack walk.
1764    } else {
1765      if (UNLIKELY(method_tracing_active_ &&
1766                   GetInstrumentationExitPc() == GetReturnPc())) {
1767        // Keep count of the number of unwinds during instrumentation.
1768        instrumentation_frames_to_pop_++;
1769      }
1770      if (method->IsRuntimeMethod()) {
1771        // Ignore callee save method.
1772        DCHECK(method->IsCalleeSaveMethod());
1773        return true;
1774      } else if (is_deoptimization_) {
1775        return HandleDeoptimization(method);
1776      } else {
1777        return HandleTryItems(method);
1778      }
1779    }
1780  }
1781
1782  bool HandleTryItems(mirror::AbstractMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1783    uint32_t dex_pc = DexFile::kDexNoIndex;
1784    if (method->IsNative()) {
1785      native_method_count_++;
1786    } else {
1787      dex_pc = GetDexPc();
1788    }
1789    if (dex_pc != DexFile::kDexNoIndex) {
1790      uint32_t found_dex_pc = method->FindCatchBlock(to_find_, dex_pc);
1791      if (found_dex_pc != DexFile::kDexNoIndex) {
1792        handler_dex_pc_ = found_dex_pc;
1793        handler_quick_frame_pc_ = method->ToNativePc(found_dex_pc);
1794        handler_quick_frame_ = GetCurrentQuickFrame();
1795        return false;  // End stack walk.
1796      }
1797    }
1798    return true;  // Continue stack walk.
1799  }
1800
1801  bool HandleDeoptimization(mirror::AbstractMethod* m) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1802    MethodHelper mh(m);
1803    const DexFile::CodeItem* code_item = mh.GetCodeItem();
1804    CHECK(code_item != NULL);
1805    uint16_t num_regs =  code_item->registers_size_;
1806    uint32_t dex_pc = GetDexPc();
1807    const Instruction* inst = Instruction::At(code_item->insns_ + dex_pc);
1808    uint32_t new_dex_pc = dex_pc + inst->SizeInCodeUnits();
1809    ShadowFrame* new_frame = ShadowFrame::Create(num_regs, NULL, m, new_dex_pc);
1810    verifier::MethodVerifier verifier(&mh.GetDexFile(), mh.GetDexCache(), mh.GetClassLoader(),
1811                                      mh.GetClassDefIndex(), code_item,
1812                                      m->GetDexMethodIndex(), m, m->GetAccessFlags(), false, true);
1813    verifier.Verify();
1814    std::vector<int32_t> kinds = verifier.DescribeVRegs(dex_pc);
1815    for(uint16_t reg = 0; reg < num_regs; reg++) {
1816      VRegKind kind = static_cast<VRegKind>(kinds.at(reg * 2));
1817      switch (kind) {
1818        case kUndefined:
1819          new_frame->SetVReg(reg, 0xEBADDE09);
1820          break;
1821        case kConstant:
1822          new_frame->SetVReg(reg, kinds.at((reg * 2) + 1));
1823          break;
1824        case kReferenceVReg:
1825          new_frame->SetVRegReference(reg,
1826                                      reinterpret_cast<mirror::Object*>(GetVReg(m, reg, kind)));
1827          break;
1828        default:
1829          new_frame->SetVReg(reg, GetVReg(m, reg, kind));
1830          break;
1831      }
1832    }
1833    if (prev_shadow_frame_ != NULL) {
1834      prev_shadow_frame_->SetLink(new_frame);
1835    } else {
1836      top_shadow_frame_ = new_frame;
1837    }
1838    prev_shadow_frame_ = new_frame;
1839    return true;
1840  }
1841
1842  void DoLongJump() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1843    mirror::AbstractMethod* catch_method = *handler_quick_frame_;
1844    if (catch_method == NULL) {
1845      if (kDebugExceptionDelivery) {
1846        LOG(INFO) << "Handler is upcall";
1847      }
1848    } else {
1849      CHECK(!is_deoptimization_);
1850      if (instrumentation_frames_to_pop_ > 0) {
1851        // Don't pop the instrumentation frame of the catch handler.
1852        instrumentation_frames_to_pop_--;
1853      }
1854      if (kDebugExceptionDelivery) {
1855        const DexFile& dex_file = *catch_method->GetDeclaringClass()->GetDexCache()->GetDexFile();
1856        int line_number = dex_file.GetLineNumFromPC(catch_method, handler_dex_pc_);
1857        LOG(INFO) << "Handler: " << PrettyMethod(catch_method) << " (line: " << line_number << ")";
1858      }
1859    }
1860    // Put exception back in root set and clear throw location.
1861    self_->SetException(ThrowLocation(), exception_);
1862    self_->EndAssertNoThreadSuspension(last_no_assert_suspension_cause_);
1863    // Do instrumentation events after allowing thread suspension again.
1864    instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation();
1865    for (size_t i = 0; i < instrumentation_frames_to_pop_; ++i) {
1866      // We pop the instrumentation stack here so as not to corrupt it during the stack walk.
1867      instrumentation->PopMethodForUnwind(self_, is_deoptimization_);
1868    }
1869    if (!is_deoptimization_) {
1870      instrumentation->ExceptionCaughtEvent(self_, throw_location_, catch_method, handler_dex_pc_,
1871                                            exception_);
1872    } else {
1873      // TODO: proper return value.
1874      self_->SetDeoptimizationShadowFrame(top_shadow_frame_);
1875    }
1876    // Place context back on thread so it will be available when we continue.
1877    self_->ReleaseLongJumpContext(context_);
1878    context_->SetSP(reinterpret_cast<uintptr_t>(handler_quick_frame_));
1879    CHECK_NE(handler_quick_frame_pc_, 0u);
1880    context_->SetPC(handler_quick_frame_pc_);
1881    context_->SmashCallerSaves();
1882    context_->DoLongJump();
1883  }
1884
1885 private:
1886  Thread* const self_;
1887  mirror::Throwable* const exception_;
1888  const bool is_deoptimization_;
1889  // The type of the exception catch block to find.
1890  mirror::Class* const to_find_;
1891  // Location of the throw.
1892  const ThrowLocation& throw_location_;
1893  // Quick frame with found handler or last frame if no handler found.
1894  mirror::AbstractMethod** handler_quick_frame_;
1895  // PC to branch to for the handler.
1896  uintptr_t handler_quick_frame_pc_;
1897  // Associated dex PC.
1898  uint32_t handler_dex_pc_;
1899  // Number of native methods passed in crawl (equates to number of SIRTs to pop)
1900  uint32_t native_method_count_;
1901  // Is method tracing active?
1902  const bool method_tracing_active_;
1903  // Support for nesting no thread suspension checks.
1904  const char* last_no_assert_suspension_cause_;
1905  // Number of frames to pop in long jump.
1906  size_t instrumentation_frames_to_pop_;
1907  ShadowFrame* top_shadow_frame_;
1908  ShadowFrame* prev_shadow_frame_;
1909};
1910
1911void Thread::QuickDeliverException() {
1912  // Get exception from thread.
1913  ThrowLocation throw_location;
1914  mirror::Throwable* exception = GetException(&throw_location);
1915  CHECK(exception != NULL);
1916  // Don't leave exception visible while we try to find the handler, which may cause class
1917  // resolution.
1918  ClearException();
1919  bool is_deoptimization = (exception == reinterpret_cast<mirror::Throwable*>(-1));
1920  if (kDebugExceptionDelivery) {
1921    if (!is_deoptimization) {
1922      mirror::String* msg = exception->GetDetailMessage();
1923      std::string str_msg(msg != NULL ? msg->ToModifiedUtf8() : "");
1924      DumpStack(LOG(INFO) << "Delivering exception: " << PrettyTypeOf(exception)
1925                << ": " << str_msg << "\n");
1926    } else {
1927      DumpStack(LOG(INFO) << "Deoptimizing: ");
1928    }
1929  }
1930  CatchBlockStackVisitor catch_finder(this, throw_location, exception, is_deoptimization);
1931  catch_finder.WalkStack(true);
1932  catch_finder.DoLongJump();
1933  LOG(FATAL) << "UNREACHABLE";
1934}
1935
1936Context* Thread::GetLongJumpContext() {
1937  Context* result = long_jump_context_;
1938  if (result == NULL) {
1939    result = Context::Create();
1940  } else {
1941    long_jump_context_ = NULL;  // Avoid context being shared.
1942    result->Reset();
1943  }
1944  return result;
1945}
1946
1947struct CurrentMethodVisitor : public StackVisitor {
1948  CurrentMethodVisitor(Thread* thread, Context* context)
1949      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
1950      : StackVisitor(thread, context), this_object_(NULL), method_(NULL), dex_pc_(0) {}
1951  virtual bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1952    mirror::AbstractMethod* m = GetMethod();
1953    if (m->IsRuntimeMethod()) {
1954      // Continue if this is a runtime method.
1955      return true;
1956    }
1957    if (context_ != NULL) {
1958      this_object_ = GetThisObject();
1959    }
1960    method_ = m;
1961    dex_pc_ = GetDexPc();
1962    return false;
1963  }
1964  mirror::Object* this_object_;
1965  mirror::AbstractMethod* method_;
1966  uint32_t dex_pc_;
1967};
1968
1969mirror::AbstractMethod* Thread::GetCurrentMethod(uint32_t* dex_pc) const {
1970  CurrentMethodVisitor visitor(const_cast<Thread*>(this), NULL);
1971  visitor.WalkStack(false);
1972  if (dex_pc != NULL) {
1973    *dex_pc = visitor.dex_pc_;
1974  }
1975  return visitor.method_;
1976}
1977
1978ThrowLocation Thread::GetCurrentLocationForThrow() {
1979  Context* context = GetLongJumpContext();
1980  CurrentMethodVisitor visitor(this, context);
1981  visitor.WalkStack(false);
1982  ReleaseLongJumpContext(context);
1983  return ThrowLocation(visitor.this_object_, visitor.method_, visitor.dex_pc_);
1984}
1985
1986bool Thread::HoldsLock(mirror::Object* object) {
1987  if (object == NULL) {
1988    return false;
1989  }
1990  return object->GetThinLockId() == thin_lock_id_;
1991}
1992
1993// RootVisitor parameters are: (const Object* obj, size_t vreg, const StackVisitor* visitor).
1994template <typename RootVisitor>
1995class ReferenceMapVisitor : public StackVisitor {
1996 public:
1997  ReferenceMapVisitor(Thread* thread, Context* context, const RootVisitor& visitor)
1998      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
1999      : StackVisitor(thread, context), visitor_(visitor) {}
2000
2001  bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2002    if (false) {
2003      LOG(INFO) << "Visiting stack roots in " << PrettyMethod(GetMethod())
2004          << StringPrintf("@ PC:%04x", GetDexPc());
2005    }
2006    ShadowFrame* shadow_frame = GetCurrentShadowFrame();
2007    if (shadow_frame != NULL) {
2008      mirror::AbstractMethod* m = shadow_frame->GetMethod();
2009      size_t num_regs = shadow_frame->NumberOfVRegs();
2010      if (m->IsNative() || shadow_frame->HasReferenceArray()) {
2011        // SIRT for JNI or References for interpreter.
2012        for (size_t reg = 0; reg < num_regs; ++reg) {
2013          mirror::Object* ref = shadow_frame->GetVRegReference(reg);
2014          if (ref != NULL) {
2015            visitor_(ref, reg, this);
2016          }
2017        }
2018      } else {
2019        // Java method.
2020        // Portable path use DexGcMap and store in Method.native_gc_map_.
2021        const uint8_t* gc_map = m->GetNativeGcMap();
2022        CHECK(gc_map != NULL) << PrettyMethod(m);
2023        uint32_t gc_map_length = static_cast<uint32_t>((gc_map[0] << 24) |
2024                                                       (gc_map[1] << 16) |
2025                                                       (gc_map[2] << 8) |
2026                                                       (gc_map[3] << 0));
2027        verifier::DexPcToReferenceMap dex_gc_map(gc_map + 4, gc_map_length);
2028        uint32_t dex_pc = GetDexPc();
2029        const uint8_t* reg_bitmap = dex_gc_map.FindBitMap(dex_pc);
2030        DCHECK(reg_bitmap != NULL);
2031        num_regs = std::min(dex_gc_map.RegWidth() * 8, num_regs);
2032        for (size_t reg = 0; reg < num_regs; ++reg) {
2033          if (TestBitmap(reg, reg_bitmap)) {
2034            mirror::Object* ref = shadow_frame->GetVRegReference(reg);
2035            if (ref != NULL) {
2036              visitor_(ref, reg, this);
2037            }
2038          }
2039        }
2040      }
2041    } else {
2042      mirror::AbstractMethod* m = GetMethod();
2043      // Process register map (which native and runtime methods don't have)
2044      if (!m->IsNative() && !m->IsRuntimeMethod() && !m->IsProxyMethod()) {
2045        const uint8_t* native_gc_map = m->GetNativeGcMap();
2046        CHECK(native_gc_map != NULL) << PrettyMethod(m);
2047        mh_.ChangeMethod(m);
2048        const DexFile::CodeItem* code_item = mh_.GetCodeItem();
2049        DCHECK(code_item != NULL) << PrettyMethod(m); // Can't be NULL or how would we compile its instructions?
2050        NativePcOffsetToReferenceMap map(native_gc_map);
2051        size_t num_regs = std::min(map.RegWidth() * 8,
2052                                   static_cast<size_t>(code_item->registers_size_));
2053        if (num_regs > 0) {
2054          const uint8_t* reg_bitmap = map.FindBitMap(GetNativePcOffset());
2055          DCHECK(reg_bitmap != NULL);
2056          const VmapTable vmap_table(m->GetVmapTableRaw());
2057          uint32_t core_spills = m->GetCoreSpillMask();
2058          uint32_t fp_spills = m->GetFpSpillMask();
2059          size_t frame_size = m->GetFrameSizeInBytes();
2060          // For all dex registers in the bitmap
2061          mirror::AbstractMethod** cur_quick_frame = GetCurrentQuickFrame();
2062          DCHECK(cur_quick_frame != NULL);
2063          for (size_t reg = 0; reg < num_regs; ++reg) {
2064            // Does this register hold a reference?
2065            if (TestBitmap(reg, reg_bitmap)) {
2066              uint32_t vmap_offset;
2067              mirror::Object* ref;
2068              if (vmap_table.IsInContext(reg, vmap_offset, kReferenceVReg)) {
2069                uintptr_t val = GetGPR(vmap_table.ComputeRegister(core_spills, vmap_offset,
2070                                                                  kReferenceVReg));
2071                ref = reinterpret_cast<mirror::Object*>(val);
2072              } else {
2073                ref = reinterpret_cast<mirror::Object*>(GetVReg(cur_quick_frame, code_item,
2074                                                                core_spills, fp_spills, frame_size,
2075                                                                reg));
2076              }
2077
2078              if (ref != NULL) {
2079                visitor_(ref, reg, this);
2080              }
2081            }
2082          }
2083        }
2084      }
2085    }
2086    return true;
2087  }
2088
2089 private:
2090  static bool TestBitmap(int reg, const uint8_t* reg_vector) {
2091    return ((reg_vector[reg / 8] >> (reg % 8)) & 0x01) != 0;
2092  }
2093
2094  // Visitor for when we visit a root.
2095  const RootVisitor& visitor_;
2096
2097  // A method helper we keep around to avoid dex file/cache re-computations.
2098  MethodHelper mh_;
2099};
2100
2101class RootCallbackVisitor {
2102 public:
2103  RootCallbackVisitor(RootVisitor* visitor, void* arg) : visitor_(visitor), arg_(arg) {
2104
2105  }
2106
2107  void operator()(const mirror::Object* obj, size_t, const StackVisitor*) const {
2108    visitor_(obj, arg_);
2109  }
2110
2111 private:
2112  RootVisitor* visitor_;
2113  void* arg_;
2114};
2115
2116class VerifyCallbackVisitor {
2117 public:
2118  VerifyCallbackVisitor(VerifyRootVisitor* visitor, void* arg)
2119      : visitor_(visitor),
2120        arg_(arg) {
2121  }
2122
2123  void operator()(const mirror::Object* obj, size_t vreg, const StackVisitor* visitor) const {
2124    visitor_(obj, arg_, vreg, visitor);
2125  }
2126
2127 private:
2128  VerifyRootVisitor* const visitor_;
2129  void* const arg_;
2130};
2131
2132struct VerifyRootWrapperArg {
2133  VerifyRootVisitor* visitor;
2134  void* arg;
2135};
2136
2137static void VerifyRootWrapperCallback(const mirror::Object* root, void* arg) {
2138  VerifyRootWrapperArg* wrapperArg = reinterpret_cast<VerifyRootWrapperArg*>(arg);
2139  wrapperArg->visitor(root, wrapperArg->arg, 0, NULL);
2140}
2141
2142void Thread::VerifyRoots(VerifyRootVisitor* visitor, void* arg) {
2143  // We need to map from a RootVisitor to VerifyRootVisitor, so pass in nulls for arguments we
2144  // don't have.
2145  VerifyRootWrapperArg wrapperArg;
2146  wrapperArg.arg = arg;
2147  wrapperArg.visitor = visitor;
2148
2149  if (opeer_ != NULL) {
2150    VerifyRootWrapperCallback(opeer_, &wrapperArg);
2151  }
2152  if (exception_ != NULL) {
2153    VerifyRootWrapperCallback(exception_, &wrapperArg);
2154  }
2155  throw_location_.VisitRoots(VerifyRootWrapperCallback, &wrapperArg);
2156  if (class_loader_override_ != NULL) {
2157    VerifyRootWrapperCallback(class_loader_override_, &wrapperArg);
2158  }
2159  jni_env_->locals.VisitRoots(VerifyRootWrapperCallback, &wrapperArg);
2160  jni_env_->monitors.VisitRoots(VerifyRootWrapperCallback, &wrapperArg);
2161
2162  SirtVisitRoots(VerifyRootWrapperCallback, &wrapperArg);
2163
2164  // Visit roots on this thread's stack
2165  Context* context = GetLongJumpContext();
2166  VerifyCallbackVisitor visitorToCallback(visitor, arg);
2167  ReferenceMapVisitor<VerifyCallbackVisitor> mapper(this, context, visitorToCallback);
2168  mapper.WalkStack();
2169  ReleaseLongJumpContext(context);
2170
2171  std::deque<instrumentation::InstrumentationStackFrame>* instrumentation_stack = GetInstrumentationStack();
2172  typedef std::deque<instrumentation::InstrumentationStackFrame>::const_iterator It;
2173  for (It it = instrumentation_stack->begin(), end = instrumentation_stack->end(); it != end; ++it) {
2174    mirror::Object* this_object = (*it).this_object_;
2175    if (this_object != NULL) {
2176      VerifyRootWrapperCallback(this_object, &wrapperArg);
2177    }
2178    mirror::AbstractMethod* method = (*it).method_;
2179    VerifyRootWrapperCallback(method, &wrapperArg);
2180  }
2181}
2182
2183void Thread::VisitRoots(RootVisitor* visitor, void* arg) {
2184  if (opeer_ != NULL) {
2185    visitor(opeer_, arg);
2186  }
2187  if (exception_ != NULL) {
2188    visitor(exception_, arg);
2189  }
2190  throw_location_.VisitRoots(visitor, arg);
2191  if (class_loader_override_ != NULL) {
2192    visitor(class_loader_override_, arg);
2193  }
2194  jni_env_->locals.VisitRoots(visitor, arg);
2195  jni_env_->monitors.VisitRoots(visitor, arg);
2196
2197  SirtVisitRoots(visitor, arg);
2198
2199  // Visit roots on this thread's stack
2200  Context* context = GetLongJumpContext();
2201  RootCallbackVisitor visitorToCallback(visitor, arg);
2202  ReferenceMapVisitor<RootCallbackVisitor> mapper(this, context, visitorToCallback);
2203  mapper.WalkStack();
2204  ReleaseLongJumpContext(context);
2205
2206  std::deque<instrumentation::InstrumentationStackFrame>* instrumentation_stack = GetInstrumentationStack();
2207  typedef std::deque<instrumentation::InstrumentationStackFrame>::const_iterator It;
2208  for (It it = instrumentation_stack->begin(), end = instrumentation_stack->end(); it != end; ++it) {
2209    mirror::Object* this_object = (*it).this_object_;
2210    if (this_object != NULL) {
2211      visitor(this_object, arg);
2212    }
2213    mirror::AbstractMethod* method = (*it).method_;
2214    visitor(method, arg);
2215  }
2216}
2217
2218static void VerifyObject(const mirror::Object* root, void* arg) {
2219  gc::Heap* heap = reinterpret_cast<gc::Heap*>(arg);
2220  heap->VerifyObject(root);
2221}
2222
2223void Thread::VerifyStackImpl() {
2224  UniquePtr<Context> context(Context::Create());
2225  RootCallbackVisitor visitorToCallback(VerifyObject, Runtime::Current()->GetHeap());
2226  ReferenceMapVisitor<RootCallbackVisitor> mapper(this, context.get(), visitorToCallback);
2227  mapper.WalkStack();
2228}
2229
2230// Set the stack end to that to be used during a stack overflow
2231void Thread::SetStackEndForStackOverflow() {
2232  // During stack overflow we allow use of the full stack
2233  if (stack_end_ == stack_begin_) {
2234    DumpStack(std::cerr);
2235    LOG(FATAL) << "Need to increase kStackOverflowReservedBytes (currently "
2236               << kStackOverflowReservedBytes << ")";
2237  }
2238
2239  stack_end_ = stack_begin_;
2240}
2241
2242std::ostream& operator<<(std::ostream& os, const Thread& thread) {
2243  thread.ShortDump(os);
2244  return os;
2245}
2246
2247}  // namespace art
2248