summaryrefslogtreecommitdiff
path: root/runtime/intern_table-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/intern_table-inl.h')
-rw-r--r--runtime/intern_table-inl.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/runtime/intern_table-inl.h b/runtime/intern_table-inl.h
index 8c7fb42952..84754fafb8 100644
--- a/runtime/intern_table-inl.h
+++ b/runtime/intern_table-inl.h
@@ -39,11 +39,15 @@ template <typename Visitor>
inline size_t InternTable::AddTableFromMemory(const uint8_t* ptr, const Visitor& visitor) {
size_t read_count = 0;
UnorderedSet set(ptr, /*make copy*/false, &read_count);
- // Visit the unordered set, may remove elements.
- visitor(set);
- if (!set.empty()) {
+ {
+ // Hold the lock while calling the visitor to prevent possible race
+ // conditions with another thread adding intern strings.
MutexLock mu(Thread::Current(), *Locks::intern_table_lock_);
- strong_interns_.AddInternStrings(std::move(set));
+ // Visit the unordered set, may remove elements.
+ visitor(set);
+ if (!set.empty()) {
+ strong_interns_.AddInternStrings(std::move(set));
+ }
}
return read_count;
}