OSDN Git Service

Fix heap verification with SS/GSS.
authorMathieu Chartier <mathieuc@google.com>
Fri, 11 Apr 2014 23:42:46 +0000 (16:42 -0700)
committerMathieu Chartier <mathieuc@google.com>
Fri, 11 Apr 2014 23:52:59 +0000 (16:52 -0700)
Since I had removed the SwapSemiSpaces it was trying to verify
references in the from space of the semispace collector, which isn't
necessarily valid.

Bug: 13989162

Change-Id: I8e0b7119a1a53d63f2c71ecdb276290eda5bae07

runtime/gc/collector/semi_space.cc
runtime/gc/heap.cc

index 6e31cb7..ccb38c4 100644 (file)
@@ -393,10 +393,10 @@ void SemiSpace::ReclaimPhase() {
   // Note: Freed bytes can be negative if we copy form a compacted space to a free-list backed
   // space.
   heap_->RecordFree(freed_objects, freed_bytes);
+
   timings_.StartSplit("PreSweepingGcVerification");
   heap_->PreSweepingGcVerification(this);
   timings_.EndSplit();
-
   {
     WriterMutexLock mu(self_, *Locks::heap_bitmap_lock_);
     // Reclaim unmarked objects.
@@ -411,6 +411,8 @@ void SemiSpace::ReclaimPhase() {
     TimingLogger::ScopedSplit split("UnBindBitmaps", &timings_);
     GetHeap()->UnBindBitmaps();
   }
+  // TODO: Do this before doing verification since the from space may have objects which weren't
+  // moved and point to dead objects.
   from_space_->Clear();
   // Protect the from space.
   VLOG(heap) << "Protecting space " << *from_space_;
index e44ec6a..64dafe7 100644 (file)
@@ -2403,9 +2403,11 @@ void Heap::PreSweepingGcVerification(collector::GarbageCollector* gc) {
       WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
       // Swapping bound bitmaps does nothing.
       gc->SwapBitmaps();
+      SwapSemiSpaces();
       if (!VerifyHeapReferences()) {
         LOG(FATAL) << "Pre sweeping " << gc->GetName() << " GC verification failed";
       }
+      SwapSemiSpaces();
       gc->SwapBitmaps();
     }
   }