OSDN Git Service

Revert "Revert "Scan immune spaces using mod union tables.""
authorHiroshi Yamauchi <yamauchi@google.com>
Fri, 29 Jul 2016 22:07:05 +0000 (15:07 -0700)
committerHiroshi Yamauchi <yamauchi@google.com>
Fri, 29 Jul 2016 22:08:24 +0000 (15:08 -0700)
This reverts commit ccf7c8a68972f3b7bfa38af0c6b792f712f83765.

Change-Id: Iee618d9ae78e1dcdea4a7ecbe9253821d4d4d015
Test: N9 boot, art tests, Ritz EAAC.
Bug: 29516968
Bug: 29517059
Bug: 12687968

runtime/gc/collector/concurrent_copying.cc

index 0fdc869..63b8c6e 100644 (file)
@@ -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<ImmuneSpaceScanObjVisitor*>(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<uintptr_t>(space->Begin()),
-                                    reinterpret_cast<uintptr_t>(space->Limit()),
-                                    visitor);
+      if (kUseBakerReadBarrier && kGrayDirtyImmuneObjects && table != nullptr) {
+        table->VisitObjects(ImmuneSpaceScanObjVisitor::Callback, &visitor);
+      } else {
+        live_bitmap->VisitMarkedRange(reinterpret_cast<uintptr_t>(space->Begin()),
+                                      reinterpret_cast<uintptr_t>(space->Limit()),
+                                      visitor);
+      }
     }
   }
   if (kUseBakerReadBarrier) {