diff options
| author | 2022-11-12 00:06:39 +0000 | |
|---|---|---|
| committer | 2022-11-12 00:06:39 +0000 | |
| commit | 2f899ba8c40962ec3574729eaab11050c174496f (patch) | |
| tree | dc6c8ff4e12bac8eb574a4335dbe5101eba4e69e /libs/binder/RpcServer.cpp | |
| parent | f25146640240e33058771191495c63aa1e9ef49e (diff) | |
| parent | 28987cfe8f45330896ab55d916ac823978aa0e4f (diff) | |
Merge "[rpc_binder] Implement RPC binder over init-managed Unix domain socket" am: 213454462c am: ffb1209149 am: 28987cfe8f
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2267564
Change-Id: I80baf8112cb093748eee221803440607299237ab
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libs/binder/RpcServer.cpp')
| -rw-r--r-- | libs/binder/RpcServer.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index 83d0de7835..399667d02b 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -564,6 +564,29 @@ status_t RpcServer::setupSocketServer(const RpcSocketAddress& addr) { return OK; } +status_t RpcServer::setupRawSocketServer(base::unique_fd socket_fd) { + RpcTransportFd transportFd(std::move(socket_fd)); + if (!transportFd.fd.ok()) { + int savedErrno = errno; + ALOGE("Could not get initialized Unix socket: %s", strerror(savedErrno)); + return -savedErrno; + } + // Right now, we create all threads at once, making accept4 slow. To avoid hanging the client, + // the backlog is increased to a large number. + // TODO(b/189955605): Once we create threads dynamically & lazily, the backlog can be reduced + // to 1. + if (0 != TEMP_FAILURE_RETRY(listen(transportFd.fd.get(), 50 /*backlog*/))) { + int savedErrno = errno; + ALOGE("Could not listen initialized Unix socket: %s", strerror(savedErrno)); + return -savedErrno; + } + if (status_t status = setupExternalServer(std::move(transportFd.fd)); status != OK) { + ALOGE("Another thread has set up server while calling setupSocketServer. Race?"); + return status; + } + return OK; +} + void RpcServer::onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) { const std::vector<uint8_t>& id = session->mId; LOG_ALWAYS_FATAL_IF(id.empty(), "Server sessions must be initialized with ID"); |