summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2014-09-30 11:30:03 -0700
committerDianne Hackborn <hackbod@google.com>2014-09-30 11:30:03 -0700
commit5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424 (patch)
treec7c8b6deaa2889a67c79a217adb05b181ff0da83
parentdeb71b2812702318900c36b7bcfa9759525ea7cc (diff)
downloadnative-5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424.tar.gz
Work on issue #17656716: Unhandled exception in Window Manager
Try to clean up the code paths coming in and out of binder IPCs to plug any places where we could disrupt the gather flag of a thread, causing it to keep gathering stack crawls (which is the thing that is causing our strict mode data to become so large). We now take care of saving and restoring this state in the core IPC code path, not at the Java layer. Change-Id: I73d564778da127bdce00f304225930e7f2318293
-rw-r--r--libs/binder/IPCThreadState.cpp21
1 files changed, 13 insertions, 8 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index 57c4638c2c..dd04dcf4db 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -1037,10 +1037,13 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
const pid_t origPid = mCallingPid;
const uid_t origUid = mCallingUid;
-
+ const int32_t origStrictModePolicy = mStrictModePolicy;
+ const int32_t origTransactionBinderFlags = mLastTransactionBinderFlags;
+
mCallingPid = tr.sender_pid;
mCallingUid = tr.sender_euid;
-
+ mLastTransactionBinderFlags = tr.flags;
+
int curPrio = getpriority(PRIO_PROCESS, mMyThreadId);
if (gDisableBackgroundScheduling) {
if (curPrio > ANDROID_PRIORITY_NORMAL) {
@@ -1062,8 +1065,9 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
}
//ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
-
+
Parcel reply;
+ status_t error;
IF_LOG_TRANSACTIONS() {
TextOutput::Bundle _b(alog);
alog << "BR_TRANSACTION thr " << (void*)pthread_self()
@@ -1077,19 +1081,18 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
}
if (tr.target.ptr) {
sp<BBinder> b((BBinder*)tr.cookie);
- const status_t error = b->transact(tr.code, buffer, &reply, tr.flags);
- if (error < NO_ERROR) reply.setError(error);
+ error = b->transact(tr.code, buffer, &reply, tr.flags);
} else {
- const status_t error = the_context_object->transact(tr.code, buffer, &reply, tr.flags);
- if (error < NO_ERROR) reply.setError(error);
+ error = the_context_object->transact(tr.code, buffer, &reply, tr.flags);
}
-
+
//ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
// mCallingPid, origPid, origUid);
if ((tr.flags & TF_ONE_WAY) == 0) {
LOG_ONEWAY("Sending reply to %d!", mCallingPid);
+ if (error < NO_ERROR) reply.setError(error);
sendReply(reply, 0);
} else {
LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
@@ -1097,6 +1100,8 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
mCallingPid = origPid;
mCallingUid = origUid;
+ mStrictModePolicy = origStrictModePolicy;
+ mLastTransactionBinderFlags = origTransactionBinderFlags;
IF_LOG_TRANSACTIONS() {
TextOutput::Bundle _b(alog);