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
This commit is contained in:
parent
deb71b2812
commit
5ee2c9d20c
@ -1037,9 +1037,12 @@ 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) {
|
||||
@ -1064,6 +1067,7 @@ 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,12 +1081,10 @@ 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",
|
||||
@ -1090,6 +1092,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
|
||||
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user