diff options
Diffstat (limited to 'libs/binder/RpcSession.cpp')
-rw-r--r-- | libs/binder/RpcSession.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
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); |