diff options
Diffstat (limited to 'runtime/intern_table-inl.h')
-rw-r--r-- | runtime/intern_table-inl.h | 12 |
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; } |