diff options
| author | 2022-07-19 17:31:14 +0000 | |
|---|---|---|
| committer | 2022-07-19 17:31:14 +0000 | |
| commit | 17b7dc0d7df423f11e0fd25c152e5dc4d57f511c (patch) | |
| tree | 35cdeefb1c2592ce8144496ff676aa01598bd490 /libs/binder/RpcState.cpp | |
| parent | 81862367a045919335e66c6d1ca00a430ecfdb37 (diff) | |
| parent | 9d71de850ebf3500594f8c5d050d457df52c020d (diff) | |
Merge "libbinder: RPC clear behavior" am: 4d9b036fbb am: 4abc23f79d am: 9d71de850e
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2154256
Change-Id: Id147c2e1b67c55bc9a17194600ebe82bc88f8131
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libs/binder/RpcState.cpp')
| -rw-r--r-- | libs/binder/RpcState.cpp | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 1c5654c597..d063001414 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -244,33 +244,31 @@ void RpcState::clear() { "New state should be impossible after terminating!"); return; } + mTerminated = true; if (SHOULD_LOG_RPC_DETAIL) { ALOGE("RpcState::clear()"); dumpLocked(); } - // if the destructor of a binder object makes another RPC call, then calling - // decStrong could deadlock. So, we must hold onto these binders until - // mNodeMutex is no longer taken. - std::vector<sp<IBinder>> tempHoldBinder; - - mTerminated = true; + // invariants for (auto& [address, node] : mNodeForAddress) { - sp<IBinder> binder = node.binder.promote(); - LOG_ALWAYS_FATAL_IF(binder == nullptr, - "Binder expected to be owned with address: %" PRIu64 " %s", address, - node.toString().c_str()); - - if (node.sentRef != nullptr) { - tempHoldBinder.push_back(node.sentRef); + bool guaranteedHaveBinder = node.timesSent > 0; + if (guaranteedHaveBinder) { + LOG_ALWAYS_FATAL_IF(node.sentRef == nullptr, + "Binder expected to be owned with address: %" PRIu64 " %s", address, + node.toString().c_str()); } } - mNodeForAddress.clear(); + // if the destructor of a binder object makes another RPC call, then calling + // decStrong could deadlock. So, we must hold onto these binders until + // mNodeMutex is no longer taken. + auto temp = std::move(mNodeForAddress); + mNodeForAddress.clear(); // RpcState isn't reusable, but for future/explicit _l.unlock(); - tempHoldBinder.clear(); // explicit + temp.clear(); // explicit } void RpcState::dumpLocked() { |