diff options
Diffstat (limited to 'runtime/java_vm_ext.cc')
-rw-r--r-- | runtime/java_vm_ext.cc | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/runtime/java_vm_ext.cc b/runtime/java_vm_ext.cc index 09bfbf3885..b795d72a6a 100644 --- a/runtime/java_vm_ext.cc +++ b/runtime/java_vm_ext.cc @@ -748,19 +748,18 @@ void* JavaVMExt::FindCodeForNativeMethod(mirror::ArtMethod* m) { void JavaVMExt::SweepJniWeakGlobals(IsMarkedCallback* callback, void* arg) { MutexLock mu(Thread::Current(), weak_globals_lock_); - for (mirror::Object** entry : weak_globals_) { - // Since this is called by the GC, we don't need a read barrier. - mirror::Object* obj = *entry; - if (obj == nullptr) { - // Need to skip null here to distinguish between null entries - // and cleared weak ref entries. - continue; - } - mirror::Object* new_obj = callback(obj, arg); - if (new_obj == nullptr) { - new_obj = Runtime::Current()->GetClearedJniWeakGlobal(); + Runtime* const runtime = Runtime::Current(); + for (auto* entry : weak_globals_) { + // Need to skip null here to distinguish between null entries and cleared weak ref entries. + if (!entry->IsNull()) { + // Since this is called by the GC, we don't need a read barrier. + mirror::Object* obj = entry->Read<kWithoutReadBarrier>(); + mirror::Object* new_obj = callback(obj, arg); + if (new_obj == nullptr) { + new_obj = runtime->GetClearedJniWeakGlobal(); + } + *entry = GcRoot<mirror::Object>(new_obj); } - *entry = new_obj; } } @@ -769,10 +768,10 @@ void JavaVMExt::TrimGlobals() { globals_.Trim(); } -void JavaVMExt::VisitRoots(RootCallback* callback, void* arg) { +void JavaVMExt::VisitRoots(RootVisitor* visitor) { Thread* self = Thread::Current(); ReaderMutexLock mu(self, globals_lock_); - globals_.VisitRoots(callback, arg, RootInfo(kRootJNIGlobal)); + globals_.VisitRoots(visitor, RootInfo(kRootJNIGlobal)); // The weak_globals table is visited by the GC itself (because it mutates the table). } |