diff options
author | Frederick Mayle <fmayle@google.com> | 2022-06-10 17:27:47 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-06-10 17:27:47 +0000 |
commit | 7f2538de591f82f74b5c4f09e53912d2029f729c (patch) | |
tree | 3b5424f334ecfa98f98eac6a9b65a7b0dad62576 | |
parent | f7a9d3a95f736e3edbb25324d89e9b4ab7d5e77c (diff) | |
parent | 8f52763ddb1a34189edf32e4c9010248498e854c (diff) | |
download | native-7f2538de591f82f74b5c4f09e53912d2029f729c.tar.gz |
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>
-rw-r--r-- | libs/binder/RpcState.cpp | 24 | ||||
-rw-r--r-- | libs/binder/tests/binderAllocationLimits.cpp | 4 |
2 files changed, 12 insertions, 16 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 diff --git a/libs/binder/tests/binderAllocationLimits.cpp b/libs/binder/tests/binderAllocationLimits.cpp index 2c34766faa..60b3c94f5e 100644 --- a/libs/binder/tests/binderAllocationLimits.cpp +++ b/libs/binder/tests/binderAllocationLimits.cpp @@ -210,8 +210,8 @@ TEST(RpcBinderAllocation, SetupRpcServer) { }); CHECK_EQ(OK, remoteBinder->pingBinder()); } - EXPECT_EQ(mallocs, 2); - EXPECT_EQ(totalBytes, 56); + EXPECT_EQ(mallocs, 1); + EXPECT_EQ(totalBytes, 40); } int main(int argc, char** argv) { |