ObjPtr<>-ify Monitor/-Pool.
Test: m test-art-host-gtest
Test: testrunner.py --host
Bug: 31113334
Change-Id: I2d2ebc5ef56e73e5678e0cfcd84c479611dfcca8
diff --git a/runtime/monitor_objects_stack_visitor.h b/runtime/monitor_objects_stack_visitor.h
index 3968239..8e148aa 100644
--- a/runtime/monitor_objects_stack_visitor.h
+++ b/runtime/monitor_objects_stack_visitor.h
@@ -54,70 +54,7 @@
kEndStackWalk,
};
- bool VisitFrame() final REQUIRES_SHARED(Locks::mutator_lock_) {
- ArtMethod* m = GetMethod();
- if (m->IsRuntimeMethod()) {
- return true;
- }
-
- VisitMethodResult vmrEntry = StartMethod(m, frame_count);
- switch (vmrEntry) {
- case VisitMethodResult::kContinueMethod:
- break;
- case VisitMethodResult::kSkipMethod:
- return true;
- case VisitMethodResult::kEndStackWalk:
- return false;
- }
-
- if (frame_count == 0) {
- // Top frame, check for blocked state.
-
- mirror::Object* monitor_object;
- uint32_t lock_owner_tid;
- ThreadState state = Monitor::FetchState(GetThread(),
- &monitor_object,
- &lock_owner_tid);
- switch (state) {
- case kWaiting:
- case kTimedWaiting:
- VisitWaitingObject(monitor_object, state);
- break;
- case kSleeping:
- VisitSleepingObject(monitor_object);
- break;
-
- case kBlocked:
- case kWaitingForLockInflation:
- VisitBlockedOnObject(monitor_object, state, lock_owner_tid);
- break;
-
- default:
- break;
- }
- }
-
- if (dump_locks) {
- // Visit locks, but do not abort on errors. This could trigger a nested abort.
- // Skip visiting locks if dump_locks is false as it would cause a bad_mutexes_held in
- // RegTypeCache::RegTypeCache due to thread_list_lock.
- Monitor::VisitLocks(this, VisitLockedObject, this, false);
- }
-
- ++frame_count;
-
- VisitMethodResult vmrExit = EndMethod(m);
- switch (vmrExit) {
- case VisitMethodResult::kContinueMethod:
- case VisitMethodResult::kSkipMethod:
- return true;
-
- case VisitMethodResult::kEndStackWalk:
- return false;
- }
- LOG(FATAL) << "Unreachable";
- UNREACHABLE();
- }
+ bool VisitFrame() final REQUIRES_SHARED(Locks::mutator_lock_);
protected:
virtual VisitMethodResult StartMethod(ArtMethod* m, size_t frame_nr)
@@ -125,31 +62,22 @@
virtual VisitMethodResult EndMethod(ArtMethod* m)
REQUIRES_SHARED(Locks::mutator_lock_) = 0;
- virtual void VisitWaitingObject(mirror::Object* obj, ThreadState state)
+ virtual void VisitWaitingObject(ObjPtr<mirror::Object> obj, ThreadState state)
REQUIRES_SHARED(Locks::mutator_lock_) = 0;
- virtual void VisitSleepingObject(mirror::Object* obj)
+ virtual void VisitSleepingObject(ObjPtr<mirror::Object> obj)
REQUIRES_SHARED(Locks::mutator_lock_) = 0;
- virtual void VisitBlockedOnObject(mirror::Object* obj, ThreadState state, uint32_t owner_tid)
+ virtual void VisitBlockedOnObject(ObjPtr<mirror::Object> obj,
+ ThreadState state,
+ uint32_t owner_tid)
REQUIRES_SHARED(Locks::mutator_lock_) = 0;
- virtual void VisitLockedObject(mirror::Object* obj)
+ virtual void VisitLockedObject(ObjPtr<mirror::Object> obj)
REQUIRES_SHARED(Locks::mutator_lock_) = 0;
size_t frame_count;
private:
- static void VisitLockedObject(mirror::Object* o, void* context)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- MonitorObjectsStackVisitor* self = reinterpret_cast<MonitorObjectsStackVisitor*>(context);
- if (o != nullptr) {
- if (kUseReadBarrier && Thread::Current()->GetIsGcMarking()) {
- // We may call Thread::Dump() in the middle of the CC thread flip and this thread's stack
- // may have not been flipped yet and "o" may be a from-space (stale) ref, in which case the
- // IdentityHashCode call below will crash. So explicitly mark/forward it here.
- o = ReadBarrier::Mark(o);
- }
- }
- self->VisitLockedObject(o);
- }
+ static void VisitLockedObject(ObjPtr<mirror::Object> o, void* context)
+ REQUIRES_SHARED(Locks::mutator_lock_);
const bool dump_locks;
};