diff options
author | Mathieu Chartier <mathieuc@google.com> | 2013-09-12 17:33:56 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2013-09-13 10:30:24 -0700 |
commit | 423d2a3dcbb260b020efb5da59f784c9f02accbf (patch) | |
tree | 79ed739e6072f8308c1cd880f9420a1c63539c95 /runtime/gc | |
parent | b048dd2b662c19644361f4396a1e8d6213445ee8 (diff) | |
download | art-423d2a3dcbb260b020efb5da59f784c9f02accbf.zip art-423d2a3dcbb260b020efb5da59f784c9f02accbf.tar.gz art-423d2a3dcbb260b020efb5da59f784c9f02accbf.tar.bz2 |
Add support for changing roots through the root visitor callback.
Needed for copying collectors.
Change-Id: Icc4a342a57e0cfb79587edb02ef8c85e08808877
Diffstat (limited to 'runtime/gc')
-rw-r--r-- | runtime/gc/collector/mark_sweep.cc | 32 | ||||
-rw-r--r-- | runtime/gc/collector/mark_sweep.h | 8 | ||||
-rw-r--r-- | runtime/gc/heap.cc | 8 |
3 files changed, 20 insertions, 28 deletions
diff --git a/runtime/gc/collector/mark_sweep.cc b/runtime/gc/collector/mark_sweep.cc index 953fbf9..f724cdb 100644 --- a/runtime/gc/collector/mark_sweep.cc +++ b/runtime/gc/collector/mark_sweep.cc @@ -497,24 +497,18 @@ void MarkSweep::MarkRoot(const Object* obj) { } } -void MarkSweep::MarkRootParallelCallback(const Object* root, void* arg) { +Object* MarkSweep::MarkRootParallelCallback(Object* root, void* arg) { DCHECK(root != NULL); DCHECK(arg != NULL); reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNullParallel(root); + return root; } -void MarkSweep::MarkObjectCallback(const Object* root, void* arg) { - DCHECK(root != NULL); - DCHECK(arg != NULL); - MarkSweep* mark_sweep = reinterpret_cast<MarkSweep*>(arg); - mark_sweep->MarkObjectNonNull(root); -} - -void MarkSweep::ReMarkObjectVisitor(const Object* root, void* arg) { - DCHECK(root != NULL); - DCHECK(arg != NULL); - MarkSweep* mark_sweep = reinterpret_cast<MarkSweep*>(arg); - mark_sweep->MarkObjectNonNull(root); +Object* MarkSweep::MarkRootCallback(Object* root, void* arg) { + DCHECK(root != nullptr); + DCHECK(arg != nullptr); + reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNull(root); + return root; } void MarkSweep::VerifyRootCallback(const Object* root, void* arg, size_t vreg, @@ -542,20 +536,20 @@ void MarkSweep::VerifyRoots() { // Marks all objects in the root set. void MarkSweep::MarkRoots() { timings_.StartSplit("MarkRoots"); - Runtime::Current()->VisitNonConcurrentRoots(MarkObjectCallback, this); + Runtime::Current()->VisitNonConcurrentRoots(MarkRootCallback, this); timings_.EndSplit(); } void MarkSweep::MarkNonThreadRoots() { timings_.StartSplit("MarkNonThreadRoots"); - Runtime::Current()->VisitNonThreadRoots(MarkObjectCallback, this); + Runtime::Current()->VisitNonThreadRoots(MarkRootCallback, this); timings_.EndSplit(); } void MarkSweep::MarkConcurrentRoots() { timings_.StartSplit("MarkConcurrentRoots"); // Visit all runtime roots and clear dirty flags. - Runtime::Current()->VisitConcurrentRoots(MarkObjectCallback, this, false, true); + Runtime::Current()->VisitConcurrentRoots(MarkRootCallback, this, false, true); timings_.EndSplit(); } @@ -963,14 +957,14 @@ void MarkSweep::RecursiveMarkDirtyObjects(bool paused, byte minimum_age) { void MarkSweep::ReMarkRoots() { timings_.StartSplit("ReMarkRoots"); - Runtime::Current()->VisitRoots(ReMarkObjectVisitor, this, true, true); + Runtime::Current()->VisitRoots(MarkRootCallback, this, true, true); timings_.EndSplit(); } void MarkSweep::SweepJniWeakGlobals(IsMarkedTester is_marked, void* arg) { JavaVMExt* vm = Runtime::Current()->GetJavaVM(); WriterMutexLock mu(Thread::Current(), vm->weak_globals_lock); - for (const Object** entry : vm->weak_globals) { + for (Object** entry : vm->weak_globals) { if (!is_marked(*entry, arg)) { *entry = kClearedJniWeakGlobal; } @@ -1053,7 +1047,7 @@ void MarkSweep::VerifySystemWeaks() { JavaVMExt* vm = runtime->GetJavaVM(); ReaderMutexLock mu(Thread::Current(), vm->weak_globals_lock); - for (const Object** entry : vm->weak_globals) { + for (Object** entry : vm->weak_globals) { VerifyIsLive(*entry); } } diff --git a/runtime/gc/collector/mark_sweep.h b/runtime/gc/collector/mark_sweep.h index fdd0c86..8b6ac15 100644 --- a/runtime/gc/collector/mark_sweep.h +++ b/runtime/gc/collector/mark_sweep.h @@ -223,11 +223,11 @@ class MarkSweep : public GarbageCollector { SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); - static void MarkObjectCallback(const mirror::Object* root, void* arg) + static mirror::Object* MarkRootCallback(mirror::Object* root, void* arg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); - static void MarkRootParallelCallback(const mirror::Object* root, void* arg); + static mirror::Object* MarkRootParallelCallback(mirror::Object* root, void* arg); // Marks an object. void MarkObject(const mirror::Object* obj) @@ -252,10 +252,6 @@ class MarkSweep : public GarbageCollector { static bool IsMarkedArrayCallback(const mirror::Object* object, void* arg) SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); - static void ReMarkObjectVisitor(const mirror::Object* root, void* arg) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) - EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); - static void VerifyImageRootVisitor(mirror::Object* root, void* arg) SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index e0048a0..916d38e 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -1322,11 +1322,12 @@ void Heap::UpdateAndMarkModUnion(collector::MarkSweep* mark_sweep, base::TimingL image_mod_union_table_->MarkReferences(mark_sweep); } -static void RootMatchesObjectVisitor(const mirror::Object* root, void* arg) { +static mirror::Object* RootMatchesObjectVisitor(mirror::Object* root, void* arg) { mirror::Object* obj = reinterpret_cast<mirror::Object*>(arg); if (root == obj) { LOG(INFO) << "Object " << obj << " is a root"; } + return root; } class ScanVisitor { @@ -1414,9 +1415,10 @@ class VerifyReferenceVisitor { return heap_->IsLiveObjectLocked(obj); } - static void VerifyRoots(const mirror::Object* root, void* arg) { + static mirror::Object* VerifyRoots(mirror::Object* root, void* arg) { VerifyReferenceVisitor* visitor = reinterpret_cast<VerifyReferenceVisitor*>(arg); - (*visitor)(NULL, root, MemberOffset(0), true); + (*visitor)(nullptr, root, MemberOffset(0), true); + return root; } private: |