普通文本  |  46行  |  1.96 KB

# Perfetto IPC

*** note
**This doc is WIP**, stay tuned.
<!-- TODO(primiano): write IPC doc. -->
***

**TL;DR**  
We needed an IPC for Android and Linux which was small, simple, controllable,
predictable, C++11 friendly and debuggable.
Our IPC transport is not mandatory outside of Android, you can wrap your own IPC
transport (e.g., Perfetto uses Mojo in chromium) or just short circuit the
Perfetto `{Service,Producer,Consumer}` interfaces for IPC-less full in-process
use.

Key features:
- Protobuf over a unix-socket.
- Allows to send file descriptors over the wire: for setting up shared memory
  and passing the FD for the output trace from a consumer to the service.
- Service definition uses same protobuf rpc syntax of [gRPC](https://grpc.io)
- Extremely simple [wire protocol](/src/ipc/wire_protocol.proto).
- C++11 friendly, allows to bind `std::function` to each request.
- Leak (un)friendly: tries hard to guarantee that callbacks are left unresolved,
  using C++11 move semantics.
- Shutdown / destruction friendly: tries hard to guarantee that no callbacks are
  issued after the IPC channel is destroyed.
- Disconnection-friendly: all outstanding requests (and hence pending callbacks)
  are nack-ed in case of a disconnection (e.g., if the endpoint crashes).
- Memory friendly: one virtually contiguous cache-friendly rx buffer,
  madvise()'d when when not used.
- Debugging friendly: single-thread only, based on non-blocking socket I/O.
- Binary size friendly: generates one protobuf per message, doesn't have any
  external dependency.
- Hopefully safe:
  - The rx buffer has guard regions around.
  - The wire protocol is based on protobuf.
  - [Fuzzed](/src/ipc/buffered_frame_deserializer_fuzzer.cc)
- Offers direct control of socket buffers and overrun/stalling policy.
- ABI stable.

Realistically will never support:
  - Multithreading / thread pools.
  - Congestion or flow control.
  - Non-data object brokering (e.g. sending a remote interface).
  - Introspection / reflection.