summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2021-05-20 00:07:41 +0000
committer Steven Moreland <smoreland@google.com> 2021-05-20 00:07:41 +0000
commite47511f808818fca08962fa268700ca3d31224a3 (patch)
tree5153a7f64ebfa2d2c7ff246baaf1e2c5095e6757
parent33fd596d5449bb9fb1dfc9bbaf53fdee1b129ba4 (diff)
libbinder: move FdTrigger to RpcSession
We need triggers accessible in RpcSession, RpcServer, and RpcState in order to shut down the join + connection + rpc handler threads (the RpcServer connection threads get transformed into becoming RpcSession threads). In order for this to be used in all these places, the most convenient location is RpcSession, since the RpcServer header imports this and the C++ standard doesn't allow for nested classes to be forward declared. Bug: 185167543 Test: binderRpcTest Change-Id: I3e655277bd183fddc6d5001280cf17a10672bea3
-rw-r--r--libs/binder/RpcServer.cpp12
-rw-r--r--libs/binder/RpcSession.cpp10
-rw-r--r--libs/binder/include/binder/RpcServer.h19
-rw-r--r--libs/binder/include/binder/RpcSession.h17
4 files changed, 29 insertions, 29 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp
index e31aea021f..df7c844bc8 100644
--- a/libs/binder/RpcServer.cpp
+++ b/libs/binder/RpcServer.cpp
@@ -128,16 +128,6 @@ sp<IBinder> RpcServer::getRootObject() {
return ret;
}
-std::unique_ptr<RpcServer::FdTrigger> RpcServer::FdTrigger::make() {
- auto ret = std::make_unique<RpcServer::FdTrigger>();
- if (!android::base::Pipe(&ret->mRead, &ret->mWrite)) return nullptr;
- return ret;
-}
-
-void RpcServer::FdTrigger::trigger() {
- mWrite.reset();
-}
-
void RpcServer::join() {
LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");
@@ -146,7 +136,7 @@ void RpcServer::join() {
LOG_ALWAYS_FATAL_IF(!mServer.ok(), "RpcServer must be setup to join.");
LOG_ALWAYS_FATAL_IF(mShutdownTrigger != nullptr, "Already joined");
mJoinThreadRunning = true;
- mShutdownTrigger = FdTrigger::make();
+ mShutdownTrigger = RpcSession::FdTrigger::make();
LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler");
}
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index 05fa49ec76..4efa6bb1a9 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -113,6 +113,16 @@ status_t RpcSession::sendDecStrong(const RpcAddress& address) {
return state()->sendDecStrong(connection.fd(), address);
}
+std::unique_ptr<RpcSession::FdTrigger> RpcSession::FdTrigger::make() {
+ auto ret = std::make_unique<RpcSession::FdTrigger>();
+ if (!android::base::Pipe(&ret->mRead, &ret->mWrite)) return nullptr;
+ return ret;
+}
+
+void RpcSession::FdTrigger::trigger() {
+ mWrite.reset();
+}
+
status_t RpcSession::readId() {
{
std::lock_guard<std::mutex> _l(mMutex);
diff --git a/libs/binder/include/binder/RpcServer.h b/libs/binder/include/binder/RpcServer.h
index 49734007ac..d1a86277f3 100644
--- a/libs/binder/include/binder/RpcServer.h
+++ b/libs/binder/include/binder/RpcServer.h
@@ -153,23 +153,6 @@ public:
void onSessionTerminating(const sp<RpcSession>& session);
private:
- /** This is not a pipe. */
- struct FdTrigger {
- static std::unique_ptr<FdTrigger> make();
- /**
- * poll() on this fd for POLLHUP to get notification when trigger is called
- */
- base::borrowed_fd readFd() const { return mRead; }
- /**
- * Close the write end of the pipe so that the read end receives POLLHUP.
- */
- void trigger();
-
- private:
- base::unique_fd mWrite;
- base::unique_fd mRead;
- };
-
friend sp<RpcServer>;
RpcServer();
@@ -188,7 +171,7 @@ private:
std::map<int32_t, sp<RpcSession>> mSessions;
int32_t mSessionIdCounter = 0;
bool mJoinThreadRunning = false;
- std::unique_ptr<FdTrigger> mShutdownTrigger;
+ std::unique_ptr<RpcSession::FdTrigger> mShutdownTrigger;
std::condition_variable mShutdownCv;
};
diff --git a/libs/binder/include/binder/RpcSession.h b/libs/binder/include/binder/RpcSession.h
index bcc213c8bd..6a60e7e999 100644
--- a/libs/binder/include/binder/RpcSession.h
+++ b/libs/binder/include/binder/RpcSession.h
@@ -112,6 +112,23 @@ private:
friend RpcServer;
RpcSession();
+ /** This is not a pipe. */
+ struct FdTrigger {
+ static std::unique_ptr<FdTrigger> make();
+ /**
+ * poll() on this fd for POLLHUP to get notification when trigger is called
+ */
+ base::borrowed_fd readFd() const { return mRead; }
+ /**
+ * Close the write end of the pipe so that the read end receives POLLHUP.
+ */
+ void trigger();
+
+ private:
+ base::unique_fd mWrite;
+ base::unique_fd mRead;
+ };
+
status_t readId();
// transfer ownership of thread