summaryrefslogtreecommitdiff
path: root/libs/binder/RpcSession.cpp
diff options
context:
space:
mode:
author Andrei Homescu <ahomescu@google.com> 2022-06-23 05:18:51 +0000
committer Andrei Homescu <ahomescu@google.com> 2022-06-23 23:20:24 +0000
commitc8490879af989a5fc0af5b14830c1c19eee1679d (patch)
tree38e5a1ce1e7998afa28d5e90ad617d2a92afc98f /libs/binder/RpcSession.cpp
parentf43e3592205770a25250084fa216aac1af0ccc17 (diff)
libbinder: fix hanging wait in RpcSession
Fixes a hanging wait in RpcSession by notifying the condition variable for available connections immediately after adding a new outgoing connection. Bug: 224644083 Test: atest binderRpcTest Change-Id: I27c81127482859342cb789eaac087f55ae5c16d9
Diffstat (limited to 'libs/binder/RpcSession.cpp')
-rw-r--r--libs/binder/RpcSession.cpp21
1 files changed, 11 insertions, 10 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index 8edc78f2f5..7ba08edec4 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -699,10 +699,7 @@ status_t RpcSession::addOutgoingConnection(std::unique_ptr<RpcTransport> rpcTran
mRpcBinderState->sendConnectionInit(connection, sp<RpcSession>::fromExisting(this));
}
- {
- std::lock_guard<std::mutex> _l(mMutex);
- connection->exclusiveTid = std::nullopt;
- }
+ clearConnectionTid(connection);
return status;
}
@@ -773,6 +770,15 @@ bool RpcSession::removeIncomingConnection(const sp<RpcConnection>& connection) {
return false;
}
+void RpcSession::clearConnectionTid(const sp<RpcConnection>& connection) {
+ std::unique_lock<std::mutex> _l(mMutex);
+ connection->exclusiveTid = std::nullopt;
+ if (mConnections.mWaitingThreads > 0) {
+ _l.unlock();
+ mAvailableConnectionCv.notify_one();
+ }
+}
+
std::vector<uint8_t> RpcSession::getCertificate(RpcCertificateFormat format) {
return mCtx->getCertificate(format);
}
@@ -902,12 +908,7 @@ RpcSession::ExclusiveConnection::~ExclusiveConnection() {
// is using this fd, and it retains the right to it. So, we don't give up
// exclusive ownership, and no thread is freed.
if (!mReentrant && mConnection != nullptr) {
- std::unique_lock<std::mutex> _l(mSession->mMutex);
- mConnection->exclusiveTid = std::nullopt;
- if (mSession->mConnections.mWaitingThreads > 0) {
- _l.unlock();
- mSession->mAvailableConnectionCv.notify_one();
- }
+ mSession->clearConnectionTid(mConnection);
}
}