diff options
author | 2014-05-06 10:57:27 -0700 | |
---|---|---|
committer | 2014-05-07 15:28:35 -0700 | |
commit | 78f7b4c04ab6e8b5581921bc95b67a9beee1c246 (patch) | |
tree | 78b93c72007478b5bfc3b88ab413fa3d772da723 /runtime/gc/reference_queue.cc | |
parent | 052a647973b590c9d5007a2e16f313f4e32a70bd (diff) |
Add concurrent reference processing.
Concurrent reference processing currently works by going into native
code from java.lang.ref.Reference.get(). From there, we have a fast
path if the references aren't being processed which returns the
referent without needing to access any locks. In the slow path we
block until reference processing is complete. It may be possible to
improve the slow path if the referent is blackened.
TODO: Investigate doing the fast path in java code by using racy reads
of a static volatile boolean. This will work as long as there are no
suspend points inbetween the boolean read and referent read.
Bug: 14381653
Change-Id: I1546b55be4691fe4ff4aa6d857b234cce7187d87
Diffstat (limited to 'runtime/gc/reference_queue.cc')
-rw-r--r-- | runtime/gc/reference_queue.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/runtime/gc/reference_queue.cc b/runtime/gc/reference_queue.cc index aee7891d2f..d2bd9a4797 100644 --- a/runtime/gc/reference_queue.cc +++ b/runtime/gc/reference_queue.cc @@ -131,8 +131,8 @@ void ReferenceQueue::ClearWhiteReferences(ReferenceQueue& cleared_references, } void ReferenceQueue::EnqueueFinalizerReferences(ReferenceQueue& cleared_references, - IsMarkedCallback is_marked_callback, - MarkObjectCallback recursive_mark_callback, + IsMarkedCallback* is_marked_callback, + MarkObjectCallback* mark_object_callback, void* arg) { while (!IsEmpty()) { mirror::FinalizerReference* ref = DequeuePendingReference()->AsFinalizerReference(); @@ -141,7 +141,7 @@ void ReferenceQueue::EnqueueFinalizerReferences(ReferenceQueue& cleared_referenc mirror::Object* forward_address = is_marked_callback(referent, arg); // If the referent isn't marked, mark it and update the if (forward_address == nullptr) { - forward_address = recursive_mark_callback(referent, arg); + forward_address = mark_object_callback(referent, arg); // If the referent is non-null the reference must queuable. DCHECK(ref->IsEnqueuable()); // Move the updated referent to the zombie field. @@ -160,7 +160,7 @@ void ReferenceQueue::EnqueueFinalizerReferences(ReferenceQueue& cleared_referenc } } -void ReferenceQueue::PreserveSomeSoftReferences(IsMarkedCallback preserve_callback, void* arg) { +void ReferenceQueue::PreserveSomeSoftReferences(IsMarkedCallback* preserve_callback, void* arg) { ReferenceQueue cleared; while (!IsEmpty()) { mirror::Reference* ref = DequeuePendingReference(); |