Do not allow read barriers with null Thread::Current().
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 263926990
Change-Id: Ic78cf3d72b97b3b0f2dae0c29c19a82100ca7ed8
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 22c07a7..72fce00 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -2638,6 +2638,14 @@
DCHECK_EQ(base_diff64, 0);
}
+ // While `Thread::Current()` is null, the `ScopedDebugDisallowReadBarriers`
+ // cannot be used but the class `ReadBarrier` shall not allow read barriers anyway.
+ // For some gtests we actually have an initialized `Thread:Current()`.
+ std::optional<ScopedDebugDisallowReadBarriers> sddrb(std::nullopt);
+ if (kCheckDebugDisallowReadBarrierCount && Thread::Current() != nullptr) {
+ sddrb.emplace(Thread::Current());
+ }
+
ArrayRef<const std::unique_ptr<ImageSpace>> spaces_ref(spaces);
PointerSize pointer_size = first_space_header.GetPointerSize();
if (pointer_size == PointerSize::k64) {
diff --git a/runtime/read_barrier-inl.h b/runtime/read_barrier-inl.h
index ff4693f..36c6f44 100644
--- a/runtime/read_barrier-inl.h
+++ b/runtime/read_barrier-inl.h
@@ -38,9 +38,8 @@
if (gUseReadBarrier && with_read_barrier) {
if (kCheckDebugDisallowReadBarrierCount) {
Thread* const self = Thread::Current();
- if (self != nullptr) {
- CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
- }
+ CHECK(self != nullptr);
+ CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
}
if (kUseBakerReadBarrier) {
// fake_address_dependency (must be zero) is used to create artificial data dependency from
@@ -112,9 +111,8 @@
if (gUseReadBarrier && with_read_barrier) {
if (kCheckDebugDisallowReadBarrierCount) {
Thread* const self = Thread::Current();
- if (self != nullptr) {
- CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
- }
+ CHECK(self != nullptr);
+ CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
}
if (kUseBakerReadBarrier) {
// TODO: separate the read barrier code from the collector code more.
@@ -157,9 +155,8 @@
if (gUseReadBarrier && with_read_barrier) {
if (kCheckDebugDisallowReadBarrierCount) {
Thread* const self = Thread::Current();
- if (self != nullptr) {
- CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
- }
+ CHECK(self != nullptr);
+ CHECK_EQ(self->GetDebugDisallowReadBarrierCount(), 0u);
}
if (kUseBakerReadBarrier) {
// TODO: separate the read barrier code from the collector code more.