Each space has its own bitmap(s)

Each alloc space now has One mark+live bitmap. Each image space has only one live bitmap.

Change-Id: I2e919d1bd7d9f4d35d0e95ed83a58df6f754df6e
diff --git a/src/image_writer.cc b/src/image_writer.cc
index 589d3d7..59b7e80 100644
--- a/src/image_writer.cc
+++ b/src/image_writer.cc
@@ -52,7 +52,7 @@
   image_begin_ = reinterpret_cast<byte*>(image_begin);
 
   Heap* heap = Runtime::Current()->GetHeap();
-  source_space_ = heap->GetAllocSpace();
+  const Spaces& spaces = heap->GetSpaces();
 
   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
   const std::vector<DexCache*>& all_dex_caches = class_linker->GetDexCaches();
@@ -75,7 +75,14 @@
   ComputeLazyFieldsForImageClasses();  // Add useful information
   ComputeEagerResolvedStrings();
   heap->CollectGarbage(false);  // Remove garbage
-  heap->GetAllocSpace()->Trim();  // Trim size of source_space
+  // Trim size of alloc spaces
+  // TODO: C++0x auto
+  for (Spaces::const_iterator cur = spaces.begin(); cur != spaces.end(); ++cur) {
+    if ((*cur)->IsAllocSpace()) {
+      (*cur)->AsAllocSpace()->Trim();
+    }
+  }
+
   if (!AllocMemory()) {
     return false;
   }
@@ -104,8 +111,27 @@
   return true;
 }
 
+bool ImageWriter::InSourceSpace(const Object* object) const {
+  const Spaces& spaces = Runtime::Current()->GetHeap()->GetSpaces();
+  // TODO: C++0x auto
+  for (Spaces::const_iterator cur = spaces.begin(); cur != spaces.end(); ++cur) {
+    if ((*cur)->IsAllocSpace() && (*cur)->Contains(object)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 bool ImageWriter::AllocMemory() {
-  size_t size = source_space_->Size();
+  typedef std::vector<Space*> SpaceVec;
+  const SpaceVec& spaces = Runtime::Current()->GetHeap()->GetSpaces();
+  size_t size = 0;
+  for (SpaceVec::const_iterator cur = spaces.begin(); cur != spaces.end(); ++cur) {
+    if ((*cur)->IsAllocSpace()) {
+      size += (*cur)->Size();
+    }
+  }
+
   int prot = PROT_READ | PROT_WRITE;
   size_t length = RoundUp(size, kPageSize);
   image_.reset(MemMap::MapAnonymous("image-writer-image", NULL, length, prot));
@@ -151,9 +177,8 @@
 }
 
 void ImageWriter::ComputeEagerResolvedStrings() {
-  HeapBitmap* heap_bitmap = Runtime::Current()->GetHeap()->GetLiveBits();
-  DCHECK(heap_bitmap != NULL);
-  heap_bitmap->Walk(ComputeEagerResolvedStringsCallback, this);  // TODO: add Space-limited Walk
+  // TODO: Check image spaces only?
+  Runtime::Current()->GetHeap()->GetLiveBitmap()->Walk(ComputeEagerResolvedStringsCallback, this);
 }
 
 bool ImageWriter::IsImageClass(const Class* klass) {
@@ -232,7 +257,8 @@
   if (image_classes_ == NULL) {
     return;
   }
-  Runtime::Current()->GetHeap()->GetLiveBits()->Walk(CheckNonImageClassesRemovedCallback, this);
+
+  Runtime::Current()->GetHeap()->GetLiveBitmap()->Walk(CheckNonImageClassesRemovedCallback, this);
 }
 
 void ImageWriter::CheckNonImageClassesRemovedCallback(Object* obj, void* arg) {
@@ -332,16 +358,21 @@
 void ImageWriter::CalculateNewObjectOffsets() {
   SirtRef<ObjectArray<Object> > image_roots(CreateImageRoots());
 
-  HeapBitmap* heap_bitmap = Runtime::Current()->GetHeap()->GetLiveBits();
-  DCHECK(heap_bitmap != NULL);
+  Heap* heap = Runtime::Current()->GetHeap();
+  typedef std::vector<Space*> SpaceVec;
+  const SpaceVec& spaces = heap->GetSpaces();
+  DCHECK(!spaces.empty());
   DCHECK_EQ(0U, image_end_);
 
   // leave space for the header, but do not write it yet, we need to
   // know where image_roots is going to end up
   image_end_ += RoundUp(sizeof(ImageHeader), 8); // 64-bit-alignment
 
-  heap_bitmap->InOrderWalk(CalculateNewObjectOffsetsCallback, this);  // TODO: add Space-limited Walk
-  DCHECK_LT(image_end_, image_->Size());
+  // TODO: Image spaces only?
+  for (SpaceVec::const_iterator cur = spaces.begin(); cur != spaces.end(); ++cur) {
+    (*cur)->GetLiveBitmap()->InOrderWalk(CalculateNewObjectOffsetsCallback, this);
+    DCHECK_LT(image_end_, image_->Size());
+  }
 
   // Note that image_top_ is left at end of used space
   oat_begin_ = image_begin_ +  RoundUp(image_end_, kPageSize);
@@ -358,11 +389,10 @@
 
 void ImageWriter::CopyAndFixupObjects() {
   Heap* heap = Runtime::Current()->GetHeap();
-  HeapBitmap* heap_bitmap = heap->GetLiveBits();
-  DCHECK(heap_bitmap != NULL);
   // TODO: heap validation can't handle this fix up pass
   heap->DisableObjectValidation();
-  heap_bitmap->Walk(CopyAndFixupObjectsCallback, this);  // TODO: add Space-limited Walk
+  // TODO: Image spaces only?
+  heap->GetLiveBitmap()->Walk(CopyAndFixupObjectsCallback, this);
 }
 
 void ImageWriter::CopyAndFixupObjectsCallback(Object* object, void* arg) {