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 { ...@@ -34,6 +34,12 @@ namespace {
constexpr uint32_t kMagicChunkIndex = constexpr uint32_t kMagicChunkIndex =
base::trace_event::TraceBufferChunk::kMaxChunkIndex; 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() { base::ThreadTicks ThreadNow() {
return base::ThreadTicks::IsSupported() return base::ThreadTicks::IsSupported()
? base::subtle::ThreadTicksNowIgnoringOverride() ? base::subtle::ThreadTicksNowIgnoringOverride()
...@@ -62,11 +68,11 @@ TrackEventThreadLocalEventSink::TrackEventThreadLocalEventSink( ...@@ -62,11 +68,11 @@ TrackEventThreadLocalEventSink::TrackEventThreadLocalEventSink(
TrackEventThreadLocalEventSink::~TrackEventThreadLocalEventSink() {} TrackEventThreadLocalEventSink::~TrackEventThreadLocalEventSink() {}
// TODO(eseckler): Decide on a (temporary) way to trigger this periodically. // TODO(eseckler): Trigger this upon a signal from the perfetto, once perfetto
// Long-term, it should be triggered by a signal from the service. Short-term, // supports this.
// maybe we can reset it every N events and/or seconds.
void TrackEventThreadLocalEventSink::ResetIncrementalState() { void TrackEventThreadLocalEventSink::ResetIncrementalState() {
reset_incremental_state_ = true; reset_incremental_state_ = true;
events_since_last_incremental_state_reset_ = 0;
} }
void TrackEventThreadLocalEventSink::AddConvertableToTraceFormat( void TrackEventThreadLocalEventSink::AddConvertableToTraceFormat(
...@@ -381,6 +387,12 @@ void TrackEventThreadLocalEventSink::AddTraceEvent( ...@@ -381,6 +387,12 @@ void TrackEventThreadLocalEventSink::AddTraceEvent(
interned_annotation_names_.Clear(); interned_annotation_names_.Clear();
interned_source_locations_.Clear(); interned_source_locations_.Clear();
} }
events_since_last_incremental_state_reset_++;
if (events_since_last_incremental_state_reset_ >=
kMaxEventsBeforeIncrementalStateReset) {
ResetIncrementalState();
}
} }
void TrackEventThreadLocalEventSink::UpdateDuration( void TrackEventThreadLocalEventSink::UpdateDuration(
......
...@@ -65,6 +65,7 @@ class COMPONENT_EXPORT(TRACING_CPP) TrackEventThreadLocalEventSink ...@@ -65,6 +65,7 @@ class COMPONENT_EXPORT(TRACING_CPP) TrackEventThreadLocalEventSink
base::ThreadTicks last_thread_time_; base::ThreadTicks last_thread_time_;
int process_id_; int process_id_;
int thread_id_; int thread_id_;
int events_since_last_incremental_state_reset_ = 0;
base::trace_event::TraceEvent complete_event_stack_[kMaxCompleteEventDepth]; base::trace_event::TraceEvent complete_event_stack_[kMaxCompleteEventDepth];
uint32_t current_stack_depth_ = 0; 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