aboutsummaryrefslogtreecommitdiff
path: root/include/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'include/README.md')
-rw-r--r--include/README.md111
1 files changed, 0 insertions, 111 deletions
diff --git a/include/README.md b/include/README.md
deleted file mode 100644
index 83a92f70d..000000000
--- a/include/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# Perfetto public API surface
-
-**This API surface is not stable yet, don't depend on it**
-
-This folder contains the public perfetto API headers. This allows an app to
-inject trace events into perfetto with ~10 lines of code (see
-api_usage_example.cc).
-
-The ext/ subdirectory expose the API-unstable classes and types that are
-exposed to emvbedders that have exceptional requirements in terms of interposing
-their own custom IPC layer. To the day the only case is chromium. Nothing else
-should depend on ext/. Contact perfetto-dev@ if you think you need to
-depend on an ext/ header.
-
-Headers in this folder must be hermetic. No ext/ perfetto header must be
-leaked from the includes.
-
-What is a client supposed to do to use tracing? See example below in this page.
-
-
-Source code layout: what goes where?
-------------------------------------
-
-**include/perfetto (this folder):**
-Embedders are allowed to access and depend on any folder of this but ext/.
-This contains classes to: (i) use tracing; (ii) extend the tracing internals
-(i.e. implement the Platform).
-
-Rules:
-- This directory should contain only .h files and no .cc files.
-- Corresponding .cc files go into `src/`.
-- .h files in here can depend only on `include/perfetto/` but not on
- `include/perfetto/ext/`,
-
-**include/perfetto/tracing/internal:**
-This directory contains headers that are required to implement the public-facing
-tracing API efficiently but that are not part of the API surface.
-In an ideal world there would be no need of these headers and everything would
-be handle via forward-declarations and PIMPL patterns. Unfortunately, however,
-PIMPL cannot be used for inline functions, where the implementation needs to be
-exposed in the public headers, which in turn need to depend on the memory layout
-of structs/classes.
-
-Rules:
-- All classes / types declared in this folder must be wrapped in the
- ::perfetto::internal namespace.
-- Both public and internal .h headers must not pull other perfetto headers
- from ext/.
-- .cc files instead can depend on other perfetto classes, as well as .h headers
- located in src/.
-- Embedders must not depend on the perfetto::internal namespace.
-- Internal types cannot be used as input, output or return arguments of public
- API functions.
-- Internal types cannot be directly exposed to virtual methods that are
- intended to be called or overridden by the embedder (e.g. TracingBackend's
- methods). For those the solution is to create a matching non-internal base
- class with a static factory method.
-- We don't guarantee binary compatibility between versions (i.e. this client
- library can only be statically linked) but we guarantee source-level
- compatibility and ABI of the UNIX socket and shared memory buffers.
-
-
-Usage example
--------------
-1. Call `perfetto::Tracing::Initialize(...)` once, when starting the app.
- While doing so the app can chose the tracing model:
- - Fully in-process: the service runs in a thread within the same process.
- - System: connects to the traced system daemon via a UNIX socket. This allows
- the app to join system-wide tracing sessions. This is available only on
- Linux/Android/MacOS for now.
- - Private dedicated process: similar to the in-process case, but the service
- runs in a dedicated process rather than a thread. This is for performance,
- stability and security isolation. Also, this is not implemented yet.
- - Custom backend: this is for peculiar cases (mainly chromium) where the
- embedder is multi-process but wants to use a different IPC mechanism. The
- embedder needs to deal with the larger and clunkier set of perfetto APIs.
- Reach out to the team before using this mode. It's very unlikely you need
- this unless you are a project rolled into chromium.
-
-2. Define and register one or more data sources, like this:
-```cpp
- #include "perfetto/tracing.h"
-
- class MyDataSource : public perfetto::DataSource<MyDataSource> {
- void OnSetup(const SetupArgs&) override {}
- void OnStart(const StartArgs&) override {}
- void OnStop(const StopArgs&) override {}
- };
- ...
- PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(MyDataSource);
- ...
- perfetto::DataSourceDescriptor dsd;
- dsd.set_name("my_data_source");
- MyDataSource::Register(dsd);
-```
-
-3. Optionally define a new proto schema in `trace_packet.proto`
-
-4. Emit trace events
-```cpp
- MyDataSource::Trace([](MyDataSource::TraceContext ctx) {
- auto trace_packet = ctx.NewTracePacket();
- trace_packet->set_timestamp(...);
- auto* my_custom_proto = trace_packet->set_my_custom_proto();
- });
-```
-
-The passed labmda will be called only if tracing is enabled and the data source
-was enabled in the trace config. It might be called multiple times, one for each
-active tracing session, in case of concurrent tracing sessions (or even within a
-single tracing session, if the data source is listed twice in the trace config).