From: Hiroshi Yamauchi Date: Fri, 29 Jul 2016 22:07:05 +0000 (-0700) Subject: Revert "Revert "Scan immune spaces using mod union tables."" X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5408f2359fad81f0c59ab0c6c20c498193837eb6;p=android-x86%2Fart.git Revert "Revert "Scan immune spaces using mod union tables."" This reverts commit ccf7c8a68972f3b7bfa38af0c6b792f712f83765. Change-Id: Iee618d9ae78e1dcdea4a7ecbe9253821d4d4d015 Test: N9 boot, art tests, Ritz EAAC. Bug: 29516968 Bug: 29517059 Bug: 12687968 --- diff --git a/runtime/gc/collector/concurrent_copying.cc b/runtime/gc/collector/concurrent_copying.cc index 0fdc86975..63b8c6e19 100644 --- a/runtime/gc/collector/concurrent_copying.cc +++ b/runtime/gc/collector/concurrent_copying.cc @@ -524,7 +524,7 @@ class ConcurrentCopying::ImmuneSpaceScanObjVisitor { explicit ImmuneSpaceScanObjVisitor(ConcurrentCopying* cc) : collector_(cc) {} - void operator()(mirror::Object* obj) const SHARED_REQUIRES(Locks::mutator_lock_) { + ALWAYS_INLINE void operator()(mirror::Object* obj) const SHARED_REQUIRES(Locks::mutator_lock_) { if (kUseBakerReadBarrier && kGrayDirtyImmuneObjects) { if (obj->GetReadBarrierPointer() == ReadBarrier::GrayPtr()) { collector_->ScanImmuneObject(obj); @@ -538,6 +538,10 @@ class ConcurrentCopying::ImmuneSpaceScanObjVisitor { } } + static void Callback(mirror::Object* obj, void* arg) SHARED_REQUIRES(Locks::mutator_lock_) { + reinterpret_cast(arg)->operator()(obj); + } + private: ConcurrentCopying* const collector_; }; @@ -562,10 +566,15 @@ void ConcurrentCopying::MarkingPhase() { for (auto& space : immune_spaces_.GetSpaces()) { DCHECK(space->IsImageSpace() || space->IsZygoteSpace()); accounting::ContinuousSpaceBitmap* live_bitmap = space->GetLiveBitmap(); + accounting::ModUnionTable* table = heap_->FindModUnionTableFromSpace(space); ImmuneSpaceScanObjVisitor visitor(this); - live_bitmap->VisitMarkedRange(reinterpret_cast(space->Begin()), - reinterpret_cast(space->Limit()), - visitor); + if (kUseBakerReadBarrier && kGrayDirtyImmuneObjects && table != nullptr) { + table->VisitObjects(ImmuneSpaceScanObjVisitor::Callback, &visitor); + } else { + live_bitmap->VisitMarkedRange(reinterpret_cast(space->Begin()), + reinterpret_cast(space->Limit()), + visitor); + } } } if (kUseBakerReadBarrier) {