Loading libs/binder/FdTrigger.cpp +0 −15 Original line number Diff line number Diff line Loading @@ -59,19 +59,4 @@ status_t FdTrigger::triggerablePoll(base::borrowed_fd fd, int16_t event) { } } android::base::Result<bool> FdTrigger::isTriggeredPolled() { pollfd pfd{.fd = mRead.get(), .events = 0, .revents = 0}; int ret = TEMP_FAILURE_RETRY(poll(&pfd, 1, 0)); if (ret < 0) { return android::base::ErrnoError() << "FdTrigger::isTriggeredPolled: Error in poll()"; } if (ret == 0) { return false; } if (pfd.revents & POLLHUP) { return true; } return android::base::Error() << "FdTrigger::isTriggeredPolled: poll() returns " << pfd.revents; } } // namespace android libs/binder/FdTrigger.h +7 −13 Original line number Diff line number Diff line Loading @@ -35,9 +35,13 @@ public: void trigger(); /** * Check whether this has been triggered by checking the write end. * Check whether this has been triggered by checking the write end. Note: * this has no internal locking, and it is inherently racey, but this is * okay, because if we accidentally return false when a trigger has already * happened, we can imagine that instead, the scheduler actually executed * the code which is polling isTriggered earlier. */ bool isTriggered(); [[nodiscard]] bool isTriggered(); /** * Poll for a read event. Loading @@ -48,17 +52,7 @@ public: * true - time to read! * false - trigger happened */ status_t triggerablePoll(base::borrowed_fd fd, int16_t event); /** * Check whether this has been triggered by poll()ing the read end. * * Return: * true - triggered * false - not triggered * error - error when polling */ android::base::Result<bool> isTriggeredPolled(); [[nodiscard]] status_t triggerablePoll(base::borrowed_fd fd, int16_t event); private: base::unique_fd mWrite; Loading libs/binder/RpcTransportRaw.cpp +16 −26 Original line number Diff line number Diff line Loading @@ -35,20 +35,6 @@ namespace { class RpcTransportRaw : public RpcTransport { public: explicit RpcTransportRaw(android::base::unique_fd socket) : mSocket(std::move(socket)) {} Result<size_t> send(const void* buf, size_t size) { ssize_t ret = TEMP_FAILURE_RETRY(::send(mSocket.get(), buf, size, MSG_NOSIGNAL)); if (ret < 0) { return ErrnoError() << "send()"; } return ret; } Result<size_t> recv(void* buf, size_t size) { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_NOSIGNAL)); if (ret < 0) { return ErrnoError() << "recv()"; } return ret; } Result<size_t> peek(void *buf, size_t size) override { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_PEEK)); if (ret < 0) { Loading @@ -65,15 +51,17 @@ public: status_t status; while ((status = fdTrigger->triggerablePoll(mSocket.get(), POLLOUT)) == OK) { auto writeSize = this->send(buffer, end - buffer); if (!writeSize.ok()) { LOG_RPC_DETAIL("RpcTransport::send(): %s", writeSize.error().message().c_str()); return writeSize.error().code() == 0 ? UNKNOWN_ERROR : -writeSize.error().code(); ssize_t writeSize = TEMP_FAILURE_RETRY(::send(mSocket.get(), buffer, end - buffer, MSG_NOSIGNAL)); if (writeSize < 0) { int savedErrno = errno; LOG_RPC_DETAIL("RpcTransport send(): %s", strerror(savedErrno)); return -savedErrno; } if (*writeSize == 0) return DEAD_OBJECT; if (writeSize == 0) return DEAD_OBJECT; buffer += *writeSize; buffer += writeSize; if (buffer == end) return OK; } return status; Loading @@ -87,15 +75,17 @@ public: status_t status; while ((status = fdTrigger->triggerablePoll(mSocket.get(), POLLIN)) == OK) { auto readSize = this->recv(buffer, end - buffer); if (!readSize.ok()) { LOG_RPC_DETAIL("RpcTransport::recv(): %s", readSize.error().message().c_str()); return readSize.error().code() == 0 ? UNKNOWN_ERROR : -readSize.error().code(); ssize_t readSize = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buffer, end - buffer, MSG_NOSIGNAL)); if (readSize < 0) { int savedErrno = errno; LOG_RPC_DETAIL("RpcTransport recv(): %s", strerror(savedErrno)); return -savedErrno; } if (*readSize == 0) return DEAD_OBJECT; // EOF if (readSize == 0) return DEAD_OBJECT; // EOF buffer += *readSize; buffer += readSize; if (buffer == end) return OK; } return status; Loading libs/binder/RpcTransportTls.cpp +2 −13 Original line number Diff line number Diff line Loading @@ -319,8 +319,6 @@ public: private: android::base::unique_fd mSocket; Ssl mSsl; static status_t isTriggered(FdTrigger* fdTrigger); }; // Error code is errno. Loading @@ -341,15 +339,6 @@ Result<size_t> RpcTransportTls::peek(void* buf, size_t size) { return ret; } status_t RpcTransportTls::isTriggered(FdTrigger* fdTrigger) { auto ret = fdTrigger->isTriggeredPolled(); if (!ret.ok()) { ALOGE("%s: %s", __PRETTY_FUNCTION__, ret.error().message().c_str()); return ret.error().code() == 0 ? UNKNOWN_ERROR : -ret.error().code(); } return *ret ? -ECANCELED : OK; } status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, const void* data, size_t size) { auto buffer = reinterpret_cast<const uint8_t*>(data); Loading @@ -359,7 +348,7 @@ status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, const vo // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (status_t status = isTriggered(fdTrigger); status != OK) return status; if (fdTrigger->isTriggered()) return -ECANCELED; while (buffer < end) { size_t todo = std::min<size_t>(end - buffer, std::numeric_limits<int>::max()); Loading Loading @@ -390,7 +379,7 @@ status_t RpcTransportTls::interruptableReadFully(FdTrigger* fdTrigger, void* dat // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (status_t status = isTriggered(fdTrigger); status != OK) return status; if (fdTrigger->isTriggered()) return -ECANCELED; while (buffer < end) { size_t todo = std::min<size_t>(end - buffer, std::numeric_limits<int>::max()); Loading libs/binder/include/binder/RpcTransport.h +5 −4 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ public: virtual ~RpcTransport() = default; // replacement of ::recv(MSG_PEEK). Error code may not be set if TLS is enabled. virtual android::base::Result<size_t> peek(void *buf, size_t size) = 0; [[nodiscard]] virtual android::base::Result<size_t> peek(void *buf, size_t size) = 0; /** * Read (or write), but allow to be interrupted by a trigger. Loading @@ -47,9 +47,10 @@ public: * OK - succeeded in completely processing 'size' * error - interrupted (failure or trigger) */ virtual status_t interruptableWriteFully(FdTrigger *fdTrigger, const void *buf, [[nodiscard]] virtual status_t interruptableWriteFully(FdTrigger *fdTrigger, const void *buf, size_t size) = 0; [[nodiscard]] virtual status_t interruptableReadFully(FdTrigger *fdTrigger, void *buf, size_t size) = 0; virtual status_t interruptableReadFully(FdTrigger *fdTrigger, void *buf, size_t size) = 0; protected: RpcTransport() = default; Loading Loading
libs/binder/FdTrigger.cpp +0 −15 Original line number Diff line number Diff line Loading @@ -59,19 +59,4 @@ status_t FdTrigger::triggerablePoll(base::borrowed_fd fd, int16_t event) { } } android::base::Result<bool> FdTrigger::isTriggeredPolled() { pollfd pfd{.fd = mRead.get(), .events = 0, .revents = 0}; int ret = TEMP_FAILURE_RETRY(poll(&pfd, 1, 0)); if (ret < 0) { return android::base::ErrnoError() << "FdTrigger::isTriggeredPolled: Error in poll()"; } if (ret == 0) { return false; } if (pfd.revents & POLLHUP) { return true; } return android::base::Error() << "FdTrigger::isTriggeredPolled: poll() returns " << pfd.revents; } } // namespace android
libs/binder/FdTrigger.h +7 −13 Original line number Diff line number Diff line Loading @@ -35,9 +35,13 @@ public: void trigger(); /** * Check whether this has been triggered by checking the write end. * Check whether this has been triggered by checking the write end. Note: * this has no internal locking, and it is inherently racey, but this is * okay, because if we accidentally return false when a trigger has already * happened, we can imagine that instead, the scheduler actually executed * the code which is polling isTriggered earlier. */ bool isTriggered(); [[nodiscard]] bool isTriggered(); /** * Poll for a read event. Loading @@ -48,17 +52,7 @@ public: * true - time to read! * false - trigger happened */ status_t triggerablePoll(base::borrowed_fd fd, int16_t event); /** * Check whether this has been triggered by poll()ing the read end. * * Return: * true - triggered * false - not triggered * error - error when polling */ android::base::Result<bool> isTriggeredPolled(); [[nodiscard]] status_t triggerablePoll(base::borrowed_fd fd, int16_t event); private: base::unique_fd mWrite; Loading
libs/binder/RpcTransportRaw.cpp +16 −26 Original line number Diff line number Diff line Loading @@ -35,20 +35,6 @@ namespace { class RpcTransportRaw : public RpcTransport { public: explicit RpcTransportRaw(android::base::unique_fd socket) : mSocket(std::move(socket)) {} Result<size_t> send(const void* buf, size_t size) { ssize_t ret = TEMP_FAILURE_RETRY(::send(mSocket.get(), buf, size, MSG_NOSIGNAL)); if (ret < 0) { return ErrnoError() << "send()"; } return ret; } Result<size_t> recv(void* buf, size_t size) { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_NOSIGNAL)); if (ret < 0) { return ErrnoError() << "recv()"; } return ret; } Result<size_t> peek(void *buf, size_t size) override { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_PEEK)); if (ret < 0) { Loading @@ -65,15 +51,17 @@ public: status_t status; while ((status = fdTrigger->triggerablePoll(mSocket.get(), POLLOUT)) == OK) { auto writeSize = this->send(buffer, end - buffer); if (!writeSize.ok()) { LOG_RPC_DETAIL("RpcTransport::send(): %s", writeSize.error().message().c_str()); return writeSize.error().code() == 0 ? UNKNOWN_ERROR : -writeSize.error().code(); ssize_t writeSize = TEMP_FAILURE_RETRY(::send(mSocket.get(), buffer, end - buffer, MSG_NOSIGNAL)); if (writeSize < 0) { int savedErrno = errno; LOG_RPC_DETAIL("RpcTransport send(): %s", strerror(savedErrno)); return -savedErrno; } if (*writeSize == 0) return DEAD_OBJECT; if (writeSize == 0) return DEAD_OBJECT; buffer += *writeSize; buffer += writeSize; if (buffer == end) return OK; } return status; Loading @@ -87,15 +75,17 @@ public: status_t status; while ((status = fdTrigger->triggerablePoll(mSocket.get(), POLLIN)) == OK) { auto readSize = this->recv(buffer, end - buffer); if (!readSize.ok()) { LOG_RPC_DETAIL("RpcTransport::recv(): %s", readSize.error().message().c_str()); return readSize.error().code() == 0 ? UNKNOWN_ERROR : -readSize.error().code(); ssize_t readSize = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buffer, end - buffer, MSG_NOSIGNAL)); if (readSize < 0) { int savedErrno = errno; LOG_RPC_DETAIL("RpcTransport recv(): %s", strerror(savedErrno)); return -savedErrno; } if (*readSize == 0) return DEAD_OBJECT; // EOF if (readSize == 0) return DEAD_OBJECT; // EOF buffer += *readSize; buffer += readSize; if (buffer == end) return OK; } return status; Loading
libs/binder/RpcTransportTls.cpp +2 −13 Original line number Diff line number Diff line Loading @@ -319,8 +319,6 @@ public: private: android::base::unique_fd mSocket; Ssl mSsl; static status_t isTriggered(FdTrigger* fdTrigger); }; // Error code is errno. Loading @@ -341,15 +339,6 @@ Result<size_t> RpcTransportTls::peek(void* buf, size_t size) { return ret; } status_t RpcTransportTls::isTriggered(FdTrigger* fdTrigger) { auto ret = fdTrigger->isTriggeredPolled(); if (!ret.ok()) { ALOGE("%s: %s", __PRETTY_FUNCTION__, ret.error().message().c_str()); return ret.error().code() == 0 ? UNKNOWN_ERROR : -ret.error().code(); } return *ret ? -ECANCELED : OK; } status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, const void* data, size_t size) { auto buffer = reinterpret_cast<const uint8_t*>(data); Loading @@ -359,7 +348,7 @@ status_t RpcTransportTls::interruptableWriteFully(FdTrigger* fdTrigger, const vo // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (status_t status = isTriggered(fdTrigger); status != OK) return status; if (fdTrigger->isTriggered()) return -ECANCELED; while (buffer < end) { size_t todo = std::min<size_t>(end - buffer, std::numeric_limits<int>::max()); Loading Loading @@ -390,7 +379,7 @@ status_t RpcTransportTls::interruptableReadFully(FdTrigger* fdTrigger, void* dat // Before doing any I/O, check trigger once. This ensures the trigger is checked at least // once. The trigger is also checked via triggerablePoll() after every SSL_write(). if (status_t status = isTriggered(fdTrigger); status != OK) return status; if (fdTrigger->isTriggered()) return -ECANCELED; while (buffer < end) { size_t todo = std::min<size_t>(end - buffer, std::numeric_limits<int>::max()); Loading
libs/binder/include/binder/RpcTransport.h +5 −4 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ public: virtual ~RpcTransport() = default; // replacement of ::recv(MSG_PEEK). Error code may not be set if TLS is enabled. virtual android::base::Result<size_t> peek(void *buf, size_t size) = 0; [[nodiscard]] virtual android::base::Result<size_t> peek(void *buf, size_t size) = 0; /** * Read (or write), but allow to be interrupted by a trigger. Loading @@ -47,9 +47,10 @@ public: * OK - succeeded in completely processing 'size' * error - interrupted (failure or trigger) */ virtual status_t interruptableWriteFully(FdTrigger *fdTrigger, const void *buf, [[nodiscard]] virtual status_t interruptableWriteFully(FdTrigger *fdTrigger, const void *buf, size_t size) = 0; [[nodiscard]] virtual status_t interruptableReadFully(FdTrigger *fdTrigger, void *buf, size_t size) = 0; virtual status_t interruptableReadFully(FdTrigger *fdTrigger, void *buf, size_t size) = 0; protected: RpcTransport() = default; Loading