diff options
-rw-r--r-- | runtime/jit/jit.cc | 6 | ||||
-rw-r--r-- | runtime/native/dalvik_system_VMRuntime.cc | 5 | ||||
-rw-r--r-- | runtime/runtime.cc | 4 | ||||
-rw-r--r-- | runtime/runtime.h | 2 | ||||
-rw-r--r-- | runtime/thread.cc | 1 | ||||
-rw-r--r-- | runtime/thread.h | 18 |
6 files changed, 32 insertions, 4 deletions
diff --git a/runtime/jit/jit.cc b/runtime/jit/jit.cc index 8f126bf1b7..3264cb224a 100644 --- a/runtime/jit/jit.cc +++ b/runtime/jit/jit.cc @@ -105,10 +105,8 @@ JitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& opt } bool Jit::ShouldUsePriorityThreadWeight() { - // TODO(calin): verify that IsSensitiveThread covers only the cases we are interested on. - // In particular if apps can set StrictMode policies for any of their threads, case in which - // we need to find another way to track sensitive threads. - return Runtime::Current()->InJankPerceptibleProcessState() && Thread::IsSensitiveThread(); + return Runtime::Current()->InJankPerceptibleProcessState() + && Thread::Current()->IsJitSensitiveThread(); } void Jit::DumpInfo(std::ostream& os) { diff --git a/runtime/native/dalvik_system_VMRuntime.cc b/runtime/native/dalvik_system_VMRuntime.cc index 88a5870c02..56c0d58e69 100644 --- a/runtime/native/dalvik_system_VMRuntime.cc +++ b/runtime/native/dalvik_system_VMRuntime.cc @@ -216,6 +216,10 @@ static void VMRuntime_registerNativeAllocation(JNIEnv* env, jobject, jint bytes) Runtime::Current()->GetHeap()->RegisterNativeAllocation(env, static_cast<size_t>(bytes)); } +static void VMRuntime_registerSensitiveThread(JNIEnv*, jobject) { + Runtime::Current()->RegisterSensitiveThread(); +} + static void VMRuntime_registerNativeFree(JNIEnv* env, jobject, jint bytes) { if (UNLIKELY(bytes < 0)) { ScopedObjectAccess soa(env); @@ -648,6 +652,7 @@ static JNINativeMethod gMethods[] = { NATIVE_METHOD(VMRuntime, properties, "()[Ljava/lang/String;"), NATIVE_METHOD(VMRuntime, setTargetSdkVersionNative, "(I)V"), NATIVE_METHOD(VMRuntime, registerNativeAllocation, "(I)V"), + NATIVE_METHOD(VMRuntime, registerSensitiveThread, "()V"), NATIVE_METHOD(VMRuntime, registerNativeFree, "(I)V"), NATIVE_METHOD(VMRuntime, requestConcurrentGC, "()V"), NATIVE_METHOD(VMRuntime, requestHeapTrim, "()V"), diff --git a/runtime/runtime.cc b/runtime/runtime.cc index 2489e45e47..5dbc6b37f2 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -1981,4 +1981,8 @@ void Runtime::UpdateProcessState(ProcessState process_state) { GetHeap()->UpdateProcessState(old_process_state, process_state); } +void Runtime::RegisterSensitiveThread() const { + Thread::SetJitSensitiveThread(); +} + } // namespace art diff --git a/runtime/runtime.h b/runtime/runtime.h index ae25dd1c65..c507129972 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -635,6 +635,8 @@ class Runtime { return process_state_ == kProcessStateJankPerceptible; } + void RegisterSensitiveThread() const; + void SetZygoteNoThreadSection(bool val) { zygote_no_threads_ = val; } diff --git a/runtime/thread.cc b/runtime/thread.cc index e015833c9c..a46203606b 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -89,6 +89,7 @@ pthread_key_t Thread::pthread_key_self_; ConditionVariable* Thread::resume_cond_ = nullptr; const size_t Thread::kStackOverflowImplicitCheckSize = GetStackOverflowReservedBytes(kRuntimeISA); bool (*Thread::is_sensitive_thread_hook_)() = nullptr; +Thread* Thread::jit_sensitive_thread_ = nullptr; static constexpr bool kVerifyImageObjectsMarked = kIsDebugBuild; diff --git a/runtime/thread.h b/runtime/thread.h index 2218b5a9d8..b7b05919b0 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -1097,6 +1097,12 @@ class Thread { return debug_disallow_read_barrier_; } + // Returns true if the current thread is the jit sensitive thread. + bool IsJitSensitiveThread() const { + return this == jit_sensitive_thread_; + } + + // Returns true if StrictMode events are traced for the current thread. static bool IsSensitiveThread() { if (is_sensitive_thread_hook_ != nullptr) { return (*is_sensitive_thread_hook_)(); @@ -1179,6 +1185,16 @@ class Thread { ALWAYS_INLINE void PassActiveSuspendBarriers() REQUIRES(!Locks::thread_suspend_count_lock_, !Roles::uninterruptible_); + // Registers the current thread as the jit sensitive thread. Should be called just once. + static void SetJitSensitiveThread() { + if (jit_sensitive_thread_ == nullptr) { + jit_sensitive_thread_ = Thread::Current(); + } else { + LOG(WARNING) << "Attempt to set the sensitive thread twice. Tid:" + << Thread::Current()->GetTid(); + } + } + static void SetSensitiveThreadHook(bool (*is_sensitive_thread_hook)()) { is_sensitive_thread_hook_ = is_sensitive_thread_hook; } @@ -1228,6 +1244,8 @@ class Thread { // Hook passed by framework which returns true // when StrictMode events are traced for the current thread. static bool (*is_sensitive_thread_hook_)(); + // Stores the jit sensitive thread (which for now is the UI thread). + static Thread* jit_sensitive_thread_; /***********************************************************************************************/ // Thread local storage. Fields are grouped by size to enable 32 <-> 64 searching to account for |