blob: d1a7e356be175d447d9ffb1a3a97969f9ddb9711 [file] [log] [blame]
Primiano Tucci4f9b6d72017-12-05 20:59:16 +00001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Florian Mayer6a1a4d52018-06-08 16:47:07 +010017#ifndef SRC_TRACING_CORE_TRACING_SERVICE_IMPL_H_
18#define SRC_TRACING_CORE_TRACING_SERVICE_IMPL_H_
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000019
20#include <functional>
21#include <map>
22#include <memory>
Primiano Tucci42e2de12017-12-07 16:46:04 +000023#include <set>
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000024
Eric Seckler57c89d92018-10-26 15:11:55 +010025#include "perfetto/base/gtest_prod_util.h"
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010026#include "perfetto/base/logging.h"
Sami Kyostilafbccb3c2018-03-21 14:00:47 +000027#include "perfetto/base/time.h"
Primiano Tucci42e2de12017-12-07 16:46:04 +000028#include "perfetto/base/weak_ptr.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000029#include "perfetto/tracing/core/basic_types.h"
Primiano Tucciecf9e4a2018-03-14 14:51:58 +000030#include "perfetto/tracing/core/commit_data_request.h"
Primiano Tucci53589332017-12-19 11:31:13 +010031#include "perfetto/tracing/core/data_source_descriptor.h"
Primiano Tucci53589332017-12-19 11:31:13 +010032#include "perfetto/tracing/core/shared_memory_abi.h"
Oystein Eftevaag1269b4a2018-01-10 16:29:38 -080033#include "perfetto/tracing/core/trace_config.h"
Florian Mayer6a1a4d52018-06-08 16:47:07 +010034#include "perfetto/tracing/core/tracing_service.h"
Primiano Tucci53589332017-12-19 11:31:13 +010035#include "src/tracing/core/id_allocator.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000036
37namespace perfetto {
38
39namespace base {
40class TaskRunner;
41} // namespace base
42
Primiano Tucci42e2de12017-12-07 16:46:04 +000043class Consumer;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000044class DataSourceConfig;
45class Producer;
46class SharedMemory;
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010047class SharedMemoryArbiterImpl;
Hector Dearman6214c8f2018-03-27 16:16:22 +010048class TraceBuffer;
Primiano Tucci42e2de12017-12-07 16:46:04 +000049class TraceConfig;
Sami Kyostilafbccb3c2018-03-21 14:00:47 +000050class TracePacket;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000051
52// The tracing service business logic.
Florian Mayer6a1a4d52018-06-08 16:47:07 +010053class TracingServiceImpl : public TracingService {
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000054 public:
Primiano Tucci1a1951d2018-04-04 21:08:16 +020055 static constexpr size_t kDefaultShmSize = 256 * 1024ul;
Primiano Tuccie7ca7c62018-04-07 08:28:03 +020056 static constexpr size_t kMaxShmSize = 32 * 1024 * 1024ul;
Primiano Tuccibaeecf12018-07-25 12:02:20 +010057 static constexpr uint32_t kDataSourceStopTimeoutMs = 5000;
Primiano Tucci9754d0d2018-09-15 12:41:46 +010058 static constexpr uint8_t kSyncMarker[] = {0x82, 0x47, 0x7a, 0x76, 0xb2, 0x8d,
59 0x42, 0xba, 0x81, 0xdc, 0x33, 0x32,
60 0x6d, 0x57, 0xa0, 0x79};
Primiano Tucci1a1951d2018-04-04 21:08:16 +020061
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000062 // The implementation behind the service endpoint exposed to each producer.
Florian Mayer6a1a4d52018-06-08 16:47:07 +010063 class ProducerEndpointImpl : public TracingService::ProducerEndpoint {
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000064 public:
65 ProducerEndpointImpl(ProducerID,
Sami Kyostila32e0b542018-02-14 08:55:43 +000066 uid_t uid,
Florian Mayer6a1a4d52018-06-08 16:47:07 +010067 TracingServiceImpl*,
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000068 base::TaskRunner*,
Isabelle Taylor86262cb2018-03-27 16:00:54 +010069 Producer*,
70 const std::string& producer_name);
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000071 ~ProducerEndpointImpl() override;
72
Florian Mayer6a1a4d52018-06-08 16:47:07 +010073 // TracingService::ProducerEndpoint implementation.
Primiano Tucci9daa4832018-03-28 23:28:17 +010074 void RegisterDataSource(const DataSourceDescriptor&) override;
75 void UnregisterDataSource(const std::string& name) override;
Eric Seckler1c4e1ac2018-11-29 10:23:14 +000076 void RegisterTraceWriter(uint32_t writer_id,
77 uint32_t target_buffer) override;
78 void UnregisterTraceWriter(uint32_t writer_id) override;
Primiano Tucci3e69ed92018-03-14 14:52:29 +000079 void CommitData(const CommitDataRequest&, CommitDataCallback) override;
Isabelle Taylor69faa902018-03-21 15:42:03 +000080 void SetSharedMemory(std::unique_ptr<SharedMemory>);
Primiano Tucciaf429f92017-12-19 01:51:50 +010081 std::unique_ptr<TraceWriter> CreateTraceWriter(BufferID) override;
Primiano Tuccid52e6272018-04-06 19:06:53 +020082 void NotifyFlushComplete(FlushRequestID) override;
Primiano Tuccibaeecf12018-07-25 12:02:20 +010083 void NotifyDataSourceStopped(DataSourceInstanceID) override;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000084 SharedMemory* shared_memory() const override;
Isabelle Taylor69faa902018-03-21 15:42:03 +000085 size_t shared_buffer_page_size_kb() const override;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000086
Primiano Tuccibaeecf12018-07-25 12:02:20 +010087 void OnTracingSetup();
Primiano Tucci674076d2018-10-01 10:41:09 +010088 void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&);
Primiano Tucciafb72b52018-09-25 09:37:24 +010089 void StartDataSource(DataSourceInstanceID, const DataSourceConfig&);
Primiano Tucci674076d2018-10-01 10:41:09 +010090 void StopDataSource(DataSourceInstanceID);
Primiano Tuccibaeecf12018-07-25 12:02:20 +010091 void Flush(FlushRequestID, const std::vector<DataSourceInstanceID>&);
92
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000093 private:
Florian Mayer6a1a4d52018-06-08 16:47:07 +010094 friend class TracingServiceImpl;
95 friend class TracingServiceImplTest;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000096 ProducerEndpointImpl(const ProducerEndpointImpl&) = delete;
97 ProducerEndpointImpl& operator=(const ProducerEndpointImpl&) = delete;
Primiano Tuccidca727d2018-04-04 11:31:55 +020098 SharedMemoryArbiterImpl* GetOrCreateShmemArbiter();
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000099
100 ProducerID const id_;
Sami Kyostila32e0b542018-02-14 08:55:43 +0000101 const uid_t uid_;
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100102 TracingServiceImpl* const service_;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000103 base::TaskRunner* const task_runner_;
104 Producer* producer_;
105 std::unique_ptr<SharedMemory> shared_memory_;
Isabelle Taylor69faa902018-03-21 15:42:03 +0000106 size_t shared_buffer_page_size_kb_ = 0;
Primiano Tucci53589332017-12-19 11:31:13 +0100107 SharedMemoryABI shmem_abi_;
Primiano Tucci1a1951d2018-04-04 21:08:16 +0200108 size_t shmem_size_hint_bytes_ = 0;
Isabelle Taylor86262cb2018-03-27 16:00:54 +0100109 const std::string name_;
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100110
111 // This is used only in in-process configurations (mostly tests).
112 std::unique_ptr<SharedMemoryArbiterImpl> inproc_shmem_arbiter_;
Florian Mayercd08ec62018-01-31 17:49:25 +0000113 PERFETTO_THREAD_CHECKER(thread_checker_)
Primiano Tuccidca727d2018-04-04 11:31:55 +0200114 base::WeakPtrFactory<ProducerEndpointImpl> weak_ptr_factory_; // Keep last.
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000115 };
116
Primiano Tucci42e2de12017-12-07 16:46:04 +0000117 // The implementation behind the service endpoint exposed to each consumer.
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100118 class ConsumerEndpointImpl : public TracingService::ConsumerEndpoint {
Primiano Tucci42e2de12017-12-07 16:46:04 +0000119 public:
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100120 ConsumerEndpointImpl(TracingServiceImpl*, base::TaskRunner*, Consumer*);
Primiano Tucci42e2de12017-12-07 16:46:04 +0000121 ~ConsumerEndpointImpl() override;
122
Primiano Tuccidca727d2018-04-04 11:31:55 +0200123 void NotifyOnTracingDisabled();
Primiano Tucci42e2de12017-12-07 16:46:04 +0000124 base::WeakPtr<ConsumerEndpointImpl> GetWeakPtr();
125
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100126 // TracingService::ConsumerEndpoint implementation.
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100127 void EnableTracing(const TraceConfig&, base::ScopedFile) override;
Primiano Tucci674076d2018-10-01 10:41:09 +0100128 void StartTracing() override;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000129 void DisableTracing() override;
130 void ReadBuffers() override;
131 void FreeBuffers() override;
Primiano Tucci3cbb10a2018-04-10 17:52:40 +0100132 void Flush(uint32_t timeout_ms, FlushCallback) override;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000133
134 private:
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100135 friend class TracingServiceImpl;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000136 ConsumerEndpointImpl(const ConsumerEndpointImpl&) = delete;
137 ConsumerEndpointImpl& operator=(const ConsumerEndpointImpl&) = delete;
138
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100139 base::TaskRunner* const task_runner_;
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100140 TracingServiceImpl* const service_;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000141 Consumer* const consumer_;
Primiano Tucci20d441d2018-01-16 09:25:51 +0000142 TracingSessionID tracing_session_id_ = 0;
Florian Mayercd08ec62018-01-31 17:49:25 +0000143 PERFETTO_THREAD_CHECKER(thread_checker_)
Primiano Tuccidca727d2018-04-04 11:31:55 +0200144 base::WeakPtrFactory<ConsumerEndpointImpl> weak_ptr_factory_; // Keep last.
Primiano Tucci42e2de12017-12-07 16:46:04 +0000145 };
146
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100147 explicit TracingServiceImpl(std::unique_ptr<SharedMemory::Factory>,
148 base::TaskRunner*);
149 ~TracingServiceImpl() override;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000150
Primiano Tucci42e2de12017-12-07 16:46:04 +0000151 // Called by ProducerEndpointImpl.
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000152 void DisconnectProducer(ProducerID);
Primiano Tucci9daa4832018-03-28 23:28:17 +0100153 void RegisterDataSource(ProducerID, const DataSourceDescriptor&);
154 void UnregisterDataSource(ProducerID, const std::string& name);
Primiano Tucci53589332017-12-19 11:31:13 +0100155 void CopyProducerPageIntoLogBuffer(ProducerID,
Primiano Tucciecf9e4a2018-03-14 14:51:58 +0000156 uid_t,
157 WriterID,
158 ChunkID,
Primiano Tucci53589332017-12-19 11:31:13 +0100159 BufferID,
Primiano Tucciecf9e4a2018-03-14 14:51:58 +0000160 uint16_t num_fragments,
161 uint8_t chunk_flags,
162 const uint8_t* src,
163 size_t size);
164 void ApplyChunkPatches(ProducerID,
165 const std::vector<CommitDataRequest::ChunkToPatch>&);
Primiano Tuccid52e6272018-04-06 19:06:53 +0200166 void NotifyFlushDoneForProducer(ProducerID, FlushRequestID);
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100167 void NotifyDataSourceStopped(ProducerID, const DataSourceInstanceID);
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000168
Primiano Tucci42e2de12017-12-07 16:46:04 +0000169 // Called by ConsumerEndpointImpl.
170 void DisconnectConsumer(ConsumerEndpointImpl*);
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100171 bool EnableTracing(ConsumerEndpointImpl*,
172 const TraceConfig&,
173 base::ScopedFile);
Primiano Tucci674076d2018-10-01 10:41:09 +0100174 bool StartTracing(TracingSessionID);
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100175 void DisableTracing(TracingSessionID, bool disable_immediately = false);
Primiano Tuccid52e6272018-04-06 19:06:53 +0200176 void Flush(TracingSessionID tsid,
Primiano Tucci3cbb10a2018-04-10 17:52:40 +0100177 uint32_t timeout_ms,
Primiano Tuccid52e6272018-04-06 19:06:53 +0200178 ConsumerEndpoint::FlushCallback);
179 void FlushAndDisableTracing(TracingSessionID);
Primiano Tucci20d441d2018-01-16 09:25:51 +0000180 void ReadBuffers(TracingSessionID, ConsumerEndpointImpl*);
181 void FreeBuffers(TracingSessionID);
Primiano Tucci42e2de12017-12-07 16:46:04 +0000182
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000183 // Service implementation.
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100184 std::unique_ptr<TracingService::ProducerEndpoint> ConnectProducer(
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000185 Producer*,
Sami Kyostila32e0b542018-02-14 08:55:43 +0000186 uid_t uid,
Isabelle Taylor86262cb2018-03-27 16:00:54 +0100187 const std::string& producer_name,
Isabelle Taylor69faa902018-03-21 15:42:03 +0000188 size_t shared_memory_size_hint_bytes = 0) override;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000189
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100190 std::unique_ptr<TracingService::ConsumerEndpoint> ConnectConsumer(
Primiano Tucci42e2de12017-12-07 16:46:04 +0000191 Consumer*) override;
192
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000193 // Exposed mainly for testing.
194 size_t num_producers() const { return producers_.size(); }
195 ProducerEndpointImpl* GetProducer(ProducerID) const;
196
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100197 uint32_t override_data_source_test_timeout_ms_for_testing = 0;
198
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000199 private:
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100200 friend class TracingServiceImplTest;
Primiano Tucci081d46a2018-02-28 11:09:43 +0000201
Primiano Tucci53589332017-12-19 11:31:13 +0100202 struct RegisteredDataSource {
203 ProducerID producer_id;
Primiano Tucci53589332017-12-19 11:31:13 +0100204 DataSourceDescriptor descriptor;
205 };
206
Sami Kyostila06487a22018-02-27 13:48:38 +0000207 // Represents an active data source for a tracing session.
208 struct DataSourceInstance {
Primiano Tucci5403e4f2018-11-27 10:07:03 +0000209 DataSourceInstance(DataSourceInstanceID id,
210 const DataSourceConfig& cfg,
211 const std::string& ds_name,
212 bool notify)
213 : instance_id(id),
214 config(cfg),
215 data_source_name(ds_name),
216 will_notify_on_stop(notify) {}
Primiano Tucci674076d2018-10-01 10:41:09 +0100217 DataSourceInstance(const DataSourceInstance&) = delete;
218 DataSourceInstance& operator=(const DataSourceInstance&) = delete;
Primiano Tucci674076d2018-10-01 10:41:09 +0100219
Sami Kyostila06487a22018-02-27 13:48:38 +0000220 DataSourceInstanceID instance_id;
Primiano Tucci674076d2018-10-01 10:41:09 +0100221 DataSourceConfig config;
Primiano Tucci9daa4832018-03-28 23:28:17 +0100222 std::string data_source_name;
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100223 bool will_notify_on_stop;
Sami Kyostila06487a22018-02-27 13:48:38 +0000224 };
225
Primiano Tuccid52e6272018-04-06 19:06:53 +0200226 struct PendingFlush {
227 std::set<ProducerID> producers;
228 ConsumerEndpoint::FlushCallback callback;
229 explicit PendingFlush(decltype(callback) cb) : callback(std::move(cb)) {}
230 };
231
Primiano Tucci53589332017-12-19 11:31:13 +0100232 // Holds the state of a tracing session. A tracing session is uniquely bound
233 // a specific Consumer. Each Consumer can own one or more sessions.
234 struct TracingSession {
Primiano Tucci674076d2018-10-01 10:41:09 +0100235 enum State {
236 DISABLED = 0,
237 CONFIGURED,
238 STARTED,
239 DISABLING_WAITING_STOP_ACKS
240 };
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100241
242 TracingSession(TracingSessionID, ConsumerEndpointImpl*, const TraceConfig&);
Primiano Tucci20d441d2018-01-16 09:25:51 +0000243
244 size_t num_buffers() const { return buffers_index.size(); }
245
Primiano Tucci3cbb10a2018-04-10 17:52:40 +0100246 uint32_t delay_to_next_write_period_ms() const {
Sami Kyostila01c45f02018-03-29 15:43:10 +0100247 PERFETTO_DCHECK(write_period_ms > 0);
248 return write_period_ms -
249 (base::GetWallTimeMs().count() % write_period_ms);
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100250 }
251
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100252 const TracingSessionID id;
253
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100254 // The consumer that started the session.
255 ConsumerEndpointImpl* const consumer;
256
Primiano Tucci20d441d2018-01-16 09:25:51 +0000257 // The original trace config provided by the Consumer when calling
258 // EnableTracing().
259 const TraceConfig config;
Oystein Eftevaag1269b4a2018-01-10 16:29:38 -0800260
Primiano Tucci53589332017-12-19 11:31:13 +0100261 // List of data source instances that have been enabled on the various
262 // producers for this tracing session.
Sami Kyostila06487a22018-02-27 13:48:38 +0000263 std::multimap<ProducerID, DataSourceInstance> data_source_instances;
Primiano Tucci53589332017-12-19 11:31:13 +0100264
Primiano Tuccid52e6272018-04-06 19:06:53 +0200265 // For each Flush(N) request, keeps track of the set of producers for which
266 // we are still awaiting a NotifyFlushComplete(N) ack.
267 std::map<FlushRequestID, PendingFlush> pending_flushes;
268
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100269 // After DisableTracing() is called, this contains the subset of data
270 // sources that did set the |will_notify_on_stop| flag upon registration and
271 // that have the haven't replied yet to the stop request.
272 std::set<std::pair<ProducerID, DataSourceInstanceID>> pending_stop_acks;
273
Primiano Tucci20d441d2018-01-16 09:25:51 +0000274 // Maps a per-trace-session buffer index into the corresponding global
275 // BufferID (shared namespace amongst all consumers). This vector has as
276 // many entries as |config.buffers_size()|.
277 std::vector<BufferID> buffers_index;
Sami Kyostilafbccb3c2018-03-21 14:00:47 +0000278
Primiano Tucci9754d0d2018-09-15 12:41:46 +0100279 // When the last snapshots (clock, stats, sync marker) were emitted into
280 // the output stream.
281 base::TimeMillis last_snapshot_time = {};
Primiano Tucci5e33cad2018-04-30 14:41:25 +0100282
Sami Kyostila200bd2e2018-03-26 12:24:10 +0100283 // Whether we mirrored the trace config back to the trace output yet.
284 bool did_emit_config = false;
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100285
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100286 State state = DISABLED;
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100287
288 // This is set when the Consumer calls sets |write_into_file| == true in the
289 // TraceConfig. In this case this represents the file we should stream the
290 // trace packets into, rather than returning it to the consumer via
291 // OnTraceData().
292 base::ScopedFile write_into_file;
Primiano Tucci3cbb10a2018-04-10 17:52:40 +0100293 uint32_t write_period_ms = 0;
294 uint64_t max_file_size_bytes = 0;
295 uint64_t bytes_written_into_file = 0;
Primiano Tucci53589332017-12-19 11:31:13 +0100296 };
297
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100298 TracingServiceImpl(const TracingServiceImpl&) = delete;
299 TracingServiceImpl& operator=(const TracingServiceImpl&) = delete;
Primiano Tucci20d441d2018-01-16 09:25:51 +0000300
Primiano Tucci674076d2018-10-01 10:41:09 +0100301 DataSourceInstance* SetupDataSource(const TraceConfig::DataSource&,
302 const TraceConfig::ProducerConfig&,
303 const RegisteredDataSource&,
304 TracingSession*);
Oystein Eftevaag1269b4a2018-01-10 16:29:38 -0800305
Primiano Tucci081d46a2018-02-28 11:09:43 +0000306 // Returns the next available ProducerID that is not in |producers_|.
307 ProducerID GetNextProducerID();
308
Primiano Tucci20d441d2018-01-16 09:25:51 +0000309 // Returns a pointer to the |tracing_sessions_| entry or nullptr if the
310 // session doesn't exists.
311 TracingSession* GetTracingSession(TracingSessionID);
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000312
Lalit Maganti485faff2018-03-06 11:51:35 +0000313 // Update the memory guard rail by using the latest information from the
314 // shared memory and trace buffers.
315 void UpdateMemoryGuardrail();
316
Primiano Tucci9754d0d2018-09-15 12:41:46 +0100317 void SnapshotSyncMarker(std::vector<TracePacket>*);
318 void SnapshotClocks(std::vector<TracePacket>*);
319 void SnapshotStats(TracingSession*, std::vector<TracePacket>*);
Sami Kyostila200bd2e2018-03-26 12:24:10 +0100320 void MaybeEmitTraceConfig(TracingSession*, std::vector<TracePacket>*);
Primiano Tuccid52e6272018-04-06 19:06:53 +0200321 void OnFlushTimeout(TracingSessionID, FlushRequestID);
Primiano Tuccibaeecf12018-07-25 12:02:20 +0100322 void OnDisableTracingTimeout(TracingSessionID);
323 void DisableTracingNotifyConsumerAndFlushFile(TracingSession*);
Primiano Tuccicaa57802018-11-25 11:07:07 +0000324 void PeriodicFlushTask(TracingSessionID, bool post_next_only);
Hector Dearman6214c8f2018-03-27 16:16:22 +0100325 TraceBuffer* GetBufferByID(BufferID);
Primiano Tucciecf9e4a2018-03-14 14:51:58 +0000326
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000327 base::TaskRunner* const task_runner_;
Primiano Tucci53589332017-12-19 11:31:13 +0100328 std::unique_ptr<SharedMemory::Factory> shm_factory_;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000329 ProducerID last_producer_id_ = 0;
Primiano Tucci53589332017-12-19 11:31:13 +0100330 DataSourceInstanceID last_data_source_instance_id_ = 0;
Primiano Tucci20d441d2018-01-16 09:25:51 +0000331 TracingSessionID last_tracing_session_id_ = 0;
Primiano Tuccid52e6272018-04-06 19:06:53 +0200332 FlushRequestID last_flush_request_id_ = 0;
Primiano Tucci5e33cad2018-04-30 14:41:25 +0100333 uid_t uid_ = 0;
Primiano Tucci53589332017-12-19 11:31:13 +0100334
335 // Buffer IDs are global across all consumers (because a Producer can produce
336 // data for more than one trace session, hence more than one consumer).
Primiano Tucci20d441d2018-01-16 09:25:51 +0000337 IdAllocator<BufferID> buffer_ids_;
Primiano Tucci53589332017-12-19 11:31:13 +0100338
339 std::multimap<std::string /*name*/, RegisteredDataSource> data_sources_;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000340 std::map<ProducerID, ProducerEndpointImpl*> producers_;
Primiano Tucci42e2de12017-12-07 16:46:04 +0000341 std::set<ConsumerEndpointImpl*> consumers_;
Primiano Tucci20d441d2018-01-16 09:25:51 +0000342 std::map<TracingSessionID, TracingSession> tracing_sessions_;
Hector Dearman6214c8f2018-03-27 16:16:22 +0100343 std::map<BufferID, std::unique_ptr<TraceBuffer>> buffers_;
Primiano Tucci20d441d2018-01-16 09:25:51 +0000344
Florian Mayer61c55482018-03-06 14:43:54 +0000345 bool lockdown_mode_ = false;
Primiano Tucci9754d0d2018-09-15 12:41:46 +0100346 uint32_t min_write_period_ms_ = 100; // Overridable for testing.
347
348 uint8_t sync_marker_packet_[32]; // Lazily initialized.
349 size_t sync_marker_packet_size_ = 0;
Florian Mayer61c55482018-03-06 14:43:54 +0000350
Florian Mayercd08ec62018-01-31 17:49:25 +0000351 PERFETTO_THREAD_CHECKER(thread_checker_)
352
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100353 base::WeakPtrFactory<TracingServiceImpl>
354 weak_ptr_factory_; // Keep at the end.
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000355};
356
357} // namespace perfetto
358
Florian Mayer6a1a4d52018-06-08 16:47:07 +0100359#endif // SRC_TRACING_CORE_TRACING_SERVICE_IMPL_H_