diff options
Diffstat (limited to 'runtime/thread.cc')
-rw-r--r-- | runtime/thread.cc | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/runtime/thread.cc b/runtime/thread.cc index 6a1aeb56ba..78a8bf81d7 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -1151,8 +1151,7 @@ void Thread::AssertNoPendingExceptionForNewException(const char* msg) const { } } -static void MonitorExitVisitor(mirror::Object** object, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) +static void MonitorExitVisitor(mirror::Object** object, void* arg, const RootInfo& /*root_info*/) NO_THREAD_SAFETY_ANALYSIS { Thread* self = reinterpret_cast<Thread*>(arg); mirror::Object* entered_monitor = *object; @@ -1171,7 +1170,7 @@ void Thread::Destroy() { if (tlsPtr_.jni_env != nullptr) { // On thread detach, all monitors entered with JNI MonitorEnter are automatically exited. - tlsPtr_.jni_env->monitors.VisitRoots(MonitorExitVisitor, self, 0, kRootVMInternal); + tlsPtr_.jni_env->monitors.VisitRoots(MonitorExitVisitor, self, RootInfo(kRootVMInternal)); // Release locally held global references which releasing may require the mutator lock. if (tlsPtr_.jpeer != nullptr) { // If pthread_create fails we don't have a jni env here. @@ -1333,7 +1332,7 @@ void Thread::HandleScopeVisitRoots(RootCallback* visitor, void* arg, uint32_t th mirror::Object* object = cur->GetReference(j); if (object != nullptr) { mirror::Object* old_obj = object; - visitor(&object, arg, thread_id, kRootNativeStack); + visitor(&object, arg, RootInfo(kRootNativeStack, thread_id)); if (old_obj != object) { cur->SetReference(j, object); } @@ -2219,8 +2218,8 @@ class RootCallbackVisitor { RootCallbackVisitor(RootCallback* callback, void* arg, uint32_t tid) : callback_(callback), arg_(arg), tid_(tid) {} - void operator()(mirror::Object** obj, size_t, const StackVisitor*) const { - callback_(obj, arg_, tid_, kRootJavaFrame); + void operator()(mirror::Object** obj, size_t vreg, const StackVisitor* stack_visitor) const { + callback_(obj, arg_, JavaFrameRootInfo(tid_, stack_visitor, vreg)); } private: @@ -2232,23 +2231,24 @@ class RootCallbackVisitor { void Thread::VisitRoots(RootCallback* visitor, void* arg) { uint32_t thread_id = GetThreadId(); if (tlsPtr_.opeer != nullptr) { - visitor(&tlsPtr_.opeer, arg, thread_id, kRootThreadObject); + visitor(&tlsPtr_.opeer, arg, RootInfo(kRootThreadObject, thread_id)); } if (tlsPtr_.exception != nullptr && tlsPtr_.exception != GetDeoptimizationException()) { - visitor(reinterpret_cast<mirror::Object**>(&tlsPtr_.exception), arg, thread_id, kRootNativeStack); + visitor(reinterpret_cast<mirror::Object**>(&tlsPtr_.exception), arg, + RootInfo(kRootNativeStack, thread_id)); } tlsPtr_.throw_location.VisitRoots(visitor, arg); if (tlsPtr_.monitor_enter_object != nullptr) { - visitor(&tlsPtr_.monitor_enter_object, arg, thread_id, kRootNativeStack); + visitor(&tlsPtr_.monitor_enter_object, arg, RootInfo(kRootNativeStack, thread_id)); } - tlsPtr_.jni_env->locals.VisitRoots(visitor, arg, thread_id, kRootJNILocal); - tlsPtr_.jni_env->monitors.VisitRoots(visitor, arg, thread_id, kRootJNIMonitor); + tlsPtr_.jni_env->locals.VisitRoots(visitor, arg, RootInfo(kRootJNILocal, thread_id)); + tlsPtr_.jni_env->monitors.VisitRoots(visitor, arg, RootInfo(kRootJNIMonitor, thread_id)); HandleScopeVisitRoots(visitor, arg, thread_id); if (tlsPtr_.debug_invoke_req != nullptr) { - tlsPtr_.debug_invoke_req->VisitRoots(visitor, arg, thread_id, kRootDebugger); + tlsPtr_.debug_invoke_req->VisitRoots(visitor, arg, RootInfo(kRootDebugger, thread_id)); } if (tlsPtr_.single_step_control != nullptr) { - tlsPtr_.single_step_control->VisitRoots(visitor, arg, thread_id, kRootDebugger); + tlsPtr_.single_step_control->VisitRoots(visitor, arg, RootInfo(kRootDebugger, thread_id)); } if (tlsPtr_.deoptimization_shadow_frame != nullptr) { RootCallbackVisitor visitorToCallback(visitor, arg, thread_id); @@ -2259,8 +2259,8 @@ void Thread::VisitRoots(RootCallback* visitor, void* arg) { } } if (tlsPtr_.shadow_frame_under_construction != nullptr) { - RootCallbackVisitor visitorToCallback(visitor, arg, thread_id); - ReferenceMapVisitor<RootCallbackVisitor> mapper(this, nullptr, visitorToCallback); + RootCallbackVisitor visitor_to_callback(visitor, arg, thread_id); + ReferenceMapVisitor<RootCallbackVisitor> mapper(this, nullptr, visitor_to_callback); for (ShadowFrame* shadow_frame = tlsPtr_.shadow_frame_under_construction; shadow_frame != nullptr; shadow_frame = shadow_frame->GetLink()) { @@ -2269,21 +2269,22 @@ void Thread::VisitRoots(RootCallback* visitor, void* arg) { } // Visit roots on this thread's stack Context* context = GetLongJumpContext(); - RootCallbackVisitor visitorToCallback(visitor, arg, thread_id); - ReferenceMapVisitor<RootCallbackVisitor> mapper(this, context, visitorToCallback); + RootCallbackVisitor visitor_to_callback(visitor, arg, thread_id); + ReferenceMapVisitor<RootCallbackVisitor> mapper(this, context, visitor_to_callback); mapper.WalkStack(); ReleaseLongJumpContext(context); for (instrumentation::InstrumentationStackFrame& frame : *GetInstrumentationStack()) { if (frame.this_object_ != nullptr) { - visitor(&frame.this_object_, arg, thread_id, kRootJavaFrame); + visitor(&frame.this_object_, arg, RootInfo(kRootVMInternal, thread_id)); } DCHECK(frame.method_ != nullptr); - visitor(reinterpret_cast<mirror::Object**>(&frame.method_), arg, thread_id, kRootJavaFrame); + visitor(reinterpret_cast<mirror::Object**>(&frame.method_), arg, + RootInfo(kRootVMInternal, thread_id)); } } -static void VerifyRoot(mirror::Object** root, void* /*arg*/, uint32_t /*thread_id*/, - RootType /*root_type*/) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { +static void VerifyRoot(mirror::Object** root, void* /*arg*/, const RootInfo& /*root_info*/) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { VerifyObject(*root); } |