diff options
| author | 2012-07-03 14:39:54 -0700 | |
|---|---|---|
| committer | 2012-07-03 16:00:15 -0700 | |
| commit | 61c9cb5ab3137bfd61d42bc6d38c2e3ba9110bd1 (patch) | |
| tree | 603d3aec101b188b5c48ad6c62f5a73eb9912675 | |
| parent | a8eed7df4a04d3a002a04f517efe46a7f9b5c603 (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.cc | 3 | ||||
| -rw-r--r-- | src/heap_test.cc | 7 |
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 |