diff options
author | 2015-01-09 14:03:35 -0800 | |
---|---|---|
committer | 2015-01-23 14:07:32 -0800 | |
commit | 2cd334ae2d4287216523882f0d298cf3901b7ab1 (patch) | |
tree | b72d3d07e5a04151caca96cae345075b6e4452b0 /runtime/gc/reference_queue.cc | |
parent | 604e2828896fbb8663897d1e75112da7305ead4c (diff) |
More of the concurrent copying collector.
Bug: 12687968
Change-Id: I62f70274d47df6d6cab714df95c518b750ce3105
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; } |