summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2012-07-03 14:39:54 -0700
committer Mathieu Chartier <mathieuc@google.com> 2012-07-03 16:00:15 -0700
commit61c9cb5ab3137bfd61d42bc6d38c2e3ba9110bd1 (patch)
tree603d3aec101b188b5c48ad6c62f5a73eb9912675
parenta8eed7df4a04d3a002a04f517efe46a7f9b5c603 (diff)
Fix heap bitmap rounding down size error
Fixed an error where we rounded down heap bitmap sizes which resulted in occasional check failures when we modified/tested bits belonging to objects near the end of the heap. Added a regression test for this fix. Change-Id: If061a26436beacee235ef74f9b39d05e66204bde
-rw-r--r--src/heap_bitmap.cc3
-rw-r--r--src/heap_test.cc7
2 files changed, 9 insertions, 1 deletions
diff --git a/src/heap_bitmap.cc b/src/heap_bitmap.cc
index 769ee9d602..fc722f5dd4 100644
--- a/src/heap_bitmap.cc
+++ b/src/heap_bitmap.cc
@@ -24,7 +24,8 @@ namespace art {
HeapBitmap* HeapBitmap::Create(const char* name, byte* heap_begin, size_t heap_capacity) {
CHECK(heap_begin != NULL);
- size_t bitmap_size = HB_OFFSET_TO_INDEX(heap_capacity) * kWordSize;
+ // Round up since heap_capacity is not necessarily a multiple of kAlignment * kBitsPerWord.
+ size_t bitmap_size = HB_OFFSET_TO_INDEX(RoundUp(heap_capacity, kAlignment * kBitsPerWord)) * kWordSize;
UniquePtr<MemMap> mem_map(MemMap::MapAnonymous(name, NULL, bitmap_size, PROT_READ | PROT_WRITE));
if (mem_map.get() == NULL) {
LOG(ERROR) << "Failed to allocate bitmap " << name;
diff --git a/src/heap_test.cc b/src/heap_test.cc
index 0077a772ac..d5c07dafc2 100644
--- a/src/heap_test.cc
+++ b/src/heap_test.cc
@@ -45,4 +45,11 @@ TEST_F(HeapTest, GarbageCollectClassLinkerInit) {
Runtime::Current()->GetHeap()->CollectGarbage(false);
}
+TEST_F(HeapTest, HeapBitmapCapacityTest) {
+ byte* heap_begin = reinterpret_cast<byte*>(0x1000);
+ const size_t heap_capacity = HeapBitmap::kAlignment * (sizeof(intptr_t) * 8 + 1);
+ UniquePtr<HeapBitmap> bitmap(HeapBitmap::Create("test-bitmap", heap_begin, heap_capacity));
+ bitmap->Set(reinterpret_cast<const Object*>(&heap_begin[heap_capacity - HeapBitmap::kAlignment]));
+}
+
} // namespace art