summaryrefslogtreecommitdiff
path: root/runtime/gc/reference_queue.cc
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2015-01-09 14:03:35 -0800
committer Hiroshi Yamauchi <yamauchi@google.com> 2015-01-23 14:07:32 -0800
commit2cd334ae2d4287216523882f0d298cf3901b7ab1 (patch)
treeb72d3d07e5a04151caca96cae345075b6e4452b0 /runtime/gc/reference_queue.cc
parent604e2828896fbb8663897d1e75112da7305ead4c (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.cc19
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;
}