diff options
author | 2022-06-23 05:18:51 +0000 | |
---|---|---|
committer | 2022-06-23 23:20:24 +0000 | |
commit | c8490879af989a5fc0af5b14830c1c19eee1679d (patch) | |
tree | 38e5a1ce1e7998afa28d5e90ad617d2a92afc98f /libs/binder/RpcSession.cpp | |
parent | f43e3592205770a25250084fa216aac1af0ccc17 (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.cpp | 21 |
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); } } |