diff options
| author | 2016-12-13 14:44:33 -0800 | |
|---|---|---|
| committer | 2016-12-13 16:40:14 -0800 | |
| commit | c9a7028430d95090ad3d7690203fd887d1e201a4 (patch) | |
| tree | 83e690d43ce87913c274b788c61d3425e6570e51 /runtime/gc/reference_processor.h | |
| parent | 36994ba006c18c1933815cc0c4c036df086e6814 (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.h | 7 |
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_); |