diff options
author | Mathieu Chartier <mathieuc@google.com> | 2013-09-17 13:48:44 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-09-17 13:48:44 -0700 |
commit | 613eae4a6f75282c0737a84850418afcab54d4e8 (patch) | |
tree | 89e12ae679125df6cf83c9add1eb54e5a0ff8eb4 /runtime/intern_table.cc | |
parent | 2cedd474625e464b37b7e86e08ad06231e5fb148 (diff) | |
parent | 7def68e29cd4dc3e5e3d76b2ba5ee175871aff7e (diff) | |
download | art-613eae4a6f75282c0737a84850418afcab54d4e8.zip art-613eae4a6f75282c0737a84850418afcab54d4e8.tar.gz art-613eae4a6f75282c0737a84850418afcab54d4e8.tar.bz2 |
am 7def68e2: am c4621985: Fix race in root marking.
* commit '7def68e29cd4dc3e5e3d76b2ba5ee175871aff7e':
Fix race in root marking.
Diffstat (limited to 'runtime/intern_table.cc')
-rw-r--r-- | runtime/intern_table.cc | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/runtime/intern_table.cc b/runtime/intern_table.cc index e3a75cf..89c15f8 100644 --- a/runtime/intern_table.cc +++ b/runtime/intern_table.cc @@ -42,13 +42,15 @@ void InternTable::DumpForSigQuit(std::ostream& os) const { } void InternTable::VisitRoots(RootVisitor* visitor, void* arg, - bool clean_dirty) { + bool only_dirty, bool clean_dirty) { MutexLock mu(Thread::Current(), intern_table_lock_); - for (const auto& strong_intern : strong_interns_) { - visitor(strong_intern.second, arg); - } - if (clean_dirty) { - is_dirty_ = false; + if (!only_dirty || is_dirty_) { + for (const auto& strong_intern : strong_interns_) { + visitor(strong_intern.second, arg); + } + if (clean_dirty) { + is_dirty_ = false; + } } // Note: we deliberately don't visit the weak_interns_ table and the immutable // image roots. @@ -123,7 +125,7 @@ mirror::String* InternTable::Insert(mirror::String* s, bool is_strong) { } // Mark as dirty so that we rescan the roots. - Dirty(); + is_dirty_ = true; // Check the image for a match. mirror::String* image = LookupStringFromImage(s); |