summaryrefslogtreecommitdiff
path: root/runtime/gc/reference_processor.h
diff options
context:
space:
mode:
author Alex Light <allight@google.com> 2019-05-13 16:35:02 -0700
committer Treehugger Robot <treehugger-gerrit@google.com> 2019-05-14 20:22:20 +0000
commite302088f50244f10c90e5f40b6e05c9574c4cf32 (patch)
tree8551a3c7d9ed52af88260307e7d0a88a00f83be8 /runtime/gc/reference_processor.h
parent23ca8fbcb23fb1eb95d192995a35f4fed53bffbd (diff)
Call ReferenceQueue add outside of active GC block
We were calling ReferenceQueue.add within the runtime GC active block. This caused java code to be run and could (potentially) cause deadlocks with JVMTI and debuggers. To fix this we collect the cleared references during the GC and only enqueue them after FinishGC. Test: ./test.py --host Test: atest CtsJdwpTunnelHostTestCases # with goldfish emulator Test: ./art/tools/run-libjdwp-tests.sh --mode=host Bug: 132460313 Change-Id: I276870096fb60a06afba7f850325d06709227b8e
Diffstat (limited to 'runtime/gc/reference_processor.h')
-rw-r--r--runtime/gc/reference_processor.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/runtime/gc/reference_processor.h b/runtime/gc/reference_processor.h
index c1c9a3c833..54de5cc572 100644
--- a/runtime/gc/reference_processor.h
+++ b/runtime/gc/reference_processor.h
@@ -61,7 +61,9 @@ class ReferenceProcessor {
// Decode the referent, may block if references are being processed.
ObjPtr<mirror::Object> GetReferent(Thread* self, ObjPtr<mirror::Reference> reference)
REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::reference_processor_lock_);
- void EnqueueClearedReferences(Thread* self) REQUIRES(!Locks::mutator_lock_);
+ // Collects the cleared references and returns a task, to be executed after FinishGC, that will
+ // enqueue all of them.
+ SelfDeletingTask* CollectClearedReferences(Thread* self) REQUIRES(!Locks::mutator_lock_);
void DelayReferenceReferent(ObjPtr<mirror::Class> klass,
ObjPtr<mirror::Reference> ref,
collector::GarbageCollector* collector)