From 6aa3df965395566ed6a4fec4af37c2b7577992e9 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 17 Sep 2013 15:17:28 -0700 Subject: Refactor system weak sweeping, add support for modification. Required for moving collectors. Change-Id: Ib97ba4a05af1139f8d388077a15e62bcb9534855 --- runtime/intern_table.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'runtime/intern_table.cc') diff --git a/runtime/intern_table.cc b/runtime/intern_table.cc index 6b0a51b..cfed9ab 100644 --- a/runtime/intern_table.cc +++ b/runtime/intern_table.cc @@ -194,14 +194,16 @@ bool InternTable::ContainsWeak(mirror::String* s) { return found == s; } -void InternTable::SweepInternTableWeaks(IsMarkedTester is_marked, void* arg) { +void InternTable::SweepInternTableWeaks(RootVisitor visitor, void* arg) { MutexLock mu(Thread::Current(), intern_table_lock_); - // TODO: std::remove_if + lambda. for (auto it = weak_interns_.begin(), end = weak_interns_.end(); it != end;) { mirror::Object* object = it->second; - if (!is_marked(object, arg)) { + mirror::Object* new_object = visitor(object, arg); + if (new_object == nullptr) { + // TODO: use it = weak_interns_.erase(it) when we get a c++11 stl. weak_interns_.erase(it++); } else { + it->second = down_cast(new_object); ++it; } } -- cgit v1.1