From 5ee2c9d20c0fbecf6b4a482eb8d8bfdf85d0d424 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 30 Sep 2014 11:30:03 -0700 Subject: [PATCH] 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 --- libs/binder/IPCThreadState.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 57c4638c2..dd04dcf4d 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 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);