summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2010-12-13 16:52:35 -0800
committerBrad Fitzpatrick <bradfitz@android.com>2010-12-14 09:28:16 -0800
commit0bd5243b751c9cad317758158f79b3347e7948af (patch)
tree0c019af51a9067ae0292b6e0cf95c0829539c83d
parent48ea8d836276c04528d8e7dfebd59d27a627ce66 (diff)
downloadframeworks_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.cpp20
-rw-r--r--include/binder/IPCThreadState.h1
-rw-r--r--libs/binder/IPCThreadState.cpp10
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;