summaryrefslogtreecommitdiffstats
path: root/runtime/intern_table.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2013-09-17 13:48:44 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-09-17 13:48:44 -0700
commit613eae4a6f75282c0737a84850418afcab54d4e8 (patch)
tree89e12ae679125df6cf83c9add1eb54e5a0ff8eb4 /runtime/intern_table.cc
parent2cedd474625e464b37b7e86e08ad06231e5fb148 (diff)
parent7def68e29cd4dc3e5e3d76b2ba5ee175871aff7e (diff)
downloadart-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.cc16
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);