Add signal events to t2t and trace processor
These events are added into a new table called "instants" for
instantaneous events.
Bug: 118687476
Change-Id: I1ea7953436cbf3e4139fa3a5db3624f9f95c6a6f
diff --git a/src/trace_processor/proto_trace_parser.cc b/src/trace_processor/proto_trace_parser.cc
index 87da1ad..b4db65e 100644
--- a/src/trace_processor/proto_trace_parser.cc
+++ b/src/trace_processor/proto_trace_parser.cc
@@ -124,7 +124,9 @@
cpu_times_softirq_ns_id_(
context->storage->InternString("cpu.times.softirq_ns")),
ion_heap_grow_id_(context->storage->InternString("ion_heap_grow")),
- ion_heap_shrink_id_(context->storage->InternString("ion_heap_shrink")) {
+ ion_heap_shrink_id_(context->storage->InternString("ion_heap_shrink")),
+ signal_deliver_id_(context->storage->InternString("signal_deliver")),
+ signal_generate_id_(context->storage->InternString("signal_generate")) {
for (const auto& name : BuildMeminfoCounterNames()) {
meminfo_strs_id_.emplace_back(context->storage->InternString(name));
}
@@ -546,6 +548,18 @@
ParseIonHeapShrink(timestamp, pid, ftrace.slice(fld_off, fld.size()));
break;
}
+ case protos::FtraceEvent::kSignalGenerate: {
+ PERFETTO_DCHECK(timestamp > 0);
+ const size_t fld_off = ftrace.offset_of(fld.data());
+ ParseSignalGenerate(timestamp, ftrace.slice(fld_off, fld.size()));
+ break;
+ }
+ case protos::FtraceEvent::kSignalDeliver: {
+ PERFETTO_DCHECK(timestamp > 0);
+ const size_t fld_off = ftrace.offset_of(fld.data());
+ ParseSignalDeliver(timestamp, pid, ftrace.slice(fld_off, fld.size()));
+ break;
+ }
default:
break;
@@ -554,6 +568,45 @@
PERFETTO_DCHECK(decoder.IsEndOfBuffer());
}
+void ProtoTraceParser::ParseSignalDeliver(uint64_t timestamp,
+ uint32_t pid,
+ TraceBlobView view) {
+ ProtoDecoder decoder(view.data(), view.length());
+ uint32_t sig = 0;
+ for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
+ switch (fld.id) {
+ case protos::SignalDeliverFtraceEvent::kSigFieldNumber:
+ sig = fld.as_uint32();
+ break;
+ }
+ }
+ auto* instants = context_->storage->mutable_instants();
+ UniqueTid utid = context_->process_tracker->UpdateThread(timestamp, pid, 0);
+ instants->AddInstantEvent(timestamp, signal_deliver_id_, sig, utid,
+ RefType::kUtid);
+}
+
+void ProtoTraceParser::ParseSignalGenerate(uint64_t timestamp,
+ TraceBlobView view) {
+ ProtoDecoder decoder(view.data(), view.length());
+ uint32_t pid = 0;
+ uint32_t sig = 0;
+ for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
+ switch (fld.id) {
+ case protos::SignalGenerateFtraceEvent::kPidFieldNumber:
+ pid = fld.as_uint32();
+ break;
+ case protos::SignalGenerateFtraceEvent::kSigFieldNumber:
+ sig = fld.as_uint32();
+ break;
+ }
+ }
+ auto* instants = context_->storage->mutable_instants();
+ UniqueTid utid = context_->process_tracker->UpdateThread(timestamp, pid, 0);
+ instants->AddInstantEvent(timestamp, signal_generate_id_, sig, utid,
+ RefType::kUtid);
+}
+
void ProtoTraceParser::ParseRssStat(uint64_t timestamp,
uint32_t pid,
TraceBlobView view) {