diff options
| author | 2021-09-30 22:17:35 +0000 | |
|---|---|---|
| committer | 2021-09-30 22:17:35 +0000 | |
| commit | 468efe829e2f4f8add5b77f3d0bd91aa52f0d69e (patch) | |
| tree | b4f03bccc3f7685b901c9b588c388aa6942be4a8 /libs/binder/RpcState.cpp | |
| parent | baee8f6388e3e17656d38827dc01976f81ac0cf7 (diff) | |
| parent | 477986184458f214025744940e88c36b7e5fbb7a (diff) | |
Merge "libbinder: RPC delay bp refcounts" am: 692ae86f08 am: a212c1dd4c am: 4779861844
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1838050
Change-Id: Ida304686ffdef3d3ae347d7e22e6933b0f3ff94e
Diffstat (limited to 'libs/binder/RpcState.cpp')
| -rw-r--r-- | libs/binder/RpcState.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 86cc91c03e..b5c6cb091c 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -183,6 +183,10 @@ status_t RpcState::onBinderEntering(const sp<RpcSession>& session, uint64_t addr status_t RpcState::flushExcessBinderRefs(const sp<RpcSession>& session, uint64_t address, const sp<IBinder>& binder) { + // We can flush all references when the binder is destroyed. No need to send + // extra reference counting packets now. + if (binder->remoteBinder()) return OK; + std::unique_lock<std::mutex> _l(mNodeMutex); if (mTerminated) return DEAD_OBJECT; @@ -192,20 +196,19 @@ status_t RpcState::flushExcessBinderRefs(const sp<RpcSession>& session, uint64_t LOG_ALWAYS_FATAL_IF(it->second.binder != binder, "Caller of flushExcessBinderRefs using inconsistent arguments"); - // if this is a local binder, then we want to get rid of all refcounts - // (tell the other process it can drop the binder when it wants to - we - // have a local sp<>, so we will drop it when we want to as well). if - // this is a remote binder, then we need to hold onto one refcount until - // it is dropped in BpBinder::onLastStrongRef - size_t targetRecd = binder->localBinder() ? 0 : 1; - - // We have timesRecd RPC refcounts, but we only need to hold on to one - // when we keep the object. All additional dec strongs are sent - // immediately, we wait to send the last one in BpBinder::onLastDecStrong. - if (it->second.timesRecd != targetRecd) { + LOG_ALWAYS_FATAL_IF(it->second.timesSent <= 0, "Local binder must have been sent %p", + binder.get()); + + // For a local binder, we only need to know that we sent it. Now that we + // have an sp<> for this call, we don't need anything more. If the other + // process is done with this binder, it needs to know we received the + // refcount associated with this call, so we can acknowledge that we + // received it. Once (or if) it has no other refcounts, it would reply with + // its own decStrong so that it could be removed from this session. + if (it->second.timesRecd != 0) { _l.unlock(); - return session->sendDecStrongToTarget(address, targetRecd); + return session->sendDecStrongToTarget(address, 0); } return OK; |