Refactor WriteBarrier logic into its own file
Refactor write barrier logic to have the null check logic in the
barrier if possible.
Moved the logic into its own file.
Test: test-art-host
Change-Id: I8292cd7f01dbdddea7aeab6e01da4d309ab452fe
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index c374e03..7e55972 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -2528,7 +2528,7 @@
old = result_ptr; // For the comparison below, after releasing the lock.
if (descriptor_equals) {
class_table->InsertWithHash(result_ptr, hash);
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(class_loader.Get());
+ WriteBarrier::ForEveryFieldWrite(class_loader.Get());
} // else throw below, after releasing the lock.
}
}
@@ -3143,7 +3143,7 @@
DCHECK_EQ(klass->NumInstanceFields(), num_ifields);
}
// Ensure that the card is marked so that remembered sets pick up native roots.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(klass.Get());
+ WriteBarrier::ForEveryFieldWrite(klass.Get());
self->AllowThreadSuspension();
}
@@ -3330,7 +3330,7 @@
if (class_loader != nullptr) {
// Since we added a strong root to the class table, do the write barrier as required for
// remembered sets and generational GCs.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(class_loader);
+ WriteBarrier::ForEveryFieldWrite(class_loader);
}
dex_caches_.push_back(data);
}
@@ -3390,7 +3390,7 @@
if (h_class_loader.Get() != nullptr) {
// Since we added a strong root to the class table, do the write barrier as required for
// remembered sets and generational GCs.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(h_class_loader.Get());
+ WriteBarrier::ForEveryFieldWrite(h_class_loader.Get());
}
}
@@ -3461,7 +3461,7 @@
if (h_class_loader.Get() != nullptr) {
// Since we added a strong root to the class table, do the write barrier as required for
// remembered sets and generational GCs.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(h_class_loader.Get());
+ WriteBarrier::ForEveryFieldWrite(h_class_loader.Get());
}
return h_dex_cache.Get();
}
@@ -3761,7 +3761,7 @@
class_table->InsertWithHash(klass, hash);
if (class_loader != nullptr) {
// This is necessary because we need to have the card dirtied for remembered sets.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(class_loader);
+ WriteBarrier::ForEveryFieldWrite(class_loader);
}
if (log_new_roots_) {
new_class_roots_.push_back(GcRoot<mirror::Class>(klass));
@@ -3791,7 +3791,7 @@
klass->NumDirectMethods(),
klass->NumDeclaredVirtualMethods());
// Need to mark the card so that the remembered sets and mod union tables get updated.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(klass);
+ WriteBarrier::ForEveryFieldWrite(klass);
}
ObjPtr<mirror::Class> ClassLinker::LookupClass(Thread* self,
@@ -5195,7 +5195,7 @@
// Make sure the remembered set and mod-union tables know that we updated some of the native
// roots.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(new_class);
+ WriteBarrier::ForEveryFieldWrite(new_class);
}
void ClassLinker::RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
@@ -5353,7 +5353,7 @@
if (class_loader != nullptr) {
// We updated the class in the class table, perform the write barrier so that the GC knows
// about the change.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(class_loader);
+ WriteBarrier::ForEveryFieldWrite(class_loader);
}
CHECK_EQ(existing, klass.Get());
if (log_new_roots_) {
@@ -8760,7 +8760,7 @@
if (table->InsertStrongRoot(dex_file) && class_loader != nullptr) {
// It was not already inserted, perform the write barrier to let the GC know the class loader's
// class table was modified.
- Runtime::Current()->GetHeap()->WriteBarrierEveryFieldOf(class_loader);
+ WriteBarrier::ForEveryFieldWrite(class_loader);
}
}