summaryrefslogtreecommitdiff
path: root/runtime/class_linker-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/class_linker-inl.h')
-rw-r--r--runtime/class_linker-inl.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h
index 6951e35791..6461f54f5f 100644
--- a/runtime/class_linker-inl.h
+++ b/runtime/class_linker-inl.h
@@ -43,7 +43,8 @@ inline ObjPtr<mirror::Class> ClassLinker::FindArrayClass(Thread* self,
ObjPtr<mirror::Class> element_class) {
for (size_t i = 0; i < kFindArrayCacheSize; ++i) {
// Read the cached array class once to avoid races with other threads setting it.
- ObjPtr<mirror::Class> array_class = find_array_class_cache_[i].Read();
+ ObjPtr<mirror::Class> array_class =
+ find_array_class_cache_[i].load(std::memory_order_acquire).Read();
if (array_class != nullptr && array_class->GetComponentType() == element_class) {
return array_class;
}
@@ -57,7 +58,8 @@ inline ObjPtr<mirror::Class> ClassLinker::FindArrayClass(Thread* self,
if (array_class != nullptr) {
// Benign races in storing array class and incrementing index.
size_t victim_index = find_array_class_cache_next_victim_;
- find_array_class_cache_[victim_index] = GcRoot<mirror::Class>(array_class);
+ find_array_class_cache_[victim_index].store(GcRoot<mirror::Class>(array_class),
+ std::memory_order_release);
find_array_class_cache_next_victim_ = (victim_index + 1) % kFindArrayCacheSize;
} else {
// We should have a NoClassDefFoundError.