class TracingTLS
Defined at line 67 of file ../../third_party/perfetto/include/perfetto/tracing/internal/tracing_tls.h
Organization of the thread-local storage
----------------------------------------
First of all, remember the cardinality of the problem: at any point in time
there are M data sources registered (i.e. number of subclasses of DataSource)
and up to N concurrent instances for each data source, so up to M * N total
data source instances around.
Each data source instance can be accessed by T threads (no upper bound).
We can safely put hard limits both to M and N (i.e. say that we support at
most 32 data source types per process and up to 8 concurrent instances).
We want to make it so from the Platform viewpoint, we use only one global
TLS object, so T instances in total, one per thread, regardless of M and N.
This allows to deal with at-thread-exit destruction only in one place, rather
than N, M or M * N.
Visually:
[ Thread 1 ] [ Thread 2 ] [ Thread T ]
+---------------+ +---------------+ +---------------+
Data source Foo | | | | | |
Instance 1 | TLS | | TLS | | TLS |
Instance 2 | Object | | Object | | Object |
Instance 3 | | | | | |
| | | | | |
Data source Bar | | | | | |
Instance 1 | | | | | |
Instance 2 | | | | | |
+---------------+ +---------------+ +---------------+
Each TLS Object is organized as an array of M DataSourceThreadLocalState.
Each DSTLS itself is an array of up to N per-instance objects.
The only per-instance object for now is the TraceWriter.
So for each data source, for each instance, for each thread we keep one
TraceWriter.
The lookup is O(1): Given the TLS object, the TraceWriter is just tls[M][N].
Public Members
uint32_t generation
bool is_in_trace_point
uint32_t cached_instances
array data_sources_tls
DataSourceThreadLocalState track_event_tls
Public Methods
void ~TracingTLS ()