summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;