blob: c0228065d82c8395706c973b6b2f1eb20f4895cc [file] [log] [blame]
Lalit Maganticaed37e2018-06-01 03:03:08 +01001/*
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
17#ifndef SRC_TRACE_PROCESSOR_TRACE_STORAGE_H_
18#define SRC_TRACE_PROCESSOR_TRACE_STORAGE_H_
19
Lalit Maganti35622b72018-06-06 12:03:11 +010020#include <array>
Lalit Maganticaed37e2018-06-01 03:03:08 +010021#include <deque>
Isabelle Taylor47328cf2018-06-12 14:33:59 +010022#include <map>
Lalit Maganticaed37e2018-06-01 03:03:08 +010023#include <string>
24#include <unordered_map>
25#include <vector>
26
Lalit Maganti35622b72018-06-06 12:03:11 +010027#include "perfetto/base/logging.h"
Lalit Maganti770886a2018-11-16 17:40:21 +000028#include "perfetto/base/optional.h"
Primiano Tucci2da5d2e2018-08-10 14:23:31 +010029#include "perfetto/base/string_view.h"
Hector Dearmanc8339932018-08-10 11:22:46 +010030#include "perfetto/base/utils.h"
Primiano Tucci0e38a142019-01-07 20:51:09 +000031#include "src/trace_processor/stats.h"
Lalit Maganti35622b72018-06-06 12:03:11 +010032
Lalit Maganticaed37e2018-06-01 03:03:08 +010033namespace perfetto {
34namespace trace_processor {
35
Isabelle Taylora0a22972018-08-03 12:06:12 +010036// UniquePid is an offset into |unique_processes_|. This is necessary because
37// Unix pids are reused and thus not guaranteed to be unique over a long
38// period of time.
39using UniquePid = uint32_t;
Primiano Tucci0d72a312018-08-07 14:42:45 +010040
Isabelle Taylora0a22972018-08-03 12:06:12 +010041// UniqueTid is an offset into |unique_threads_|. Necessary because tids can
42// be reused.
43using UniqueTid = uint32_t;
44
Primiano Tucci0d72a312018-08-07 14:42:45 +010045// StringId is an offset into |string_pool_|.
Lalit Maganti85ca4a82018-12-07 17:28:02 +000046using StringId = uint32_t;
Primiano Tucci0d72a312018-08-07 14:42:45 +010047
Lalit Maganti5ea9e932018-11-30 14:19:39 +000048// Identifiers for all the tables in the database.
49enum TableId : uint8_t {
50 // Intentionally don't have TableId == 0 so that RowId == 0 can refer to an
51 // invalid row id.
52 kCounters = 1,
Lalit Maganti1d915a62019-01-07 12:10:42 +000053 kRawEvents = 2,
Lalit Maganti66ed7ad2019-01-11 16:47:26 +000054 kInstants = 3,
Lalit Maganti5ea9e932018-11-30 14:19:39 +000055};
56
57// The top 8 bits are set to the TableId and the bottom 32 to the row of the
58// table.
Lalit Maganti85ca4a82018-12-07 17:28:02 +000059using RowId = int64_t;
Lalit Maganti5ea9e932018-11-30 14:19:39 +000060
61static const RowId kInvalidRowId = 0;
62
Isabelle Taylora97c5f52018-10-23 17:36:12 +010063enum RefType {
Primiano Tucci5403e4f2018-11-27 10:07:03 +000064 kRefNoRef = 0,
65 kRefUtid = 1,
66 kRefCpuId = 2,
67 kRefIrq = 3,
68 kRefSoftIrq = 4,
69 kRefUpid = 5,
70 kRefUtidLookupUpid = 6,
71 kRefMax
Isabelle Taylora97c5f52018-10-23 17:36:12 +010072};
Isabelle Taylor14674d42018-09-07 11:33:11 +010073
Lalit Maganticaed37e2018-06-01 03:03:08 +010074// Stores a data inside a trace file in a columnar form. This makes it efficient
75// to read or search across a single field of the trace (e.g. all the thread
76// names for a given CPU).
77class TraceStorage {
78 public:
Isabelle Taylor47328cf2018-06-12 14:33:59 +010079 TraceStorage();
Isabelle Taylora0a22972018-08-03 12:06:12 +010080 TraceStorage(const TraceStorage&) = delete;
81
82 virtual ~TraceStorage();
Isabelle Taylor47328cf2018-06-12 14:33:59 +010083
Isabelle Taylora0a22972018-08-03 12:06:12 +010084 // Information about a unique process seen in a trace.
85 struct Process {
Primiano Tuccib75dcee2018-08-08 12:21:36 +010086 explicit Process(uint32_t p) : pid(p) {}
Lalit Maganti85ca4a82018-12-07 17:28:02 +000087 int64_t start_ns = 0;
88 int64_t end_ns = 0;
Isabelle Taylora0a22972018-08-03 12:06:12 +010089 StringId name_id = 0;
Primiano Tuccib75dcee2018-08-08 12:21:36 +010090 uint32_t pid = 0;
Isabelle Taylora0a22972018-08-03 12:06:12 +010091 };
92
93 // Information about a unique thread seen in a trace.
94 struct Thread {
Primiano Tuccib75dcee2018-08-08 12:21:36 +010095 explicit Thread(uint32_t t) : tid(t) {}
Lalit Maganti85ca4a82018-12-07 17:28:02 +000096 int64_t start_ns = 0;
97 int64_t end_ns = 0;
Isabelle Taylora0a22972018-08-03 12:06:12 +010098 StringId name_id = 0;
Lalit Maganti770886a2018-11-16 17:40:21 +000099 base::Optional<UniquePid> upid;
Primiano Tuccib75dcee2018-08-08 12:21:36 +0100100 uint32_t tid = 0;
Isabelle Taylora0a22972018-08-03 12:06:12 +0100101 };
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100102
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000103 // Generic key value storage which can be referenced by other tables.
104 class Args {
105 public:
Lalit Maganti1d915a62019-01-07 12:10:42 +0000106 // Variadic type representing the possible values for the args table.
107 struct Variadic {
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000108 enum Type { kInt, kString, kReal };
109
Lalit Maganti1d915a62019-01-07 12:10:42 +0000110 static Variadic Integer(int64_t int_value) {
111 Variadic variadic;
112 variadic.type = Type::kInt;
113 variadic.int_value = int_value;
114 return variadic;
115 }
116
117 static Variadic String(StringId string_id) {
118 Variadic variadic;
119 variadic.type = Type::kString;
120 variadic.string_value = string_id;
121 return variadic;
122 }
123
124 static Variadic Real(double real_value) {
125 Variadic variadic;
126 variadic.type = Type::kReal;
127 variadic.real_value = real_value;
128 return variadic;
129 }
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000130
131 Type type;
132 union {
133 int64_t int_value;
134 StringId string_value;
135 double real_value;
136 };
137 };
138
Lalit Maganti5ea9e932018-11-30 14:19:39 +0000139 const std::deque<RowId>& ids() const { return ids_; }
140 const std::deque<StringId>& flat_keys() const { return flat_keys_; }
141 const std::deque<StringId>& keys() const { return keys_; }
Lalit Maganti1d915a62019-01-07 12:10:42 +0000142 const std::deque<Variadic>& arg_values() const { return arg_values_; }
Lalit Maganti79472be2018-12-04 13:41:27 +0000143 const std::multimap<RowId, uint32_t>& args_for_id() const {
144 return args_for_id_;
145 }
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000146 size_t args_count() const { return ids_.size(); }
147
Lalit Maganti1d915a62019-01-07 12:10:42 +0000148 void AddArg(RowId id, StringId flat_key, StringId key, Variadic value) {
Lalit Maganti5ea9e932018-11-30 14:19:39 +0000149 if (id == kInvalidRowId)
150 return;
151
152 ids_.emplace_back(id);
153 flat_keys_.emplace_back(flat_key);
154 keys_.emplace_back(key);
155 arg_values_.emplace_back(value);
Lalit Maganti79472be2018-12-04 13:41:27 +0000156 args_for_id_.emplace(id, static_cast<uint32_t>(args_count() - 1));
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000157 }
158
Lalit Maganti5ea9e932018-11-30 14:19:39 +0000159 private:
160 std::deque<RowId> ids_;
161 std::deque<StringId> flat_keys_;
162 std::deque<StringId> keys_;
Lalit Maganti1d915a62019-01-07 12:10:42 +0000163 std::deque<Variadic> arg_values_;
Lalit Maganti79472be2018-12-04 13:41:27 +0000164 std::multimap<RowId, uint32_t> args_for_id_;
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000165 };
166
Lalit Magantiff69c112018-09-24 12:07:47 +0100167 class Slices {
Lalit Maganti35622b72018-06-06 12:03:11 +0100168 public:
Lalit Magantifde29042018-10-04 13:28:52 +0100169 inline size_t AddSlice(uint32_t cpu,
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000170 int64_t start_ns,
171 int64_t duration_ns,
Lalit Magantifde29042018-10-04 13:28:52 +0100172 UniqueTid utid) {
Lalit Magantiff69c112018-09-24 12:07:47 +0100173 cpus_.emplace_back(cpu);
Lalit Maganti35622b72018-06-06 12:03:11 +0100174 start_ns_.emplace_back(start_ns);
175 durations_.emplace_back(duration_ns);
Isabelle Taylora0a22972018-08-03 12:06:12 +0100176 utids_.emplace_back(utid);
Lalit Magantifde29042018-10-04 13:28:52 +0100177 return slice_count() - 1;
178 }
179
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000180 void set_duration(size_t index, int64_t duration_ns) {
Lalit Magantifde29042018-10-04 13:28:52 +0100181 durations_[index] = duration_ns;
Lalit Maganti35622b72018-06-06 12:03:11 +0100182 }
183
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100184 size_t slice_count() const { return start_ns_.size(); }
Lalit Maganti35622b72018-06-06 12:03:11 +0100185
Lalit Magantiff69c112018-09-24 12:07:47 +0100186 const std::deque<uint32_t>& cpus() const { return cpus_; }
187
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000188 const std::deque<int64_t>& start_ns() const { return start_ns_; }
Lalit Maganti35622b72018-06-06 12:03:11 +0100189
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000190 const std::deque<int64_t>& durations() const { return durations_; }
Lalit Maganti35622b72018-06-06 12:03:11 +0100191
Isabelle Taylor68e42192018-06-19 16:19:31 +0100192 const std::deque<UniqueTid>& utids() const { return utids_; }
193
Lalit Maganti35622b72018-06-06 12:03:11 +0100194 private:
Hector Dearman947f12a2018-09-11 16:50:36 +0100195 // Each deque below has the same number of entries (the number of slices
Lalit Maganti35622b72018-06-06 12:03:11 +0100196 // in the trace for the CPU).
Lalit Magantiff69c112018-09-24 12:07:47 +0100197 std::deque<uint32_t> cpus_;
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000198 std::deque<int64_t> start_ns_;
199 std::deque<int64_t> durations_;
Isabelle Taylor68e42192018-06-19 16:19:31 +0100200 std::deque<UniqueTid> utids_;
Primiano Tucci0d72a312018-08-07 14:42:45 +0100201 };
Isabelle Taylor68e42192018-06-19 16:19:31 +0100202
Primiano Tucci0d72a312018-08-07 14:42:45 +0100203 class NestableSlices {
204 public:
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000205 inline size_t AddSlice(int64_t start_ns,
206 int64_t duration_ns,
Lalit Maganti7b37bbf2018-11-09 15:58:54 +0000207 UniqueTid utid,
208 StringId cat,
209 StringId name,
210 uint8_t depth,
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000211 int64_t stack_id,
212 int64_t parent_stack_id) {
Primiano Tucci0d72a312018-08-07 14:42:45 +0100213 start_ns_.emplace_back(start_ns);
214 durations_.emplace_back(duration_ns);
215 utids_.emplace_back(utid);
216 cats_.emplace_back(cat);
217 names_.emplace_back(name);
218 depths_.emplace_back(depth);
Primiano Tuccib75dcee2018-08-08 12:21:36 +0100219 stack_ids_.emplace_back(stack_id);
220 parent_stack_ids_.emplace_back(parent_stack_id);
Lalit Maganti7b37bbf2018-11-09 15:58:54 +0000221 return slice_count() - 1;
222 }
223
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000224 void set_duration(size_t index, int64_t duration_ns) {
Lalit Maganti7b37bbf2018-11-09 15:58:54 +0000225 durations_[index] = duration_ns;
226 }
227
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000228 void set_stack_id(size_t index, int64_t stack_id) {
Lalit Maganti7b37bbf2018-11-09 15:58:54 +0000229 stack_ids_[index] = stack_id;
Primiano Tucci0d72a312018-08-07 14:42:45 +0100230 }
231
232 size_t slice_count() const { return start_ns_.size(); }
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000233 const std::deque<int64_t>& start_ns() const { return start_ns_; }
234 const std::deque<int64_t>& durations() const { return durations_; }
Primiano Tucci0d72a312018-08-07 14:42:45 +0100235 const std::deque<UniqueTid>& utids() const { return utids_; }
236 const std::deque<StringId>& cats() const { return cats_; }
237 const std::deque<StringId>& names() const { return names_; }
238 const std::deque<uint8_t>& depths() const { return depths_; }
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000239 const std::deque<int64_t>& stack_ids() const { return stack_ids_; }
240 const std::deque<int64_t>& parent_stack_ids() const {
Primiano Tuccib75dcee2018-08-08 12:21:36 +0100241 return parent_stack_ids_;
242 }
Primiano Tucci0d72a312018-08-07 14:42:45 +0100243
244 private:
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000245 std::deque<int64_t> start_ns_;
246 std::deque<int64_t> durations_;
Primiano Tucci0d72a312018-08-07 14:42:45 +0100247 std::deque<UniqueTid> utids_;
248 std::deque<StringId> cats_;
249 std::deque<StringId> names_;
250 std::deque<uint8_t> depths_;
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000251 std::deque<int64_t> stack_ids_;
252 std::deque<int64_t> parent_stack_ids_;
Lalit Maganti35622b72018-06-06 12:03:11 +0100253 };
254
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100255 class Counters {
256 public:
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000257 inline size_t AddCounter(int64_t timestamp,
258 int64_t duration,
Lalit Magantifde29042018-10-04 13:28:52 +0100259 StringId name_id,
260 double value,
Lalit Magantifde29042018-10-04 13:28:52 +0100261 int64_t ref,
262 RefType type) {
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100263 timestamps_.emplace_back(timestamp);
264 durations_.emplace_back(duration);
265 name_ids_.emplace_back(name_id);
266 values_.emplace_back(value);
267 refs_.emplace_back(ref);
268 types_.emplace_back(type);
Lalit Magantifde29042018-10-04 13:28:52 +0100269 return counter_count() - 1;
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100270 }
Lalit Magantifde29042018-10-04 13:28:52 +0100271
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000272 void set_duration(size_t index, int64_t duration) {
Lalit Magantifde29042018-10-04 13:28:52 +0100273 durations_[index] = duration;
274 }
275
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100276 size_t counter_count() const { return timestamps_.size(); }
277
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000278 const std::deque<int64_t>& timestamps() const { return timestamps_; }
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100279
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000280 const std::deque<int64_t>& durations() const { return durations_; }
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100281
282 const std::deque<StringId>& name_ids() const { return name_ids_; }
283
284 const std::deque<double>& values() const { return values_; }
285
286 const std::deque<int64_t>& refs() const { return refs_; }
287
288 const std::deque<RefType>& types() const { return types_; }
289
290 private:
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000291 std::deque<int64_t> timestamps_;
292 std::deque<int64_t> durations_;
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100293 std::deque<StringId> name_ids_;
294 std::deque<double> values_;
295 std::deque<int64_t> refs_;
296 std::deque<RefType> types_;
297 };
298
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700299 class SqlStats {
300 public:
301 static constexpr size_t kMaxLogEntries = 100;
302 void RecordQueryBegin(const std::string& query,
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000303 int64_t time_queued,
304 int64_t time_started);
305 void RecordQueryEnd(int64_t time_ended);
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700306 size_t size() const { return queries_.size(); }
307 const std::deque<std::string>& queries() const { return queries_; }
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000308 const std::deque<int64_t>& times_queued() const { return times_queued_; }
309 const std::deque<int64_t>& times_started() const { return times_started_; }
310 const std::deque<int64_t>& times_ended() const { return times_ended_; }
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700311
312 private:
313 std::deque<std::string> queries_;
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000314 std::deque<int64_t> times_queued_;
315 std::deque<int64_t> times_started_;
316 std::deque<int64_t> times_ended_;
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700317 };
318
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000319 class Instants {
320 public:
Lalit Maganti66ed7ad2019-01-11 16:47:26 +0000321 inline uint32_t AddInstantEvent(int64_t timestamp,
322 StringId name_id,
323 double value,
324 int64_t ref,
325 RefType type) {
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000326 timestamps_.emplace_back(timestamp);
327 name_ids_.emplace_back(name_id);
328 values_.emplace_back(value);
329 refs_.emplace_back(ref);
330 types_.emplace_back(type);
Lalit Maganti66ed7ad2019-01-11 16:47:26 +0000331 return static_cast<uint32_t>(instant_count() - 1);
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000332 }
333
334 size_t instant_count() const { return timestamps_.size(); }
335
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000336 const std::deque<int64_t>& timestamps() const { return timestamps_; }
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000337
338 const std::deque<StringId>& name_ids() const { return name_ids_; }
339
340 const std::deque<double>& values() const { return values_; }
341
342 const std::deque<int64_t>& refs() const { return refs_; }
343
344 const std::deque<RefType>& types() const { return types_; }
345
346 private:
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000347 std::deque<int64_t> timestamps_;
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000348 std::deque<StringId> name_ids_;
349 std::deque<double> values_;
350 std::deque<int64_t> refs_;
351 std::deque<RefType> types_;
352 };
353
Lalit Maganti1d915a62019-01-07 12:10:42 +0000354 class RawEvents {
355 public:
356 inline RowId AddRawEvent(int64_t timestamp,
357 StringId name_id,
Lalit Magantie87cc812019-01-10 15:20:06 +0000358 uint32_t cpu,
Lalit Maganti1d915a62019-01-07 12:10:42 +0000359 UniqueTid utid) {
360 timestamps_.emplace_back(timestamp);
361 name_ids_.emplace_back(name_id);
Lalit Magantie87cc812019-01-10 15:20:06 +0000362 cpus_.emplace_back(cpu);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000363 utids_.emplace_back(utid);
364 return CreateRowId(TableId::kRawEvents,
365 static_cast<uint32_t>(raw_event_count() - 1));
366 }
367
368 size_t raw_event_count() const { return timestamps_.size(); }
369
370 const std::deque<int64_t>& timestamps() const { return timestamps_; }
371
372 const std::deque<StringId>& name_ids() const { return name_ids_; }
373
Lalit Magantie87cc812019-01-10 15:20:06 +0000374 const std::deque<uint32_t>& cpus() const { return cpus_; }
375
Lalit Maganti1d915a62019-01-07 12:10:42 +0000376 const std::deque<UniqueTid>& utids() const { return utids_; }
377
378 private:
379 std::deque<int64_t> timestamps_;
380 std::deque<StringId> name_ids_;
Lalit Magantie87cc812019-01-10 15:20:06 +0000381 std::deque<uint32_t> cpus_;
Lalit Maganti1d915a62019-01-07 12:10:42 +0000382 std::deque<UniqueTid> utids_;
383 };
384
Primiano Tucci2c761ef2019-01-07 20:20:46 +0000385 class AndroidLogs {
386 public:
387 inline size_t AddLogEvent(int64_t timestamp,
388 UniqueTid utid,
389 uint8_t prio,
390 StringId tag_id,
391 StringId msg_id) {
392 timestamps_.emplace_back(timestamp);
393 utids_.emplace_back(utid);
394 prios_.emplace_back(prio);
395 tag_ids_.emplace_back(tag_id);
396 msg_ids_.emplace_back(msg_id);
397 return size() - 1;
398 }
399
400 size_t size() const { return timestamps_.size(); }
401
402 const std::deque<int64_t>& timestamps() const { return timestamps_; }
403 const std::deque<UniqueTid>& utids() const { return utids_; }
404 const std::deque<uint8_t>& prios() const { return prios_; }
405 const std::deque<StringId>& tag_ids() const { return tag_ids_; }
406 const std::deque<StringId>& msg_ids() const { return msg_ids_; }
407
408 private:
409 std::deque<int64_t> timestamps_;
410 std::deque<UniqueTid> utids_;
411 std::deque<uint8_t> prios_;
412 std::deque<StringId> tag_ids_;
413 std::deque<StringId> msg_ids_;
414 };
415
Primiano Tucci0e38a142019-01-07 20:51:09 +0000416 struct Stats {
417 using IndexMap = std::map<int, int64_t>;
418 int64_t value = 0;
419 IndexMap indexed_values;
420 };
421 using StatsMap = std::array<Stats, stats::kNumKeys>;
422
Isabelle Taylora0a22972018-08-03 12:06:12 +0100423 void ResetStorage();
Lalit Maganti35622b72018-06-06 12:03:11 +0100424
Primiano Tuccib75dcee2018-08-08 12:21:36 +0100425 UniqueTid AddEmptyThread(uint32_t tid) {
426 unique_threads_.emplace_back(tid);
Isabelle Taylora0a22972018-08-03 12:06:12 +0100427 return static_cast<UniqueTid>(unique_threads_.size() - 1);
428 }
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100429
Primiano Tuccib75dcee2018-08-08 12:21:36 +0100430 UniquePid AddEmptyProcess(uint32_t pid) {
431 unique_processes_.emplace_back(pid);
Isabelle Taylora0a22972018-08-03 12:06:12 +0100432 return static_cast<UniquePid>(unique_processes_.size() - 1);
433 }
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100434
Isabelle Taylora0a22972018-08-03 12:06:12 +0100435 // Return an unqiue identifier for the contents of each string.
436 // The string is copied internally and can be destroyed after this called.
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100437 // Virtual for testing.
438 virtual StringId InternString(base::StringView);
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100439
Isabelle Taylora0a22972018-08-03 12:06:12 +0100440 Process* GetMutableProcess(UniquePid upid) {
Lalit Maganti676658b2018-11-20 18:24:31 +0000441 PERFETTO_DCHECK(upid < unique_processes_.size());
Isabelle Taylora0a22972018-08-03 12:06:12 +0100442 return &unique_processes_[upid];
443 }
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100444
Isabelle Taylora0a22972018-08-03 12:06:12 +0100445 Thread* GetMutableThread(UniqueTid utid) {
Florian Mayera1aaec22018-09-19 17:02:26 +0100446 PERFETTO_DCHECK(utid < unique_threads_.size());
Isabelle Taylora0a22972018-08-03 12:06:12 +0100447 return &unique_threads_[utid];
448 }
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100449
Primiano Tucci0e38a142019-01-07 20:51:09 +0000450 // Example usage: SetStats(stats::android_log_num_failed, 42);
451 void SetStats(size_t key, int64_t value) {
452 PERFETTO_DCHECK(key < stats::kNumKeys);
453 PERFETTO_DCHECK(stats::kTypes[key] == stats::kSingle);
454 stats_[key].value = value;
455 }
456
457 // Example usage: IncrementStats(stats::android_log_num_failed, -1);
458 void IncrementStats(size_t key, int64_t increment = 1) {
459 PERFETTO_DCHECK(key < stats::kNumKeys);
460 PERFETTO_DCHECK(stats::kTypes[key] == stats::kSingle);
461 stats_[key].value += increment;
462 }
463
464 // Example usage: SetIndexedStats(stats::cpu_failure, 1, 42);
465 void SetIndexedStats(size_t key, int index, int64_t value) {
466 PERFETTO_DCHECK(key < stats::kNumKeys);
467 PERFETTO_DCHECK(stats::kTypes[key] == stats::kIndexed);
468 stats_[key].indexed_values[index] = value;
469 }
470
Lalit Maganticaed37e2018-06-01 03:03:08 +0100471 // Reading methods.
Isabelle Taylora0a22972018-08-03 12:06:12 +0100472 const std::string& GetString(StringId id) const {
473 PERFETTO_DCHECK(id < string_pool_.size());
474 return string_pool_[id];
475 }
476
Lalit Magantie9d40532018-06-29 13:15:06 +0100477 const Process& GetProcess(UniquePid upid) const {
Lalit Maganti676658b2018-11-20 18:24:31 +0000478 PERFETTO_DCHECK(upid < unique_processes_.size());
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100479 return unique_processes_[upid];
480 }
481
Lalit Magantie9d40532018-06-29 13:15:06 +0100482 const Thread& GetThread(UniqueTid utid) const {
Lalit Maganti1f64cfa2018-09-18 13:20:02 +0100483 // Allow utid == 0 for idle thread retrieval.
Florian Mayera1aaec22018-09-19 17:02:26 +0100484 PERFETTO_DCHECK(utid < unique_threads_.size());
Isabelle Taylor68e42192018-06-19 16:19:31 +0100485 return unique_threads_[utid];
486 }
487
Lalit Maganti5ea9e932018-11-30 14:19:39 +0000488 static RowId CreateRowId(TableId table, uint32_t row) {
489 static constexpr uint8_t kRowIdTableShift = 32;
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000490 return (static_cast<RowId>(table) << kRowIdTableShift) | row;
Lalit Maganti5ea9e932018-11-30 14:19:39 +0000491 }
492
Lalit Magantiff69c112018-09-24 12:07:47 +0100493 const Slices& slices() const { return slices_; }
Lalit Magantifde29042018-10-04 13:28:52 +0100494 Slices* mutable_slices() { return &slices_; }
495
Primiano Tucci0d72a312018-08-07 14:42:45 +0100496 const NestableSlices& nestable_slices() const { return nestable_slices_; }
497 NestableSlices* mutable_nestable_slices() { return &nestable_slices_; }
498
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100499 const Counters& counters() const { return counters_; }
500 Counters* mutable_counters() { return &counters_; }
Isabelle Taylor14674d42018-09-07 11:33:11 +0100501
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700502 const SqlStats& sql_stats() const { return sql_stats_; }
503 SqlStats* mutable_sql_stats() { return &sql_stats_; }
504
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000505 const Instants& instants() const { return instants_; }
506 Instants* mutable_instants() { return &instants_; }
507
Primiano Tucci2c761ef2019-01-07 20:20:46 +0000508 const AndroidLogs& android_logs() const { return android_log_; }
509 AndroidLogs* mutable_android_log() { return &android_log_; }
510
Primiano Tucci0e38a142019-01-07 20:51:09 +0000511 const StatsMap& stats() const { return stats_; }
Lalit Maganti05e8c132018-11-09 18:16:12 +0000512
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000513 const Args& args() const { return args_; }
514 Args* mutable_args() { return &args_; }
515
Lalit Maganti1d915a62019-01-07 12:10:42 +0000516 const RawEvents& raw_events() const { return raw_events_; }
517 RawEvents* mutable_raw_events() { return &raw_events_; }
518
Lalit Magantiacda68b2018-10-29 15:23:25 +0000519 const std::deque<std::string>& string_pool() const { return string_pool_; }
520
Isabelle Taylore7003fb2018-07-17 11:39:01 +0100521 // |unique_processes_| always contains at least 1 element becuase the 0th ID
522 // is reserved to indicate an invalid process.
523 size_t process_count() const { return unique_processes_.size() - 1; }
Primiano Tucci0d72a312018-08-07 14:42:45 +0100524
Isabelle Taylore7003fb2018-07-17 11:39:01 +0100525 // |unique_threads_| always contains at least 1 element becuase the 0th ID
526 // is reserved to indicate an invalid thread.
527 size_t thread_count() const { return unique_threads_.size() - 1; }
528
Hector Dearman12323362018-08-09 16:09:28 +0100529 // Number of interned strings in the pool. Includes the empty string w/ ID=0.
530 size_t string_count() const { return string_pool_.size(); }
531
Lalit Maganticaed37e2018-06-01 03:03:08 +0100532 private:
Isabelle Taylora0a22972018-08-03 12:06:12 +0100533 TraceStorage& operator=(const TraceStorage&) = default;
534
Primiano Tucci2da5d2e2018-08-10 14:23:31 +0100535 using StringHash = uint64_t;
Lalit Maganticaed37e2018-06-01 03:03:08 +0100536
Lalit Maganti05e8c132018-11-09 18:16:12 +0000537 // Stats about parsing the trace.
Primiano Tucci0e38a142019-01-07 20:51:09 +0000538 StatsMap stats_{};
Lalit Maganti35622b72018-06-06 12:03:11 +0100539
Lalit Maganticaed37e2018-06-01 03:03:08 +0100540 // One entry for each CPU in the trace.
Lalit Magantiff69c112018-09-24 12:07:47 +0100541 Slices slices_;
Lalit Maganticaed37e2018-06-01 03:03:08 +0100542
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000543 // Args for all other tables.
544 Args args_;
545
Lalit Maganticaed37e2018-06-01 03:03:08 +0100546 // One entry for each unique string in the trace.
Lalit Maganti35622b72018-06-06 12:03:11 +0100547 std::deque<std::string> string_pool_;
Lalit Maganticaed37e2018-06-01 03:03:08 +0100548
549 // One entry for each unique string in the trace.
Lalit Maganti35622b72018-06-06 12:03:11 +0100550 std::unordered_map<StringHash, StringId> string_index_;
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100551
Isabelle Taylor47328cf2018-06-12 14:33:59 +0100552 // One entry for each UniquePid, with UniquePid as the index.
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100553 std::deque<Process> unique_processes_;
Isabelle Taylor68e42192018-06-19 16:19:31 +0100554
Isabelle Taylor68e42192018-06-19 16:19:31 +0100555 // One entry for each UniqueTid, with UniqueTid as the index.
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100556 std::deque<Thread> unique_threads_;
Primiano Tucci0d72a312018-08-07 14:42:45 +0100557
558 // Slices coming from userspace events (e.g. Chromium TRACE_EVENT macros).
559 NestableSlices nestable_slices_;
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100560
561 // Counter events from the trace. This includes CPU frequency events as well
562 // systrace trace_marker counter events.
563 Counters counters_;
Primiano Tucci5cb84f82018-10-31 21:46:36 -0700564
565 SqlStats sql_stats_;
Lalit Maganti6e9c55e2018-11-29 12:00:39 +0000566
Isabelle Taylorc8c11202018-11-05 11:36:22 +0000567 // These are instantaneous events in the trace. They have no duration
568 // and do not have a value that make sense to track over time.
569 // e.g. signal events
570 Instants instants_;
Lalit Maganti1d915a62019-01-07 12:10:42 +0000571
572 // Raw events are every ftrace event in the trace. The raw event includes
573 // the timestamp and the pid. The args for the raw event will be in the
574 // args table. This table can be used to generate a text version of the
575 // trace.
576 RawEvents raw_events_;
Primiano Tucci2c761ef2019-01-07 20:20:46 +0000577 AndroidLogs android_log_;
Lalit Maganticaed37e2018-06-01 03:03:08 +0100578};
579
580} // namespace trace_processor
581} // namespace perfetto
582
583#endif // SRC_TRACE_PROCESSOR_TRACE_STORAGE_H_