From 172473fcdf9b496dbfa019907f6dd8b328f6ae7f Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Tue, 7 Sep 2021 21:01:33 +0900 Subject: Support callback for rpc server In case that a user want to be notified, a callback will be called after setting up the RPC server. Bug: 195381416 Test: atest MicrodroidHostTestCases Test: run microdroid demo app Change-Id: Ia98bfb879a434935d9708a6dcd4aa19c4d46ffe4 --- libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp | 9 +++++++++ libs/binder/libbinder_rpc_unstable.cpp | 9 ++++++++- libs/binder/libbinder_rpc_unstable.map.txt | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) (limited to 'libs') diff --git a/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp b/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp index 0309d6ca53..08f5eedacd 100644 --- a/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp +++ b/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp @@ -20,7 +20,16 @@ extern "C" { struct AIBinder; +// Starts an RPC server on a given port and a given root IBinder object. +// This function sets up the server and joins before returning. bool RunRpcServer(AIBinder* service, unsigned int port); + +// Starts an RPC server on a given port and a given root IBinder object. +// This function sets up the server, calls readyCallback with a given param, and +// then joins before returning. +bool RunRpcServerCallback(AIBinder* service, unsigned int port, void (*readyCallback)(void* param), + void* param); + AIBinder* RpcClient(unsigned int cid, unsigned int port); // Connect to an RPC server with preconnected file descriptors. diff --git a/libs/binder/libbinder_rpc_unstable.cpp b/libs/binder/libbinder_rpc_unstable.cpp index 304415a7ce..cad55fb439 100644 --- a/libs/binder/libbinder_rpc_unstable.cpp +++ b/libs/binder/libbinder_rpc_unstable.cpp @@ -29,7 +29,8 @@ using android::base::unique_fd; extern "C" { -bool RunRpcServer(AIBinder* service, unsigned int port) { +bool RunRpcServerCallback(AIBinder* service, unsigned int port, void (*readyCallback)(void* param), + void* param) { auto server = RpcServer::make(); server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction(); if (status_t status = server->setupVsockServer(port); status != OK) { @@ -38,6 +39,8 @@ bool RunRpcServer(AIBinder* service, unsigned int port) { return false; } server->setRootObject(AIBinder_toPlatformBinder(service)); + + if (readyCallback) readyCallback(param); server->join(); // Shutdown any open sessions since server failed. @@ -45,6 +48,10 @@ bool RunRpcServer(AIBinder* service, unsigned int port) { return true; } +bool RunRpcServer(AIBinder* service, unsigned int port) { + return RunRpcServerCallback(service, port, nullptr, nullptr); +} + AIBinder* RpcClient(unsigned int cid, unsigned int port) { auto session = RpcSession::make(); if (status_t status = session->setupVsockClient(cid, port); status != OK) { diff --git a/libs/binder/libbinder_rpc_unstable.map.txt b/libs/binder/libbinder_rpc_unstable.map.txt index 1138786a64..e8565695a3 100644 --- a/libs/binder/libbinder_rpc_unstable.map.txt +++ b/libs/binder/libbinder_rpc_unstable.map.txt @@ -1,6 +1,7 @@ LIBBINDER_RPC_UNSTABLE_SHIM { # platform-only global: RunRpcServer; + RunRpcServerCallback; RpcClient; RpcPreconnectedClient; local: -- cgit v1.2.3-59-g8ed1b