diff options
author | 2013-08-03 14:02:57 -0700 | |
---|---|---|
committer | 2013-08-03 16:22:40 -0700 | |
commit | 184e322fe8ddd75c844a1eb2eb1ca32bc02f2d45 (patch) | |
tree | 341b6e63b2ec506c07d858d014f9a27fe44297fa | |
parent | 85affca81271f573c75c32316aa6faa8e52448b1 (diff) |
Disable and remove finger.
Finger is useless for multithreaded GC, removing it should provide a
slight speed up due to avoided comparison.
Change-Id: I7eb7abcbab8d3307807b1086c06d68b2d4bcd2e9
-rw-r--r-- | runtime/gc/accounting/card_table-inl.h | 11 | ||||
-rw-r--r-- | runtime/gc/accounting/card_table.h | 5 | ||||
-rw-r--r-- | runtime/gc/accounting/heap_bitmap-inl.h | 2 | ||||
-rw-r--r-- | runtime/gc/accounting/mod_union_table.cc | 11 | ||||
-rw-r--r-- | runtime/gc/accounting/space_bitmap-inl.h | 10 | ||||
-rw-r--r-- | runtime/gc/accounting/space_bitmap.h | 14 | ||||
-rw-r--r-- | runtime/gc/collector/mark_sweep.cc | 45 | ||||
-rw-r--r-- | runtime/gc/collector/mark_sweep.h | 10 | ||||
-rw-r--r-- | runtime/gc/collector/sticky_mark_sweep.cc | 1 | ||||
-rw-r--r-- | runtime/gc/heap.cc | 3 |
10 files changed, 33 insertions, 79 deletions
diff --git a/runtime/gc/accounting/card_table-inl.h b/runtime/gc/accounting/card_table-inl.h index f8f2773582..fb0f61b3b2 100644 --- a/runtime/gc/accounting/card_table-inl.h +++ b/runtime/gc/accounting/card_table-inl.h @@ -41,10 +41,9 @@ static inline bool byte_cas(byte old_value, byte new_value, byte* address) { return success; } -template <typename Visitor, typename FingerVisitor> +template <typename Visitor> inline void CardTable::Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_end, - const Visitor& visitor, const FingerVisitor& finger_visitor, - const byte minimum_age) const { + const Visitor& visitor, const byte minimum_age) const { DCHECK(bitmap->HasAddress(scan_begin)); DCHECK(bitmap->HasAddress(scan_end - 1)); // scan_end is the byte after the last byte we scan. byte* card_cur = CardFromAddr(scan_begin); @@ -57,7 +56,7 @@ inline void CardTable::Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_en if (*card_cur >= minimum_age) { uintptr_t start = reinterpret_cast<uintptr_t>(AddrFromCard(card_cur)); uintptr_t end = start + kCardSize; - bitmap->VisitMarkedRange(start, end, visitor, finger_visitor); + bitmap->VisitMarkedRange(start, end, visitor); } ++card_cur; } @@ -87,7 +86,7 @@ inline void CardTable::Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_en << "card " << static_cast<size_t>(card_byte) << " word " << (start_word & 0xFF); uintptr_t start = reinterpret_cast<uintptr_t>(AddrFromCard(card)); uintptr_t end = start + kCardSize; - bitmap->VisitMarkedRange(start, end, visitor, finger_visitor); + bitmap->VisitMarkedRange(start, end, visitor); } start_word >>= 8; } @@ -100,7 +99,7 @@ inline void CardTable::Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_en if (*card_cur >= minimum_age) { uintptr_t start = reinterpret_cast<uintptr_t>(AddrFromCard(card_cur)); uintptr_t end = start + kCardSize; - bitmap->VisitMarkedRange(start, end, visitor, finger_visitor); + bitmap->VisitMarkedRange(start, end, visitor); } ++card_cur; } diff --git a/runtime/gc/accounting/card_table.h b/runtime/gc/accounting/card_table.h index 1acaf5bdfc..f03062607d 100644 --- a/runtime/gc/accounting/card_table.h +++ b/runtime/gc/accounting/card_table.h @@ -101,9 +101,8 @@ class CardTable { // For every dirty at least minumum age between begin and end invoke the visitor with the // specified argument. - template <typename Visitor, typename FingerVisitor> - void Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_end, - const Visitor& visitor, const FingerVisitor& finger_visitor, + template <typename Visitor> + void Scan(SpaceBitmap* bitmap, byte* scan_begin, byte* scan_end, const Visitor& visitor, const byte minimum_age = kCardDirty) const EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/gc/accounting/heap_bitmap-inl.h b/runtime/gc/accounting/heap_bitmap-inl.h index f6cf2b53ea..0524ccb69c 100644 --- a/runtime/gc/accounting/heap_bitmap-inl.h +++ b/runtime/gc/accounting/heap_bitmap-inl.h @@ -30,7 +30,7 @@ inline void HeapBitmap::Visit(const Visitor& visitor) { for (It it = continuous_space_bitmaps_.begin(), end = continuous_space_bitmaps_.end(); it != end; ++it) { SpaceBitmap* bitmap = *it; - bitmap->VisitMarkedRange(bitmap->HeapBegin(), bitmap->HeapLimit(), visitor, VoidFunctor()); + bitmap->VisitMarkedRange(bitmap->HeapBegin(), bitmap->HeapLimit(), visitor); } // TODO: C++0x auto typedef SpaceSetMapVector::iterator It2; diff --git a/runtime/gc/accounting/mod_union_table.cc b/runtime/gc/accounting/mod_union_table.cc index 718dcf0369..0363acb477 100644 --- a/runtime/gc/accounting/mod_union_table.cc +++ b/runtime/gc/accounting/mod_union_table.cc @@ -261,7 +261,7 @@ void ModUnionTableReferenceCache::Verify() { space::ContinuousSpace* space = heap->FindContinuousSpaceFromObject(reinterpret_cast<Object*>(start), false); SpaceBitmap* live_bitmap = space->GetLiveBitmap(); - live_bitmap->VisitMarkedRange(start, end, visitor, VoidFunctor()); + live_bitmap->VisitMarkedRange(start, end, visitor); } } } @@ -307,12 +307,11 @@ void ModUnionTableReferenceCache::Update() { uintptr_t end = start + CardTable::kCardSize; SpaceBitmap* live_bitmap = heap->FindContinuousSpaceFromObject(reinterpret_cast<Object*>(start), false)->GetLiveBitmap(); - live_bitmap->VisitMarkedRange(start, end, visitor, VoidFunctor()); + live_bitmap->VisitMarkedRange(start, end, visitor); // Update the corresponding references for the card. // TODO: C++0x auto - SafeMap<const byte*, std::vector<const Object*> >::iterator - found = references_.find(card); + SafeMap<const byte*, std::vector<const Object*> >::iterator found = references_.find(card); if (found == references_.end()) { if (cards_references.empty()) { // No reason to add empty array. @@ -364,7 +363,7 @@ void ModUnionTableCardCache::MarkReferences(collector::MarkSweep* mark_sweep) { space::ContinuousSpace* cur_space = heap_->FindContinuousSpaceFromObject(reinterpret_cast<Object*>(start), false); accounting::SpaceBitmap* cur_live_bitmap = cur_space->GetLiveBitmap(); - cur_live_bitmap->VisitMarkedRange(start, end, visitor, VoidFunctor()); + cur_live_bitmap->VisitMarkedRange(start, end, visitor); for (++it; it != cc_end; ++it) { card = *it; start = reinterpret_cast<uintptr_t>(card_table->AddrFromCard(card)); @@ -373,7 +372,7 @@ void ModUnionTableCardCache::MarkReferences(collector::MarkSweep* mark_sweep) { cur_space = heap_->FindContinuousSpaceFromObject(reinterpret_cast<Object*>(start), false); cur_live_bitmap = cur_space->GetLiveBitmap(); } - cur_live_bitmap->VisitMarkedRange(start, end, visitor, VoidFunctor()); + cur_live_bitmap->VisitMarkedRange(start, end, visitor); } } } diff --git a/runtime/gc/accounting/space_bitmap-inl.h b/runtime/gc/accounting/space_bitmap-inl.h index a4cfe3c567..1dde18da4a 100644 --- a/runtime/gc/accounting/space_bitmap-inl.h +++ b/runtime/gc/accounting/space_bitmap-inl.h @@ -53,13 +53,10 @@ inline bool SpaceBitmap::Test(const mirror::Object* obj) const { return (bitmap_begin_[OffsetToIndex(offset)] & OffsetToMask(offset)) != 0; } -template <typename Visitor, typename FingerVisitor> +template <typename Visitor> void SpaceBitmap::VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, - const Visitor& visitor, - const FingerVisitor& finger_visitor) const { + const Visitor& visitor) const { DCHECK_LT(visit_begin, visit_end); - - const size_t word_span = kAlignment * kBitsPerWord; // Equals IndexToOffset(1). const size_t bit_index_start = (visit_begin - heap_begin_) / kAlignment; const size_t bit_index_end = (visit_end - heap_begin_ - 1) / kAlignment; @@ -79,7 +76,6 @@ void SpaceBitmap::VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, // If word_start == word_end then handle this case at the same place we handle the right edge. if (edge_word != 0 && word_start < word_end) { uintptr_t ptr_base = IndexToOffset(word_start) + heap_begin_; - finger_visitor(reinterpret_cast<void*>(ptr_base + word_span)); do { const size_t shift = CLZ(edge_word); mirror::Object* obj = reinterpret_cast<mirror::Object*>(ptr_base + shift * kAlignment); @@ -93,7 +89,6 @@ void SpaceBitmap::VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, size_t w = bitmap_begin_[i]; if (w != 0) { uintptr_t ptr_base = IndexToOffset(i) + heap_begin_; - finger_visitor(reinterpret_cast<void*>(ptr_base + word_span)); do { const size_t shift = CLZ(w); mirror::Object* obj = reinterpret_cast<mirror::Object*>(ptr_base + shift * kAlignment); @@ -114,7 +109,6 @@ void SpaceBitmap::VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, // Bits that we trim off the right. edge_word &= ~((static_cast<size_t>(kWordHighBitMask) >> right_bits) - 1); uintptr_t ptr_base = IndexToOffset(word_end) + heap_begin_; - finger_visitor(reinterpret_cast<void*>(ptr_base + word_span)); while (edge_word != 0) { const size_t shift = CLZ(edge_word); mirror::Object* obj = reinterpret_cast<mirror::Object*>(ptr_base + shift * kAlignment); diff --git a/runtime/gc/accounting/space_bitmap.h b/runtime/gc/accounting/space_bitmap.h index 674c2621a0..26ab1ded96 100644 --- a/runtime/gc/accounting/space_bitmap.h +++ b/runtime/gc/accounting/space_bitmap.h @@ -118,9 +118,8 @@ class SpaceBitmap { } } - template <typename Visitor, typename FingerVisitor> - void VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, - const Visitor& visitor, const FingerVisitor& finger_visitor) const + template <typename Visitor> + void VisitMarkedRange(uintptr_t visit_begin, uintptr_t visit_end, const Visitor& visitor) const EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -130,10 +129,8 @@ class SpaceBitmap { void InOrderWalk(Callback* callback, void* arg) SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); - static void SweepWalk(const SpaceBitmap& live, - const SpaceBitmap& mark, - uintptr_t base, uintptr_t max, - SweepCallback* thunk, void* arg); + static void SweepWalk(const SpaceBitmap& live, const SpaceBitmap& mark, uintptr_t base, + uintptr_t max, SweepCallback* thunk, void* arg); void CopyFrom(SpaceBitmap* source_bitmap); @@ -179,7 +176,8 @@ class SpaceBitmap { private: // TODO: heap_end_ is initialized so that the heap bitmap is empty, this doesn't require the -1, // however, we document that this is expected on heap_end_ - SpaceBitmap(const std::string& name, MemMap* mem_map, word* bitmap_begin, size_t bitmap_size, const void* heap_begin) + SpaceBitmap(const std::string& name, MemMap* mem_map, word* bitmap_begin, size_t bitmap_size, + const void* heap_begin) : mem_map_(mem_map), bitmap_begin_(bitmap_begin), bitmap_size_(bitmap_size), heap_begin_(reinterpret_cast<uintptr_t>(heap_begin)), name_(name) {} diff --git a/runtime/gc/collector/mark_sweep.cc b/runtime/gc/collector/mark_sweep.cc index 89c768a34e..bf3e3f02ba 100644 --- a/runtime/gc/collector/mark_sweep.cc +++ b/runtime/gc/collector/mark_sweep.cc @@ -71,18 +71,6 @@ static const bool kMeasureOverhead = false; static const bool kCountTasks = false; static const bool kCountJavaLangRefs = false; -class SetFingerVisitor { - public: - explicit SetFingerVisitor(MarkSweep* const mark_sweep) : mark_sweep_(mark_sweep) {} - - void operator()(void* finger) const { - mark_sweep_->SetFinger(reinterpret_cast<Object*>(finger)); - } - - private: - MarkSweep* const mark_sweep_; -}; - void MarkSweep::ImmuneSpace(space::ContinuousSpace* space) { // Bind live to mark bitmap if necessary. if (space->GetLiveBitmap() != space->GetMarkBitmap()) { @@ -139,7 +127,6 @@ MarkSweep::MarkSweep(Heap* heap, bool is_concurrent, const std::string& name_pre current_mark_bitmap_(NULL), java_lang_Class_(NULL), mark_stack_(NULL), - finger_(NULL), immune_begin_(NULL), immune_end_(NULL), soft_reference_list_(NULL), @@ -159,7 +146,6 @@ void MarkSweep::InitializePhase() { timings_.StartSplit("InitializePhase"); mark_stack_ = GetHeap()->mark_stack_.get(); DCHECK(mark_stack_ != NULL); - finger_ = NULL; SetImmuneRange(NULL, NULL); soft_reference_list_ = NULL; weak_reference_list_ = NULL; @@ -278,7 +264,6 @@ void MarkSweep::MarkReachableObjects() { live_stack->Reset(); // Recursively mark all the non-image bits set in the mark bitmap. RecursiveMark(); - DisableFinger(); } void MarkSweep::ReclaimPhase() { @@ -351,11 +336,9 @@ void MarkSweep::ExpandMarkStack() { inline void MarkSweep::MarkObjectNonNullParallel(const Object* obj, bool check_finger) { DCHECK(obj != NULL); if (MarkObjectParallel(obj)) { - if (kDisableFinger || (check_finger && obj < finger_)) { - while (UNLIKELY(!mark_stack_->AtomicPushBack(const_cast<Object*>(obj)))) { - // Only reason a push can fail is that the mark stack is full. - ExpandMarkStack(); - } + while (UNLIKELY(!mark_stack_->AtomicPushBack(const_cast<Object*>(obj)))) { + // Only reason a push can fail is that the mark stack is full. + ExpandMarkStack(); } } } @@ -384,14 +367,12 @@ inline void MarkSweep::MarkObjectNonNull(const Object* obj, bool check_finger) { // This object was not previously marked. if (!object_bitmap->Test(obj)) { object_bitmap->Set(obj); - if (kDisableFinger || (check_finger && obj < finger_)) { - // Do we need to expand the mark stack? - if (UNLIKELY(mark_stack_->Size() >= mark_stack_->Capacity())) { - ExpandMarkStack(); - } - // The object must be pushed on to the mark stack. - mark_stack_->PushBack(const_cast<Object*>(obj)); + // Do we need to expand the mark stack? + if (UNLIKELY(mark_stack_->Size() >= mark_stack_->Capacity())) { + ExpandMarkStack(); } + // The object must be pushed on to the mark stack. + mark_stack_->PushBack(const_cast<Object*>(obj)); } } @@ -582,7 +563,6 @@ void MarkSweep::ScanGrayObjects(byte minimum_age) { accounting::CardTable* card_table = GetHeap()->GetCardTable(); const std::vector<space::ContinuousSpace*>& spaces = GetHeap()->GetContinuousSpaces(); ScanObjectVisitor visitor(this); - SetFingerVisitor finger_visitor(this); // TODO: C++0x typedef std::vector<space::ContinuousSpace*>::const_iterator It; for (It it = spaces.begin(), space_end = spaces.end(); it != space_end; ++it) { @@ -602,7 +582,7 @@ void MarkSweep::ScanGrayObjects(byte minimum_age) { byte* end = space->End(); // Image spaces are handled properly since live == marked for them. accounting::SpaceBitmap* mark_bitmap = space->GetMarkBitmap(); - card_table->Scan(mark_bitmap, begin, end, visitor, finger_visitor, minimum_age); + card_table->Scan(mark_bitmap, begin, end, visitor, minimum_age); } } @@ -637,7 +617,7 @@ void MarkSweep::VerifyImageRoots() { uintptr_t end = reinterpret_cast<uintptr_t>(space->End()); accounting::SpaceBitmap* live_bitmap = space->GetLiveBitmap(); DCHECK(live_bitmap != NULL); - live_bitmap->VisitMarkedRange(begin, end, visitor, VoidFunctor()); + live_bitmap->VisitMarkedRange(begin, end, visitor); } } } @@ -655,10 +635,8 @@ void MarkSweep::RecursiveMark() { CHECK(cleared_reference_list_ == NULL); const bool partial = GetGcType() == kGcTypePartial; - SetFingerVisitor set_finger_visitor(this); ScanObjectVisitor scan_visitor(this); if (!kDisableFinger) { - finger_ = NULL; const std::vector<space::ContinuousSpace*>& spaces = GetHeap()->GetContinuousSpaces(); // TODO: C++0x typedef std::vector<space::ContinuousSpace*>::const_iterator It; @@ -674,11 +652,10 @@ void MarkSweep::RecursiveMark() { // This function does not handle heap end increasing, so we must use the space end. uintptr_t begin = reinterpret_cast<uintptr_t>(space->Begin()); uintptr_t end = reinterpret_cast<uintptr_t>(space->End()); - current_mark_bitmap_->VisitMarkedRange(begin, end, scan_visitor, set_finger_visitor); + current_mark_bitmap_->VisitMarkedRange(begin, end, scan_visitor); } } } - DisableFinger(); timings_.NewSplit("ProcessMarkStack"); ProcessMarkStack(); } diff --git a/runtime/gc/collector/mark_sweep.h b/runtime/gc/collector/mark_sweep.h index d386fd6a64..0e9683696c 100644 --- a/runtime/gc/collector/mark_sweep.h +++ b/runtime/gc/collector/mark_sweep.h @@ -167,14 +167,6 @@ class MarkSweep : public GarbageCollector { void ScanObjectVisit(const mirror::Object* obj, const MarkVisitor& visitor) NO_THREAD_SAFETY_ANALYSIS; - void SetFinger(mirror::Object* new_finger) { - finger_ = new_finger; - } - - void DisableFinger() { - SetFinger(reinterpret_cast<mirror::Object*>(~static_cast<uintptr_t>(0))); - } - size_t GetFreedBytes() const { return freed_bytes_; } @@ -386,8 +378,6 @@ class MarkSweep : public GarbageCollector { accounting::ObjectStack* mark_stack_; - mirror::Object* finger_; - // Immune range, every object inside the immune range is assumed to be marked. mirror::Object* immune_begin_; mirror::Object* immune_end_; diff --git a/runtime/gc/collector/sticky_mark_sweep.cc b/runtime/gc/collector/sticky_mark_sweep.cc index 71e580d748..5505336478 100644 --- a/runtime/gc/collector/sticky_mark_sweep.cc +++ b/runtime/gc/collector/sticky_mark_sweep.cc @@ -51,7 +51,6 @@ void StickyMarkSweep::BindBitmaps() { } void StickyMarkSweep::MarkReachableObjects() { - DisableFinger(); RecursiveMarkDirtyObjects(accounting::CardTable::kCardDirty - 1); } diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index 3cc60d994b..d27290b5e9 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -1258,8 +1258,7 @@ class VerifyReferenceVisitor { ScanVisitor scan_visitor; byte* byte_cover_begin = reinterpret_cast<byte*>(card_table->AddrFromCard(card_addr)); card_table->Scan(bitmap, byte_cover_begin, - byte_cover_begin + accounting::CardTable::kCardSize, - scan_visitor, VoidFunctor()); + byte_cover_begin + accounting::CardTable::kCardSize, scan_visitor); // Search to see if any of the roots reference our object. void* arg = const_cast<void*>(reinterpret_cast<const void*>(obj)); |