diff options
Diffstat (limited to 'libs/binder/IPCThreadState.cpp')
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index d2919e7f4d..e933f7ef4c 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -516,14 +516,16 @@ void IPCThreadState::flushCommands() bool IPCThreadState::flushIfNeeded() { - if (mIsLooper || mServingStackPointer != nullptr) { + if (mIsLooper || mServingStackPointer != nullptr || mIsFlushing) { return false; } + mIsFlushing = true; // In case this thread is not a looper and is not currently serving a binder transaction, // there's no guarantee that this thread will call back into the kernel driver any time // soon. Therefore, flush pending commands such as BC_FREE_BUFFER, to prevent them from getting // stuck in this thread's out buffer. flushCommands(); + mIsFlushing = false; return true; } @@ -880,6 +882,7 @@ IPCThreadState::IPCThreadState() mWorkSource(kUnsetWorkSource), mPropagateWorkSource(false), mIsLooper(false), + mIsFlushing(false), mStrictModePolicy(0), mLastTransactionBinderFlags(0), mCallRestriction(mProcess->mCallRestriction) { |