diff options
| author | 2016-04-15 16:16:35 +0100 | |
|---|---|---|
| committer | 2016-04-28 16:12:33 +0100 | |
| commit | 97cbc9206e9adc473a90650ebdb5d620f517ff04 (patch) | |
| tree | bef15a43a1c3f3dc2639f156aeea40d95763258e | |
| parent | 85e47976a483844177eb486d6e501fa070fbe6e2 (diff) | |
Allow the framework to register sensistive threads to the runtime
Bug: 27865109
Bug: 28065407
(cherry picked from commit 8fff24953c78bd58f3a42ac83b340b90e7e7228a)
Change-Id: I82094e46a2fd12617e091d98831193f9ff56d26b
| -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 c36543f1f3..654cea088f 100644 --- a/runtime/jit/jit.cc +++ b/runtime/jit/jit.cc @@ -106,10 +106,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 f355c2a948..5ba8df79ca 100644 --- a/runtime/native/dalvik_system_VMRuntime.cc +++ b/runtime/native/dalvik_system_VMRuntime.cc @@ -212,6 +212,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); @@ -643,6 +647,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 95995fb7b4..f0510affc5 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -1992,4 +1992,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 b6a9125967..fd4b5c8956 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -636,6 +636,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 cdbf995312..e3feda62f4 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 2092feb4e4..582a0cdbd6 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -1093,6 +1093,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_)(); @@ -1175,6 +1181,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; } @@ -1224,6 +1240,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 |