summaryrefslogtreecommitdiff
path: root/src/card_table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/card_table.cc')
-rw-r--r--src/card_table.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/card_table.cc b/src/card_table.cc
index d442306b04..0eac91f44d 100644
--- a/src/card_table.cc
+++ b/src/card_table.cc
@@ -22,6 +22,7 @@
#include "heap_bitmap.h"
#include "logging.h"
#include "runtime.h"
+#include "space.h"
#include "utils.h"
namespace art {
@@ -80,6 +81,18 @@ CardTable* CardTable::Create(const byte* heap_begin, size_t heap_capacity) {
return new CardTable(mem_map.release(), biased_begin, offset);
}
+void CardTable::ClearNonImageSpaceCards(Heap* heap) {
+ // TODO: clear just the range of the table that has been modified
+ const std::vector<Space*>& spaces = heap->GetSpaces();
+ for (size_t i = 0; i < spaces.size(); ++i) {
+ if (!spaces[i]->IsImageSpace()) {
+ byte* card_start = CardFromAddr(spaces[i]->Begin());
+ byte* card_end = CardFromAddr(spaces[i]->End());
+ memset(reinterpret_cast<void*>(card_start), GC_CARD_CLEAN, card_end - card_start);
+ }
+ }
+}
+
void CardTable::ClearCardTable() {
// TODO: clear just the range of the table that has been modified
memset(mem_map_->Begin(), GC_CARD_CLEAN, mem_map_->Size());
@@ -97,8 +110,7 @@ void CardTable::CheckAddrIsInCardTable(const byte* addr) const {
}
}
-void CardTable::Scan(byte* heap_begin, byte* heap_end, Callback* visitor, void* arg) const {
- Heap* heap = Runtime::Current()->GetHeap();
+void CardTable::Scan(HeapBitmap* bitmap, byte* heap_begin, byte* heap_end, Callback* visitor, void* arg) const {
byte* card_cur = CardFromAddr(heap_begin);
byte* card_end = CardFromAddr(heap_end);
while (card_cur < card_end) {
@@ -113,7 +125,7 @@ void CardTable::Scan(byte* heap_begin, byte* heap_end, Callback* visitor, void*
}
if (run > 0) {
byte* run_end = &card_cur[run];
- heap->GetLiveBits()->VisitRange(reinterpret_cast<uintptr_t>(AddrFromCard(run_start)),
+ bitmap->VisitRange(reinterpret_cast<uintptr_t>(AddrFromCard(run_start)),
reinterpret_cast<uintptr_t>(AddrFromCard(run_end)),
visitor, arg);
}