diff options
-rw-r--r-- | libs/binder/RpcServer.cpp | 19 | ||||
-rw-r--r-- | libs/binder/RpcSession.cpp | 21 | ||||
-rw-r--r-- | libs/binder/include/binder/RpcSession.h | 10 |
3 files changed, 32 insertions, 18 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index df7c844bc8..249ce6c81e 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -16,14 +16,12 @@ #define LOG_TAG "RpcServer" -#include <poll.h> #include <sys/socket.h> #include <sys/un.h> #include <thread> #include <vector> -#include <android-base/macros.h> #include <android-base/scopeguard.h> #include <binder/Parcel.h> #include <binder/RpcServer.h> @@ -140,22 +138,7 @@ void RpcServer::join() { LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler"); } - while (true) { - pollfd pfd[]{{.fd = mServer.get(), .events = POLLIN, .revents = 0}, - {.fd = mShutdownTrigger->readFd().get(), .events = POLLHUP, .revents = 0}}; - int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1)); - if (ret < 0) { - ALOGE("Could not poll socket: %s", strerror(errno)); - continue; - } - if (ret == 0) { - continue; - } - if (pfd[1].revents & POLLHUP) { - LOG_RPC_DETAIL("join() exiting because shutdown requested."); - break; - } - + while (mShutdownTrigger->triggerablePollRead(mServer)) { (void)acceptOneNoCheck(); } diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp index 4efa6bb1a9..ea82f36400 100644 --- a/libs/binder/RpcSession.cpp +++ b/libs/binder/RpcSession.cpp @@ -19,10 +19,12 @@ #include <binder/RpcSession.h> #include <inttypes.h> +#include <poll.h> #include <unistd.h> #include <string_view> +#include <android-base/macros.h> #include <binder/Parcel.h> #include <binder/RpcServer.h> #include <binder/Stability.h> @@ -123,6 +125,25 @@ void RpcSession::FdTrigger::trigger() { mWrite.reset(); } +bool RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) { + while (true) { + pollfd pfd[]{{.fd = fd.get(), .events = POLLIN, .revents = 0}, + {.fd = mRead.get(), .events = POLLHUP, .revents = 0}}; + int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1)); + if (ret < 0) { + ALOGE("Could not poll: %s", strerror(errno)); + continue; + } + if (ret == 0) { + continue; + } + if (pfd[1].revents & POLLHUP) { + return false; + } + return true; + } +} + status_t RpcSession::readId() { { std::lock_guard<std::mutex> _l(mMutex); diff --git a/libs/binder/include/binder/RpcSession.h b/libs/binder/include/binder/RpcSession.h index 6a60e7e999..bcef8dca5b 100644 --- a/libs/binder/include/binder/RpcSession.h +++ b/libs/binder/include/binder/RpcSession.h @@ -119,11 +119,21 @@ private: * 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(); + /** + * Poll for a read event. + * + * Return: + * true - time to read! + * false - trigger happened + */ + bool triggerablePollRead(base::borrowed_fd fd); + private: base::unique_fd mWrite; base::unique_fd mRead; |