bool MonitorObjectsStackVisitor::VisitFrame() {
ArtMethod* m = GetMethod(); if (m->IsRuntimeMethod()) { returntrue;
}
VisitMethodResult vmrEntry = StartMethod(m, frame_count); switch (vmrEntry) { case VisitMethodResult::kContinueMethod: break; case VisitMethodResult::kSkipMethod: returntrue; case VisitMethodResult::kEndStackWalk: returnfalse;
}
if (frame_count == 0) { // Top frame, check for blocked state.
ObjPtr<mirror::Object> monitor_object;
uint32_t lock_owner_thread_id;
ThreadState state = Monitor::FetchState(GetThread(), &monitor_object, &lock_owner_thread_id); switch (state) { case ThreadState::kWaiting: case ThreadState::kTimedWaiting:
VisitWaitingObject(monitor_object, state); break; case ThreadState::kSleeping:
VisitSleepingObject(monitor_object); break;
case ThreadState::kBlocked: case ThreadState::kWaitingForLockInflation:
VisitBlockedOnObject(monitor_object, state, lock_owner_thread_id); 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: returntrue;
case VisitMethodResult::kEndStackWalk: returnfalse;
}
LOG(FATAL) << "Unreachable";
UNREACHABLE();
}
void MonitorObjectsStackVisitor::VisitLockedObject(ObjPtr<mirror::Object> o, void* context) {
MonitorObjectsStackVisitor* self = reinterpret_cast<MonitorObjectsStackVisitor*>(context); if (o != nullptr) { if (gUseReadBarrier && 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.Ptr());
}
}
self->VisitLockedObject(o);
}
} // namespace art
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.