More of the concurrent copying collector.

Bug: 12687968
Change-Id: I62f70274d47df6d6cab714df95c518b750ce3105
diff --git a/runtime/gc/reference_queue.cc b/runtime/gc/reference_queue.cc
index f4efe3c..7be0704 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 @@
   } 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;
 }