Move ThreadDeath event before clearing Thread.nativePeer
We were clearing the Thread.nativePeer field prior to calling
ThreadDeath event. Since this event can call into user-supplied code
we want to call it before we do any real cleanup.
Test: ./test.py --host -j40
Bug: 62117833
Change-Id: I6b93d82d23946c07dfbeb837d841339108e4b084
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 36ecd33..fc30832 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -2134,6 +2134,10 @@
ScopedObjectAccess soa(self);
// We may need to call user-supplied managed code, do this before final clean-up.
HandleUncaughtExceptions(soa);
+ Runtime* runtime = Runtime::Current();
+ if (runtime != nullptr) {
+ runtime->GetRuntimeCallbacks()->ThreadDeath(self);
+ }
RemoveFromThreadGroup(soa);
// this.nativePeer = 0;
@@ -2144,11 +2148,6 @@
jni::DecodeArtField(WellKnownClasses::java_lang_Thread_nativePeer)
->SetLong<false>(tlsPtr_.opeer, 0);
}
- Runtime* runtime = Runtime::Current();
- if (runtime != nullptr) {
- runtime->GetRuntimeCallbacks()->ThreadDeath(self);
- }
-
// Thread.join() is implemented as an Object.wait() on the Thread.lock object. Signal anyone
// who is waiting.