libbinder: RpcSession - hide RPC address format
FAQ for this change.
- Why does RpcSession still have sendDecStrong(uint64_t)?
This is used by RpcState to send dec strongs on local (non-BpBinder)
binders. This is needed because if a client has the last strong ref
of a binder which is local to the corresponding server, the client
needs to transfer ownership of this binder to the server using the
call.
- Why is RpcSession::sendDecStrong(BpBinder) public?
It may be useful for testing, especially in situations where
~BpBinder would be hard to call.
- Why does BpBinder have a private accessor, but RpcState is friends
with some other Rpc* classes?
I would like to have as few friends as possible (in regards to C++
classes!), but it takes quite a bit of boilerplate to avoid this. I
want to avoid the Rpc stuff introspecting into the standard binder
stuff, but I'm not currently concerned about their interactions
between each other.
Bug: 167966510
Test: binderRpcTest
Change-Id: I89e4de2e3a042a4531e2fd41deeb9bab1c11ff94
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index e8f984c..886a2e9 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -29,6 +29,7 @@
#include <android-base/hex.h>
#include <android-base/macros.h>
#include <android_runtime/vm.h>
+#include <binder/BpBinder.h>
#include <binder/Parcel.h>
#include <binder/RpcServer.h>
#include <binder/RpcTransportRaw.h>
@@ -226,6 +227,10 @@
sp<RpcSession>::fromExisting(this), reply, flags);
}
+status_t RpcSession::sendDecStrong(const BpBinder* binder) {
+ return sendDecStrong(binder->getPrivateAccessor().rpcAddress());
+}
+
status_t RpcSession::sendDecStrong(uint64_t address) {
ExclusiveConnection connection;
status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),