From 9317031cd016e02a26cdeea8045df9925b33ffe2 Mon Sep 17 00:00:00 2001 From: Lokesh Gidra Date: Wed, 4 Dec 2019 13:46:11 -0800 Subject: Move thread-local mark-stack revocation outside SOA Revoking mark-stack inside a ScopedObjectAccess scope could potentially call checkpoints in its destructor, which may trigger read-barrier, after the mark-stack is revoked. Test: art/test/testrunner/testrunner.py --target Bug: 140119552 Change-Id: I90d62cbf5edbaf953de73aeb2b3b59612b6897d3 --- runtime/thread.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'runtime/thread.cc') diff --git a/runtime/thread.cc b/runtime/thread.cc index 290b87f496..59a170517c 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -2439,9 +2439,11 @@ void Thread::Destroy() { { ScopedObjectAccess soa(self); Runtime::Current()->GetHeap()->RevokeThreadLocalBuffers(this); - if (kUseReadBarrier) { - Runtime::Current()->GetHeap()->ConcurrentCopyingCollector()->RevokeThreadLocalMarkStack(this); - } + } + // Mark-stack revocation must be performed at the very end. No + // checkpoint/flip-function or read-barrier should be called after this. + if (kUseReadBarrier) { + Runtime::Current()->GetHeap()->ConcurrentCopyingCollector()->RevokeThreadLocalMarkStack(this); } } -- cgit v1.2.3-59-g8ed1b