diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-09-30 11:30:03 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2014-09-30 11:30:03 -0700 |
commit | 5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424 (patch) | |
tree | c7c8b6deaa2889a67c79a217adb05b181ff0da83 /libs | |
parent | deb71b2812702318900c36b7bcfa9759525ea7cc (diff) | |
download | frameworks_native-5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424.zip frameworks_native-5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424.tar.gz frameworks_native-5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424.tar.bz2 |
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
Diffstat (limited to 'libs')
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 57c4638..dd04dcf 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); |