diff options
author | Brad Fitzpatrick <bradfitz@android.com> | 2010-12-13 16:52:35 -0800 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@android.com> | 2010-12-14 09:28:16 -0800 |
commit | 0bd5243b751c9cad317758158f79b3347e7948af (patch) | |
tree | 0c019af51a9067ae0292b6e0cf95c0829539c83d | |
parent | 48ea8d836276c04528d8e7dfebd59d27a627ce66 (diff) | |
download | frameworks_base-0bd5243b751c9cad317758158f79b3347e7948af.zip frameworks_base-0bd5243b751c9cad317758158f79b3347e7948af.tar.gz frameworks_base-0bd5243b751c9cad317758158f79b3347e7948af.tar.bz2 |
Framework-side support for Dalvik "isSensitiveThread" hook.
Used in lock contention stats.
Bug: 3226270
Change-Id: Ie6f58d130a29079a59bdefad40b80304d9bc3623
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 20 | ||||
-rw-r--r-- | include/binder/IPCThreadState.h | 1 | ||||
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 10 |
3 files changed, 31 insertions, 0 deletions
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 07505a5..2dfebe5 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -20,6 +20,7 @@ #include <android_runtime/AndroidRuntime.h> #include <binder/IBinder.h> +#include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <utils/Log.h> #include <utils/misc.h> @@ -431,6 +432,20 @@ static void runtime_vfprintf(FILE* fp, const char* format, va_list ap) LOG_PRI_VA(ANDROID_LOG_INFO, "vm-printf", format, ap); } +/** + * The VM calls this when mutex contention debugging is enabled to + * determine whether or not the blocked thread was a "sensitive thread" + * for user responsiveness/smoothess. + * + * Our policy for this is whether or not we're tracing any StrictMode + * events on this thread (which we might've inherited via Binder calls + * into us) + */ +static bool runtime_isSensitiveThread() { + IPCThreadState* state = IPCThreadState::selfOrNull(); + return state && state->getStrictModePolicy() != 0; +} + /** * Add VM arguments to the to-be-executed VM @@ -618,6 +633,11 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) opt.optionString = "vfprintf"; mOptions.add(opt); + /* register the framework-specific "is sensitive thread" hook */ + opt.extraInfo = (void*) runtime_isSensitiveThread; + opt.optionString = "sensitiveThread"; + mOptions.add(opt); + opt.extraInfo = NULL; /* enable verbose; standard options are { jni, gc, class } */ diff --git a/include/binder/IPCThreadState.h b/include/binder/IPCThreadState.h index b54718f..3378d97 100644 --- a/include/binder/IPCThreadState.h +++ b/include/binder/IPCThreadState.h @@ -33,6 +33,7 @@ class IPCThreadState { public: static IPCThreadState* self(); + static IPCThreadState* selfOrNull(); // self(), but won't instantiate sp<ProcessState> process(); diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 13c58f0..95cfddf 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -318,6 +318,16 @@ restart: goto restart; } +IPCThreadState* IPCThreadState::selfOrNull() +{ + if (gHaveTLS) { + const pthread_key_t k = gTLS; + IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); + return st; + } + return NULL; +} + void IPCThreadState::shutdown() { gShutdown = true; |