diff options
| author | 2022-06-10 17:27:47 +0000 | |
|---|---|---|
| committer | 2022-06-10 17:27:47 +0000 | |
| commit | 7f2538de591f82f74b5c4f09e53912d2029f729c (patch) | |
| tree | 3b5424f334ecfa98f98eac6a9b65a7b0dad62576 /libs/binder/RpcState.cpp | |
| parent | f7a9d3a95f736e3edbb25324d89e9b4ab7d5e77c (diff) | |
| parent | 8f52763ddb1a34189edf32e4c9010248498e854c (diff) | |
Merge "libbinder: Don't alloc for RPC_COMMAND_DEC_STRONG" am: 8f52763ddb
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2122054
Change-Id: Ifb30fab753f5a0c6d2dabb77394392978b54278e
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 | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index f16a9ab98f..f5de5b1eaf 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -964,23 +964,19 @@ status_t RpcState::processDecStrong(const sp<RpcSession::RpcConnection>& connect const sp<RpcSession>& session, const RpcWireHeader& command) { LOG_ALWAYS_FATAL_IF(command.command != RPC_COMMAND_DEC_STRONG, "command: %d", command.command); - CommandData commandData(command.bodySize); - if (!commandData.valid()) { - return NO_MEMORY; - } - iovec iov{commandData.data(), commandData.size()}; - if (status_t status = rpcRec(connection, session, "dec ref body", &iov, 1); status != OK) - return status; - if (command.bodySize != sizeof(RpcDecStrong)) { ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcDecStrong. Terminating!", sizeof(RpcDecStrong), command.bodySize); (void)session->shutdownAndWait(false); return BAD_VALUE; } - RpcDecStrong* body = reinterpret_cast<RpcDecStrong*>(commandData.data()); - uint64_t addr = RpcWireAddress::toRaw(body->address); + RpcDecStrong body; + iovec iov{&body, sizeof(RpcDecStrong)}; + if (status_t status = rpcRec(connection, session, "dec ref body", &iov, 1); status != OK) + return status; + + uint64_t addr = RpcWireAddress::toRaw(body.address); std::unique_lock<std::mutex> _l(mNodeMutex); auto it = mNodeForAddress.find(addr); if (it == mNodeForAddress.end()) { @@ -998,19 +994,19 @@ status_t RpcState::processDecStrong(const sp<RpcSession::RpcConnection>& connect return BAD_VALUE; } - if (it->second.timesSent < body->amount) { + if (it->second.timesSent < body.amount) { ALOGE("Record of sending binder %zu times, but requested decStrong for %" PRIu64 " of %u", - it->second.timesSent, addr, body->amount); + it->second.timesSent, addr, body.amount); return OK; } LOG_ALWAYS_FATAL_IF(it->second.sentRef == nullptr, "Inconsistent state, lost ref for %" PRIu64, addr); - LOG_RPC_DETAIL("Processing dec strong of %" PRIu64 " by %u from %zu", addr, body->amount, + LOG_RPC_DETAIL("Processing dec strong of %" PRIu64 " by %u from %zu", addr, body.amount, it->second.timesSent); - it->second.timesSent -= body->amount; + it->second.timesSent -= body.amount; sp<IBinder> tempHold = tryEraseNode(it); _l.unlock(); tempHold = nullptr; // destructor may make binder calls on this session |