tree: 22ab1d09aea66754539092c63c7c681db85c8661 [path history] [tgz]
  1. BUILD.gn
  2. connection_info.cc
  3. connection_info.h
  4. DEPS
  5. endpoint_options.h
  6. fake_ipc_server.cc
  7. fake_ipc_server.h
  8. ipc_server.h
  9. named_mojo_ipc_server.cc
  10. named_mojo_ipc_server.h
  11. named_mojo_ipc_server_client_util.cc
  12. named_mojo_ipc_server_client_util.h
  13. named_mojo_ipc_server_unittest.cc
  14. named_mojo_ipc_test_util.cc
  15. named_mojo_ipc_test_util.h
  16. named_mojo_ipc_util.cc
  17. named_mojo_ipc_util.h
  18. named_mojo_message_pipe_server.cc
  19. named_mojo_message_pipe_server.h
  20. named_mojo_server_endpoint_connector.cc
  21. named_mojo_server_endpoint_connector.h
  22. named_mojo_server_endpoint_connector_linux.cc
  23. named_mojo_server_endpoint_connector_mac.cc
  24. named_mojo_server_endpoint_connector_unsupported.cc
  25. named_mojo_server_endpoint_connector_win.cc
  26. OWNERS
  27. README.md
  28. testing.test-mojom
components/named_mojo_ipc_server/README.md

This component provides a helper that allows a server process to handle multiple concurrent IPCs coming through a NamedPlatformChannel.

Example usage

In the server process:

static const uint64_t kMessagePipeId = 0u;

class MyInterfaceImpl: public mojom::MyInterface {
  void Start() {
    server_.set_disconnect_handler(
        base::BindRepeating(&MyInterfaceImpl::OnDisconnected, this));
    server_.StartServer();
  }

  void OnDisconnected() {
    LOG(INFO) << "Receiver disconnected: " << server_.current_receiver();
  }

  // mojom::MyInterface Implementation.
  void DoWork() override {
    // Do something...

    // If you want to close the connection:
    server_.Close(server_.current_receiver());
  }

  NamedMojoIpcServer<mojom::MyInterface> server_{
      {
        .server_name = "my_server_name",
        .message_pipe_id = kMessagePipeId,
        // Other options when necessary...
      }, this,
      base::BindRepeating([](mojom::MyInterface* impl, base::ProcessId caller) {
        // Verify the calling process, returning nullptr if unverified.
        return impl; // impl must outlive NamedMojoIpcServer.
      }, this)};
};

Note: In unittests base::test:TaskEnvironment should run until idle after NamedMojoIpcServer is shutdown. Otherwise, memory may leak. E.g:

void MyTestFixture::TearDown() {
   ipc_server_->StopServer();
   task_environment_.RunUntilIdle();
 }

In the client:

void ConnectToServer() {
mojo::PlatformChannelEndpoint endpoint =
      named_mojo_ipc_server::ConnectToServer(server_name);
auto invitation = mojo::IncomingInvitation::Accept(std::move(endpoint));
mojo::Remote<mojom::MyInterface> remote(
  mojo::PendingRemote<mojom::MyInterface>(
    invitation.ExtractMessagePipe(kMessagePipeId), 0));
}

Note that for compatibility with all supported platforms clients should use named_mojo_ipc_server::ConnectToServer instead of mojo::NamedPlatformChannel::ConnectToServer. Some platforms require additional connection brokerage steps which are abstracted by the former.

On Windows, the server needs to have the following access rights on the client process: PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION.

It is possible to bind a different implementation of the interface to each connection by returning different mojom::MyInterface* values rather than this. All implementations must outlive the NamedMojoIpcServer.