summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Light <allight@google.com> 2019-11-20 13:49:19 -0800
committer Alex Light <allight@google.com> 2019-11-21 00:38:16 +0000
commite61f16af3976ca8c0ab82cd3f21e5dff66225520 (patch)
tree4eb932e907b165f267755549361db870d1b51778
parent55d9aaad5d5ec9729ce7522eb88b0c69a0b3342d (diff)
Add missing WriteBarrier on VisitReflectiveTargets
We weren't performing write-barriers during VisitReflectiveTargets. This could lead to incorrect marking. Test: ./test.py --host --gcstress Change-Id: I153f319e257675d83cae6ec25e041cbddecf1a94
-rw-r--r--runtime/mirror/dex_cache.cc7
-rw-r--r--runtime/mirror/executable-inl.h1
-rw-r--r--runtime/mirror/field.cc2
3 files changed, 10 insertions, 0 deletions
diff --git a/runtime/mirror/dex_cache.cc b/runtime/mirror/dex_cache.cc
index 96fc403690..dba2860606 100644
--- a/runtime/mirror/dex_cache.cc
+++ b/runtime/mirror/dex_cache.cc
@@ -31,6 +31,7 @@
#include "string.h"
#include "thread.h"
#include "utils/dex_cache_arrays_layout-inl.h"
+#include "write_barrier.h"
namespace art {
namespace mirror {
@@ -174,6 +175,7 @@ void DexCache::InitializeDexCache(Thread* self,
}
void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) {
+ bool wrote = false;
for (size_t i = 0; i < NumResolvedFields(); i++) {
auto pair(GetNativePairPtrSize(GetResolvedFields(), i, kRuntimePointerSize));
if (pair.index == FieldDexCachePair::InvalidIndexForSlot(i)) {
@@ -188,6 +190,7 @@ void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) {
pair.object = new_val;
}
SetNativePairPtrSize(GetResolvedFields(), i, pair, kRuntimePointerSize);
+ wrote = true;
}
}
for (size_t i = 0; i < NumResolvedMethods(); i++) {
@@ -204,8 +207,12 @@ void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) {
pair.object = new_val;
}
SetNativePairPtrSize(GetResolvedMethods(), i, pair, kRuntimePointerSize);
+ wrote = true;
}
}
+ if (wrote) {
+ WriteBarrier::ForEveryFieldWrite(this);
+ }
}
bool DexCache::AddPreResolvedStringsArray() {
diff --git a/runtime/mirror/executable-inl.h b/runtime/mirror/executable-inl.h
index f2d684a3d5..77669dace8 100644
--- a/runtime/mirror/executable-inl.h
+++ b/runtime/mirror/executable-inl.h
@@ -47,6 +47,7 @@ inline void Executable::VisitTarget(ReflectiveValueVisitor* v) {
SetArtMethod(new_target);
SetDexMethodIndex(new_target->GetDexMethodIndex());
SetDeclaringClass(new_target->GetDeclaringClass());
+ WriteBarrier::ForEveryFieldWrite(this);
}
}
diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc
index aa071a8a8c..9e566b5ae1 100644
--- a/runtime/mirror/field.cc
+++ b/runtime/mirror/field.cc
@@ -20,6 +20,7 @@
#include "dex_cache-inl.h"
#include "object-inl.h"
#include "object_array-inl.h"
+#include "write_barrier.h"
namespace art {
namespace mirror {
@@ -32,6 +33,7 @@ void Field::VisitTarget(ReflectiveValueVisitor* v) {
SetDexFieldIndex<false>(new_value->GetDexFieldIndex());
SetOffset<false>(new_value->GetOffset().Int32Value());
SetDeclaringClass<false>(new_value->GetDeclaringClass());
+ WriteBarrier::ForEveryFieldWrite(this);
}
DCHECK_EQ(new_value, GetArtField(/*use_dex_cache*/false));
}