diff options
Diffstat (limited to 'runtime/gc/reference_queue.cc')
-rw-r--r-- | runtime/gc/reference_queue.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/runtime/gc/reference_queue.cc b/runtime/gc/reference_queue.cc index f4efe3c823..7be0704d01 100644 --- a/runtime/gc/reference_queue.cc +++ b/runtime/gc/reference_queue.cc @@ -17,6 +17,7 @@ #include "reference_queue.h" #include "accounting/card_table-inl.h" +#include "collector/concurrent_copying.h" #include "heap.h" #include "mirror/class-inl.h" #include "mirror/object-inl.h" @@ -85,6 +86,24 @@ mirror::Reference* ReferenceQueue::DequeuePendingReference() { } else { ref->SetPendingNext<false>(nullptr); } + Heap* heap = Runtime::Current()->GetHeap(); + if (kUseBakerOrBrooksReadBarrier && heap->CurrentCollectorType() == kCollectorTypeCC && + heap->ConcurrentCopyingCollector()->IsActive()) { + // Clear the gray ptr we left in ConcurrentCopying::ProcessMarkStack(). + // We don't want to do this when the zygote compaction collector (SemiSpace) is running. + CHECK(ref != nullptr); + CHECK_EQ(ref->GetReadBarrierPointer(), ReadBarrier::GrayPtr()) + << "ref=" << ref << " rb_ptr=" << ref->GetReadBarrierPointer(); + if (heap->ConcurrentCopyingCollector()->RegionSpace()->IsInToSpace(ref)) { + // Moving objects. + ref->SetReadBarrierPointer(ReadBarrier::WhitePtr()); + CHECK_EQ(ref->GetReadBarrierPointer(), ReadBarrier::WhitePtr()); + } else { + // Non-moving objects. + ref->SetReadBarrierPointer(ReadBarrier::BlackPtr()); + CHECK_EQ(ref->GetReadBarrierPointer(), ReadBarrier::BlackPtr()); + } + } return ref; } |