Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 172473fc authored by Inseob Kim's avatar Inseob Kim
Browse files

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
parent e12fccc4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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.
+8 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
LIBBINDER_RPC_UNSTABLE_SHIM { # platform-only
  global:
    RunRpcServer;
    RunRpcServerCallback;
    RpcClient;
    RpcPreconnectedClient;
  local: