Commit e29257b3 authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

perfetto: TrackEvent writer: Reset incremental state periodically

So we don't lose all data if the trace buffer wraps in ring-buffer
mode.

Bug: 928738
Change-Id: Ide4bed08f5209a94d00eb3347a567d1754b9c638
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541786
Commit-Queue: oysteine <oysteine@chromium.org>
Reviewed-by: default avataroysteine <oysteine@chromium.org>
Auto-Submit: Eric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#645349}
parent dcc47c77
......@@ -34,6 +34,12 @@ namespace {
constexpr uint32_t kMagicChunkIndex =
base::trace_event::TraceBufferChunk::kMaxChunkIndex;
// Force an incremental state reset every 1000 events on each thread. This
// limits the maximum number of events we lose when trace buffers wrap.
// TODO(eseckler): Tune this value experimentally and/or replace it with a
// signal by the service.
constexpr int kMaxEventsBeforeIncrementalStateReset = 1000;
base::ThreadTicks ThreadNow() {
return base::ThreadTicks::IsSupported()
? base::subtle::ThreadTicksNowIgnoringOverride()
......@@ -62,11 +68,11 @@ TrackEventThreadLocalEventSink::TrackEventThreadLocalEventSink(
TrackEventThreadLocalEventSink::~TrackEventThreadLocalEventSink() {}
// TODO(eseckler): Decide on a (temporary) way to trigger this periodically.
// Long-term, it should be triggered by a signal from the service. Short-term,
// maybe we can reset it every N events and/or seconds.
// TODO(eseckler): Trigger this upon a signal from the perfetto, once perfetto
// supports this.
void TrackEventThreadLocalEventSink::ResetIncrementalState() {
reset_incremental_state_ = true;
events_since_last_incremental_state_reset_ = 0;
}
void TrackEventThreadLocalEventSink::AddConvertableToTraceFormat(
......@@ -381,6 +387,12 @@ void TrackEventThreadLocalEventSink::AddTraceEvent(
interned_annotation_names_.Clear();
interned_source_locations_.Clear();
}
events_since_last_incremental_state_reset_++;
if (events_since_last_incremental_state_reset_ >=
kMaxEventsBeforeIncrementalStateReset) {
ResetIncrementalState();
}
}
void TrackEventThreadLocalEventSink::UpdateDuration(
......
......@@ -65,6 +65,7 @@ class COMPONENT_EXPORT(TRACING_CPP) TrackEventThreadLocalEventSink
base::ThreadTicks last_thread_time_;
int process_id_;
int thread_id_;
int events_since_last_incremental_state_reset_ = 0;
base::trace_event::TraceEvent complete_event_stack_[kMaxCompleteEventDepth];
uint32_t current_stack_depth_ = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment