summaryrefslogtreecommitdiff
path: root/runtime/gc/reference_processor.h
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-12-13 14:44:33 -0800
committer Mathieu Chartier <mathieuc@google.com> 2016-12-13 16:40:14 -0800
commitc9a7028430d95090ad3d7690203fd887d1e201a4 (patch)
tree83e690d43ce87913c274b788c61d3425e6570e51 /runtime/gc/reference_processor.h
parent36994ba006c18c1933815cc0c4c036df086e6814 (diff)
Add exclusion for Reference.clear and reference processing
Prevents race conditions like unclearing cleared references or calling IsMarkedHeapReference on null references. Bug: 33389022 Test: test-art-host Change-Id: Iee83b76d84453e929172f1a83f284aa4910e126c
Diffstat (limited to 'runtime/gc/reference_processor.h')
-rw-r--r--runtime/gc/reference_processor.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/runtime/gc/reference_processor.h b/runtime/gc/reference_processor.h
index 759b7e129c..b15544d549 100644
--- a/runtime/gc/reference_processor.h
+++ b/runtime/gc/reference_processor.h
@@ -73,6 +73,9 @@ class ReferenceProcessor {
REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(!Locks::reference_processor_lock_,
!Locks::reference_queue_finalizer_references_lock_);
+ void ClearReferent(ObjPtr<mirror::Reference> ref)
+ REQUIRES_SHARED(Locks::mutator_lock_)
+ REQUIRES(!Locks::reference_processor_lock_);
private:
bool SlowPathEnabled() REQUIRES_SHARED(Locks::mutator_lock_);
@@ -84,6 +87,10 @@ class ReferenceProcessor {
// referents.
void StartPreservingReferences(Thread* self) REQUIRES(!Locks::reference_processor_lock_);
void StopPreservingReferences(Thread* self) REQUIRES(!Locks::reference_processor_lock_);
+ // Wait until reference processing is done.
+ void WaitUntilDoneProcessingReferences(Thread* self)
+ REQUIRES_SHARED(Locks::mutator_lock_)
+ REQUIRES(Locks::reference_processor_lock_);
// Collector which is clearing references, used by the GetReferent to return referents which are
// already marked.
collector::GarbageCollector* collector_ GUARDED_BY(Locks::reference_processor_lock_);