From ddf4fd3c37af160b5a1f7e83212b837f50e13e81 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Mon, 22 Nov 2021 16:31:57 +0000 Subject: Always access Thread state and flags as 32-bit location. Rewrite access to Thread's state and flags to use 32-bit atomic operations. Avoid `volatile` accesses that prevent compiler optimizations. Change `ThreadState` and `ThreadFlag` to `enum class`es. Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticNormal 28.162 35.323 (+25.43%) NativeDowncallStaticNormal6 26.447 32.951 (+24.59%) NativeDowncallStaticNormalRefs6 NativeDowncallVirtualNormal 27.972 35.027 (+25.22%) NativeDowncallVirtualNormal6 26.096 32.131 (+23.13%) NativeDowncallVirtualNormalRefs6 25.922 31.873 (+22.95%) linux-x64 before after NativeDowncallStaticNormal 26.987 34.380 (+27.40%) NativeDowncallStaticNormal6 25.424 31.096 (+22.31%) NativeDowncallStaticNormalRefs6 25.086 30.602 (+21.99%) NativeDowncallVirtualNormal 26.812 33.234 (+23.95%) NativeDowncallVirtualNormal6 25.086 30.617 (+22.05%) NativeDowncallVirtualNormalRefs6 25.086 30.602 (+21.99%) linux-armv7 before after NativeDowncallStaticNormal 7.2394 7.9523 (+9.848%) NativeDowncallStaticNormal6 6.8527 7.4888 (+9.283%) NativeDowncallStaticNormalRefs6 6.3976 6.9444 (+8.547%) NativeDowncallVirtualNormal 7.2081 7.9130 (+9.779%) NativeDowncallVirtualNormal6 6.8527 7.4888 (+9.283%) NativeDowncallVirtualNormalRefs6 6.3168 6.8527 (+8.483%) linux-armv8 before after NativeDowncallStaticNormal 7.0389 7.5973 (+7.933%) NativeDowncallStaticNormal6 6.8527 7.3783 (+7.670%) NativeDowncallStaticNormalRefs6 6.2924 6.8226 (+8.427%) NativeDowncallVirtualNormal 6.8527 7.3783 (+7.670%) NativeDowncallVirtualNormal6 6.5604 7.0423 (+7.344%) NativeDowncallVirtualNormalRefs6 6.1408 6.5329 (+6.386%) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing --interpreter Bug: 172332525 Bug: 143299880 Change-Id: Ib55d457ad8f5d9e1159b681dfd279d1f9cfb2af7 --- runtime/native/java_lang_Thread.cc | 62 ++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 30 deletions(-) (limited to 'runtime/native/java_lang_Thread.cc') diff --git a/runtime/native/java_lang_Thread.cc b/runtime/native/java_lang_Thread.cc index c3b4fe09de..570c554782 100644 --- a/runtime/native/java_lang_Thread.cc +++ b/runtime/native/java_lang_Thread.cc @@ -71,41 +71,43 @@ static jint Thread_nativeGetStatus(JNIEnv* env, jobject java_thread, jboolean ha const jint kJavaTerminated = 5; ScopedObjectAccess soa(env); - ThreadState internal_thread_state = (has_been_started ? kTerminated : kStarting); + ThreadState internal_thread_state = + (has_been_started ? ThreadState::kTerminated : ThreadState::kStarting); MutexLock mu(soa.Self(), *Locks::thread_list_lock_); Thread* thread = Thread::FromManagedThread(soa, java_thread); if (thread != nullptr) { internal_thread_state = thread->GetState(); } switch (internal_thread_state) { - case kTerminated: return kJavaTerminated; - case kRunnable: return kJavaRunnable; - case kTimedWaiting: return kJavaTimedWaiting; - case kSleeping: return kJavaTimedWaiting; - case kBlocked: return kJavaBlocked; - case kWaiting: return kJavaWaiting; - case kStarting: return kJavaNew; - case kNative: return kJavaRunnable; - case kWaitingForTaskProcessor: return kJavaWaiting; - case kWaitingForLockInflation: return kJavaWaiting; - case kWaitingForGcToComplete: return kJavaWaiting; - case kWaitingPerformingGc: return kJavaWaiting; - case kWaitingForCheckPointsToRun: return kJavaWaiting; - case kWaitingForDebuggerSend: return kJavaWaiting; - case kWaitingForDebuggerToAttach: return kJavaWaiting; - case kWaitingInMainDebuggerLoop: return kJavaWaiting; - case kWaitingForDebuggerSuspension: return kJavaWaiting; - case kWaitingForDeoptimization: return kJavaWaiting; - case kWaitingForGetObjectsAllocated: return kJavaWaiting; - case kWaitingForJniOnLoad: return kJavaWaiting; - case kWaitingForSignalCatcherOutput: return kJavaWaiting; - case kWaitingInMainSignalCatcherLoop: return kJavaWaiting; - case kWaitingForMethodTracingStart: return kJavaWaiting; - case kWaitingForVisitObjects: return kJavaWaiting; - case kWaitingWeakGcRootRead: return kJavaRunnable; - case kWaitingForGcThreadFlip: return kJavaWaiting; - case kNativeForAbort: return kJavaWaiting; - case kSuspended: return kJavaRunnable; + case ThreadState::kTerminated: return kJavaTerminated; + case ThreadState::kRunnable: return kJavaRunnable; + case ThreadState::kObsoleteRunnable: break; // Obsolete value. + case ThreadState::kTimedWaiting: return kJavaTimedWaiting; + case ThreadState::kSleeping: return kJavaTimedWaiting; + case ThreadState::kBlocked: return kJavaBlocked; + case ThreadState::kWaiting: return kJavaWaiting; + case ThreadState::kStarting: return kJavaNew; + case ThreadState::kNative: return kJavaRunnable; + case ThreadState::kWaitingForTaskProcessor: return kJavaWaiting; + case ThreadState::kWaitingForLockInflation: return kJavaWaiting; + case ThreadState::kWaitingForGcToComplete: return kJavaWaiting; + case ThreadState::kWaitingPerformingGc: return kJavaWaiting; + case ThreadState::kWaitingForCheckPointsToRun: return kJavaWaiting; + case ThreadState::kWaitingForDebuggerSend: return kJavaWaiting; + case ThreadState::kWaitingForDebuggerToAttach: return kJavaWaiting; + case ThreadState::kWaitingInMainDebuggerLoop: return kJavaWaiting; + case ThreadState::kWaitingForDebuggerSuspension: return kJavaWaiting; + case ThreadState::kWaitingForDeoptimization: return kJavaWaiting; + case ThreadState::kWaitingForGetObjectsAllocated: return kJavaWaiting; + case ThreadState::kWaitingForJniOnLoad: return kJavaWaiting; + case ThreadState::kWaitingForSignalCatcherOutput: return kJavaWaiting; + case ThreadState::kWaitingInMainSignalCatcherLoop: return kJavaWaiting; + case ThreadState::kWaitingForMethodTracingStart: return kJavaWaiting; + case ThreadState::kWaitingForVisitObjects: return kJavaWaiting; + case ThreadState::kWaitingWeakGcRootRead: return kJavaRunnable; + case ThreadState::kWaitingForGcThreadFlip: return kJavaWaiting; + case ThreadState::kNativeForAbort: return kJavaWaiting; + case ThreadState::kSuspended: return kJavaRunnable; // Don't add a 'default' here so the compiler can spot incompatible enum changes. } LOG(ERROR) << "Unexpected thread state: " << internal_thread_state; @@ -180,7 +182,7 @@ static void Thread_setPriority0(JNIEnv* env, jobject java_thread, jint new_prior static void Thread_sleep(JNIEnv* env, jclass, jobject java_lock, jlong ms, jint ns) { ScopedFastNativeObjectAccess soa(env); ObjPtr lock = soa.Decode(java_lock); - Monitor::Wait(Thread::Current(), lock.Ptr(), ms, ns, true, kSleeping); + Monitor::Wait(Thread::Current(), lock.Ptr(), ms, ns, true, ThreadState::kSleeping); } /* -- cgit v1.2.3-59-g8ed1b